DF-3697 / verdict.json
{ "finding_id": "DF-3697", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Source-certain, runtime-unreachable on this guest. gfx_v9_0_init_rlc_ext_microcode (gfx_v9_0.c:516-535) stores save_restore_list_{cntl,gpm,srm} = fw->data + raw u32 header offsets with sizes likewise unvalidated; amdgpu_ucode_validate in this tree only checks size_bytes==datasize, so a crafted self-consistent v2_1 RLC image (generator in this pack) yields a memcpy (amdgpu_ucode.c:381-394, via amdgpu_psp.c:428) of up to 4GiB from up to 4GiB past the firmware allocation into a GPU-mapped firmware BO sized from the same fields: OOB kernel-heap read / wild-pointer panic. Distinct from DF-1176 (v2_0 reg-list fields). The DragonFly 6.5-DEVELOPMENT guest ships amdgpu.ko (kldload verified) but has no AMD GPU (virtio-vga only), so the probe path never runs: honest not_reproduced, hardware absent.", "exploit_chain": "", "evidence": "VERDICT.md (full path trace with path:line); fwgen_craft_rlc.c + run.log (blob built and generated on guest cc 8.3, md5 c041dbf69d66c0007e2844fe18385c4a); env.txt (no vendor 0x1002 device, amdgpu.ko loads but binds nothing); fix.diff (offset+size<=datasize validation)", "kernel_refs": [ "sys/dev/drm/amd/amdgpu/gfx_v9_0.c:516", "sys/dev/drm/amd/amdgpu/gfx_v9_0.c:524", "sys/dev/drm/amd/amdgpu/gfx_v9_0.c:528", "sys/dev/drm/amd/amdgpu/gfx_v9_0.c:532", "sys/dev/drm/amd/amdgpu/gfx_v9_0.c:715", "sys/dev/drm/amd/amdgpu/gfx_v9_0.c:776", "sys/dev/drm/amd/amdgpu/amdgpu_ucode.c:381", "sys/dev/drm/amd/amdgpu/amdgpu_ucode.c:251", "sys/dev/drm/amd/amdgpu/amdgpu_psp.c:428" ], "poc_changes": "n/a (finding + generator authored fresh in this run; no seed PoC existed)", "attempts": 1, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT DragonFly 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": 60, "guest_dirty": 0, "build_cmd": "cc -O2 -o fwgen_rlc fwgen_craft_rlc.c", "run_cmd": "./fwgen_rlc", "code_hash": "cd4d5cf6051f25045aac1ba936db01a4c9ab19c4a6726d1c7752098323416179", "notes": "code_hash = sha256 of fwgen_craft_rlc.c. Guest: amdgpu.ko present and kldloadable ([drm] amdgpu kernel modesetting enabled.), no device binds -> parse path unreachable. Same malicious-firmware threat model as pass-1 DF-1176/1177/1178 (all Medium). Sink is a read, not a write: dest BO sized from same unvalidated fields.", "recommended_fix": "Validate save_restore_list_{cntl,gpm,srm} offset+size against rlc_fw->datasize in gfx_v9_0_init_rlc_ext_microcode and fail init_microcode on violation (see fix.diff).", "fix_status": "not_tested", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff authored post-verification against the read-only sys/ tree; cannot be runtime-validated on this guest (no AMD hardware to bind the driver).", "fix_evidence": "fix.diff in this pack; not applied to sys/." } |