DF-2939 / verdict.json
{ "finding_id": "DF-2939", "status": "not_reproduced", "reproduced": 0, "impact": "panic", "confidence": "likely", "verdict": "Line-accurate confirmation; no trigger surface on this guest. dev_pager_dealloc runs cdev_pg_dtor (device_pager.c:211) BEFORE taking dev_pager_mtx and unlinking (:213-215); old_dev_pager_dtor does KKASSERT(dev->si_object) then dev->si_object = NULL unlocked (:343); cdev_pager_allocate sets dev->si_object under the mutex (:146-149) - the clobber window is real. But the old pager is only used by legacy d_mmap devices, and the guest has none (only nvmm with .d_mmap = nommap; no DRM/vga). Window is a few instructions wide even where devices exist. Fix (move si_object bookkeeping under dev_pager_mtx after unlist, conditional on identity) compiled into the fix-all kernel.", "exploit_chain": "", "evidence": "source ordering: device_pager.c:211 vs :213-215 vs :146-149 vs :343", "kernel_refs": [ "sys/vm/device_pager.c:211", "sys/vm/device_pager.c:146", "sys/vm/device_pager.c:343" ], "poc_changes": "no legacy d_mmap device present on guest", "attempts": 0, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT DragonFly 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:04 UTC 2026 root@dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64", "runtime_sec": 0, "guest_dirty": 0, "build_cmd": "(none)", "run_cmd": "(none)", "code_hash": "", "notes": "INVARIANTS-only KKASSERT panic ceiling; production behavior benign bookkeeping loss", "recommended_fix": "si_object bookkeeping under dev_pager_mtx after unlist (conditional == object clear)", "fix_status": "not_testable", "fix_verdict": "compile-validated in fix-all kernel" } |