{
  "finding_id": "DF-3860",
  "status": "not_reproduced",
  "reproduced": 0,
  "impact": "none",
  "confidence": "certain",
  "verdict": "Source-certain heap OOB read: amdgpu_device_parse_gpu_info_fw (amdgpu_device.c:1375-1396) builds its payload pointer from hdr->ucode_array_offset_bytes, a raw u32 in the firmware file, after amdgpu_ucode_validate (amdgpu_ucode.c:251-260) has checked ONLY fw->datasize == hdr->size_bytes; a 36-byte crafted amdgpufw_<asic>_gpu_info with offset 0x7fff0000 passes validation and makes the kernel read 60 bytes ~2GB past the firmware allocation; parsed values (incl. max_shader_engines/max_sh_per_se, unclamped) land in adev->gfx.config/cu_info and are returned to unprivileged userspace via the AMDGPU_INFO ioctl, feeding the DF-3698 walker family. Not reproducible on the audit guest: it has no AMD GPU (pciconf shows a single virtio display device; /dev/dri absent), so the probe-time parse never executes. Hardware-gated; crafted-firmware precondition (same threat model as DF-1256/DF-3698).",
  "exploit_chain": "plant amdgpufw_vega10_gpu_info with ucode_array_offset_bytes aimed at a groomed neighbor slab -> probe-time 60-byte OOB read -> values disclosed to any render-node user via AMDGPU_INFO cu_info -> heap layout info; oversized SE/SH counts additionally trigger the DF-3698 cu_info[4][4] OOB-write consumers",
  "evidence": "VERDICT.md (source trace + gating); make_gpuinfo_fw.py + build.log (crafted file passing validate: datasize==size_bytes==36, offset 0x7fff0000); run.log + env.txt (no AMD GPU on guest)",
  "kernel_refs": ["sys/dev/drm/amd/amdgpu/amdgpu_device.c:1354", "sys/dev/drm/amd/amdgpu/amdgpu_device.c:1361", "sys/dev/drm/amd/amdgpu/amdgpu_device.c:1375", "sys/dev/drm/amd/amdgpu/amdgpu_device.c:1379", "sys/dev/drm/amd/amdgpu/amdgpu_device.c:1396", "sys/dev/drm/amd/amdgpu/amdgpu_ucode.c:251"],
  "poc_changes": "authored from scratch: header layout matched to real struct common_firmware_header (amdgpu_ucode.h) after first draft used a wrong 28-byte layout",
  "attempts": 1,
  "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 root@dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64",
  "runtime_sec": 8,
  "guest_dirty": 0,
  "build_cmd": "./build.sh",
  "run_cmd": "./run.sh",
  "code_hash": "ca7c8b48e0f03cdbef15180272e3e7eab1233d18ac2858538f7fca5631c7ca98",
  "notes": "Guest reset (vm.sh reset with-src) after env probing; uname from pre-reset session, same snapshot. kldload amdgpu on guest loads module but binds nothing.",
  "recommended_fix": "In amdgpu_device_parse_gpu_info_fw, require datasize >= sizeof(*hdr) and offset+sizeof(gpu_info_firmware_v1_0) <= datasize before reading, and clamp max_shader_engines/max_sh_per_se to 4 (DF-3698 consumers)",
  "fix_status": "not_testable",
  "fix_baseline_reproduced": 0,
  "fix_patched_reproduced": 0,
  "fix_verdict": "fix.diff adds header-size and payload-range validation plus SE/SH clamps at parse time; git apply --check clean against sys/; cannot be exercised on this guest (no AMD GPU)",
  "fix_evidence": "findings/poc/DF-3860/fix.diff"
}
