DF-4543 / verdict.json
{ "finding_id": "DF-4543", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "likely", "verdict": "Device-lifecycle defect verified by code trace but not exercisable on the audit guest: /dev/agpgart is created with hardcoded minor 0 and name agpgart (agp.c:240-242) while agp_free_cdev removes by device_get_unit (agp.c:248-251), and dev_ops_remove_minor matches by minor (kern_device.c) so for unit != 0 the node survives detach with dangling si_drv1; independently, destroy_dev only unlinks + drops link refs (devfs_core.c:1440-1463) so an open fd keeps the cdev (and si_drv1) alive past softc free, making later ioctl/mmap/close a UAF (agp.c:777/792/818/857). Guest liveness probe (run.log): /dev/agpgart absent, no AGP PCI capability on any of the 7 devices, bochs VGA only - the attach path never runs, and stock X86_64_GENERIC compiles agp in so no kldunload exists. Root-only trigger (0600 root:wheel node) on top of the hardware gate, so impact ceiling is a privileged UAF (robustness), not unpriv escalation.", "exploit_chain": "", "evidence": "run.log (ls /dev/agpgart -> ENOENT; pciconf -lc | grep -i agp -> empty; vgapci0 chip=0x11111234 bochs VGA); VERDICT.md section Code trace with path:line for each mechanism step; fix.diff for the proposed guard.", "kernel_refs": [ "sys/dev/agp/agp.c:240", "sys/dev/agp/agp.c:242", "sys/dev/agp/agp.c:248", "sys/dev/agp/agp.c:250", "sys/dev/agp/agp.c:777", "sys/dev/agp/agp.c:792", "sys/dev/agp/agp.c:818", "sys/dev/agp/agp.c:857", "sys/kern/kern_device.c", "sys/vfs/devfs/devfs_core.c:1440", "sys/config/X86_64_GENERIC:170" ], "poc_changes": "No seed PoC existed; authored a liveness probe (poc_agp_liveness.sh) to prove the attack surface is absent on this guest rather than claim a false run.", "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": 18, "guest_dirty": 0, "build_cmd": "n/a (nothing buildable: no AGP hardware, /dev/agpgart does not exist on guest)", "run_cmd": "findings/poc/DF-4543/run.sh (vm.sh run_root liveness probe)", "code_hash": "e8b0b867c7c130751cdc06f84ced74f84c252bc6662fec911b7b2be73809aa90", "notes": "Hardening/robustness class finding (Low): root-triggerable UAF gated on AGP hardware + module-built agp or PCI hot-removal. Not among known DF-1685/1686/1687/1688/2397/2398/2399/2400 (none covers attach/detach lifecycle or the free_cdev unit-vs-minor mismatch). Guest left clean (probe was read-only).", "recommended_fix": "Guard agp_free_cdev with sc->as_isopen (return EBUSY, propagate from all chip detaches) and destroy the stored as_devnode via destroy_dev() instead of dev_ops_remove_minor(device_get_unit).", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff authored against the read-only sys/ tree but not buildable/testable on this guest: no AGP hardware means the agp driver never attaches, so neither baseline nor patched lifecycle can be driven. Baseline badness is established by code trace (VERDICT.md), not runtime.", "fix_evidence": "fix.diff (agppriv.h + agp.c + agp_via.c + agp_sis.c + agp_amd64.c + intel-gtt.c hunks); no fix_build.log/fix_run.log because no kernel with the agp lifecycle reachable can run on this QEMU guest." } |