DF-4413 / verdict.json
{ "finding_id": "DF-4413", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Partial-commit bug certain by trace: radeon_vm_bo_set_addr() inserts the mapping into vm->va/vm->cleared (radeon_vm.c:519-526) before the PT loop, and the error returns at radeon_vm.c:554-560 leave it there with vm->page_tables[pt_idx].bo == NULL; the next update (GEM_VA UNMAP cleanup, CS reloc, eviction invalidate) walks radeon_vm_update_ptes() which dereferences pt->tbo.resv at radeon_vm.c:833 with pt==NULL -> kernel panic. The audit guest has no radeon GPU (/dev/dri absent, std VGA) so the panic cannot be triggered at runtime; trigger compiles and runs, exits at open()=ENOENT (run.log). Analysis-classified impact: local kernel panic/DoS from an unprivileged DRI client (Medium).", "exploit_chain": "", "evidence": "VERDICT.md (commit-before-alloc trace + three crash sinks); run.log (device-absent); fix.diff (rollback on failure)", "kernel_refs": [ "sys/dev/drm/radeon/radeon_vm.c:519", "sys/dev/drm/radeon/radeon_vm.c:554", "sys/dev/drm/radeon/radeon_vm.c:828", "sys/dev/drm/radeon/radeon_vm.c:833", "sys/dev/drm/radeon/radeon_gem.c:586", "sys/dev/drm/radeon/radeon_cs.c:527" ], "poc_changes": "kernel uapi include replaced by self-contained radeon_abi.h (uapi chain broken for userspace on DFly)", "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": 10, "guest_dirty": 1, "build_cmd": "cc -O2 -Wall -o /tmp/trigger_nullpt DF-4413/trigger_nullpt.c", "run_cmd": "/tmp/trigger_nullpt", "code_hash": "19448245241569cf36ad1f026e2121239721b54bdb0316104c82999e7a495988", "notes": "Deterministic postcondition once PT allocation fails under memory pressure (VRAM+GTT exhaustion beats TTM eviction). The cleanup GEM_VA UNMAP of the failed mapping is itself a trigger.", "recommended_fix": "Roll the mapping back out of vm->va/vm->cleared before returning the allocation error", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix validation impossible on this guest (no radeon GPU; bug not triggerable). fix.diff adds an error_rollback path that removes the committed interval under the proper locks.", "fix_evidence": "fix.diff (error_rollback: interval_tree_remove + status_lock-protected reset)" } |