⬢ DragonFlyBSD Kernel Audit
DF-3697 / verdict.json
← back to finding ↓ download raw
{
  "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/."
}