⬢ DragonFlyBSD Kernel Audit
DF-4838 / verdict.json
← back to finding ↓ download raw
{
  "finding_id": "DF-4838",
  "status": "untested",
  "reproduced": 0,
  "impact": "none",
  "confidence": "certain",
  "verdict": "The DragonFly MMU-notifier shim (sys/dev/drm/include/linux/mmu_notifier.h) is inert type scaffolding with no registration API and no VM-side callers, amdgpu_mn.c is absent from the amdgpu module SRCS (and cannot compile as-is: __mmu_notifier_register is undeclared anywhere and amdgpu_mn_ops initializes a nonexistent .invalidate_range_end member), CONFIG_MMU_NOTIFIER is never defined so amdgpu_mn.h compiles -ENODEV/NULL/no-op stubs, and amdgpu_gem_userptr_ioctl unconditionally returns -EINVAL with its body #if 0-ed. The feared GPU writes to revoked user memory primitive therefore has no object to operate on as shipped (verified on the guest: /boot/kernel/amdgpu.ko contains 0 amdgpu_mn symbols and the not implemented stub string). Latent: enabling the file without a real VM notifier implementation (the DF-4819 dead-shrinker pattern) plus the stripped-from-upstream struct amdgpu_mn.kref (amdgpu_mn_get returns hash hits unrefcounted) would yield missed-invalidation DMA and a p->mn UAF.",
  "exploit_chain": "",
  "evidence": "findings/poc/DF-4838/run.log (guest: nm amdgpu.ko grep -c amdgpu_mn = 0; kconfig grep count 0; Makefile grep rc=1; stub string present; aac.ko likewise debug-free); VERDICT.md full path:line chain; static_check.sh runnable re-proof",
  "kernel_refs": [
    "sys/dev/drm/include/linux/mmu_notifier.h:36",
    "sys/dev/drm/amd/amdgpu/amdgpu_mn.c:416",
    "sys/dev/drm/amd/amdgpu/amdgpu_mn.c:132",
    "sys/dev/drm/amd/amdgpu/amdgpu_mn.c:356",
    "sys/dev/drm/amd/amdgpu/amdgpu_mn.c:72",
    "sys/dev/drm/amd/amdgpu/amdgpu_mn.c:397",
    "sys/dev/drm/amd/amdgpu/amdgpu_mn.h:37",
    "sys/dev/drm/amd/amdgpu/amdgpu_mn.h:52",
    "sys/dev/drm/amd/amdgpu/amdgpu_gem.c:285",
    "sys/dev/drm/amd/amdgpu/amdgpu_cs.c:1222",
    "sys/dev/drm/radeon/Makefile:107"
  ],
  "poc_changes": "n/a \u2014 absence proof, no seeded PoC to repair; static_check.sh + guest run.log authored fresh",
  "attempts": 0,
  "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": 38,
  "guest_dirty": 0,
  "build_cmd": "sh findings/poc/DF-4838/static_check.sh",
  "run_cmd": "dfbsd-qemu/vm.sh run_root nm /boot/kernel/amdgpu.ko | grep -c amdgpu_mn; strings /boot/kernel/amdgpu.ko | grep amdgpu_gem_userptr_ioctl",
  "code_hash": "c675fef8614c4f5ef5d4c99767c9866fd91a377db2758623f9ec577c34490840",
  "notes": "Info by policy (DF-4586 i915 sibling precedent: same family, userptr creation closed, impact none as shipped). Verification skipped per contract for Info findings; static+binary absence proof recorded instead. Guest left clean (no module loads, no dirt).",
  "recommended_fix": "Keep userptr closed until sys/vm gains real MMU-notifier hooks; restore upstreams struct amdgpu_mn.kref (kref_get on the amdgpu_mn_get hash hit) per fix.diff; document the inert shim at amdgpu_mn.hs stub branch.",
  "fix_status": "not_testable",
  "fix_baseline_reproduced": 0,
  "fix_patched_reproduced": 0,
  "fix_verdict": "No runtime defect to A/B on the shipped kernel (code is compiled out); fix.diff restores upstream kref parity and adds an explicit warning so the dead path cannot be silently re-enabled against the inert shim.",
  "fix_evidence": "findings/poc/DF-4838/fix.diff (sha256 90ab0086a130b350e784ae630c4bee8fc7a08e1615d827c5fb69c57d45958b85), authored against read-only sys/, never applied"
}