{
  "finding_id": "DF-4429",
  "status": "untested",
  "attempts": 0,
  "reproduced": 0,
  "confidence": "certain",
  "impact": "Any local user in group video can mmap and read/write every other users radeon GEM buffer object (Xorg scanout contents, other users textures/uploads) by sweeping mmap offsets on /dev/dri/cardN: radeon_verify_access (radeon_ttm.c:234) is an unconditional return 0; the drm_vma_node_verify_access ownership check that upstream radeon and the in-tree sibling amdgpu_ttm.c:311-325 perform was dropped in this port. Kernel-internal BOs (ttm_bo_type_kernel) carry no vma node and are not exposed; ceiling is user GEM objects.",
  "verdict": "source-verified cross-user GPU memory access-control bypass; untested on the audit guest because it has no AMD GPU (no /dev/dri, bochs VGA only \u2014 env.txt). Full path traced: mmap(card) -> drm_mmap_single (drm_drv.c:1254, no auth check) -> ttm_bo_mmap_single (ttm_bo_vm.c:766) -> ttm_bo_mmap (ttm_bo_vm.c:447 verify_access==0) with best-match vma lookup (ttm_bo.c:1266 registers every user BO from page 2^20/4GiB up), node perms root:video 0660 (drmP.h:108).",
  "exploit_chain": [
    "victim (userA, video group): victim_bo.c creates 4MiB GTT BO, fills marker DF4429MARK",
    "attacker (userB, video group): poc_mmap_bo.c sweeps single-page mmap(fd,off>=4GiB) on the same card node \u2014 best-match lookup + verify_access==0 maps every live BO",
    "read marker from userB's dump => cross-user GPU memory disclosure; PROT_WRITE mapping gives symmetric corruption of userA's buffers"
  ],
  "evidence": "README.md (chain with path:line at every hop), VERDICT.md (full narrative + why guest-untestable), poc_mmap_bo.c + victim_bo.c (runnable on any radeon-equipped DFly box), env.txt (guest hardware absence proof), fix.diff (restores drm_vma_node_verify_access, mirrors amdgpu_ttm.c:311-325)",
  "kernel_refs": [
    "sys/dev/drm/radeon/radeon_ttm.c:234",
    "sys/dev/drm/radeon/radeon_ttm.c:849",
    "sys/dev/drm/radeon/radeon_ttm.c:882",
    "sys/dev/drm/ttm/ttm_bo_vm.c:447",
    "sys/dev/drm/ttm/ttm_bo.c:1266",
    "sys/dev/drm/amd/amdgpu/amdgpu_ttm.c:311",
    "sys/dev/drm/drm_drv.c:1254",
    "sys/dev/drm/drm_gem.c:471"
  ],
  "poc_changes": "authored fresh (no seed sketch). Compile-verified on the audit guest: needed -I/usr/src/sys/dev/drm/include/uapi -I/usr/src/sys/dev/drm/include -D__user= -D__kernel= for the uapi ioctls and <sys/mman.h> in victim_bo.c; all binaries build clean (build.log). Runtime blocked by hardware (no /dev/dri on guest).",
  "build_cmd": "cc -O2 -o poc_mmap_bo poc_mmap_bo.c && cc -O2 -o victim_bo victim_bo.c",
  "run_cmd": "./victim_bo (userA); ./poc_mmap_bo --read (userB) \u2014 needs radeon KMS hardware",
  "code_hash": "27059d29dc3ee5102315cfc74a32a8bba216972537b13da40974b492742f3e10 (poc_mmap_bo.c), f50e512fbc0bf1e911bb127c9976f405b762158046f17d785148381e631cf4c6 (victim_bo.c)",
  "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 x86_64 (no /dev/dri \u2014 radeon never attaches)",
  "runtime_sec": 0,
  "guest_dirty": 0,
  "notes": "Hardware-gated: audit QEMU guest has no AMD/ATI GPU (env.txt), following DF-4018/4019 sibling precedent (source-verified, untested). Only user-created GEM BOs exposed (ttm_bo.c:1269 \u2014 kernel BOs get no vma node), hence Medium not High. PoC sources shipped runnable for a maintainer with hardware.",
  "recommended_fix": "radeon_verify_access: return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp->private_data);",
  "fix_status": "not_testable",
  "fix_baseline_reproduced": 0,
  "fix_patched_reproduced": 0,
  "fix_verdict": "fix.diff restores the upstream ownership check exactly as the in-tree amdgpu driver does it (amdgpu_ttm.c:311-325); allow-side already exists (drm_gem.c:471). Cannot be compiled/loaded on the audit guest (no radeon hardware; module only attaches to real devices), so fix validation is not_testable here.",
  "fix_evidence": "fix.diff; VERDICT.md Fix validation section"
}