DF-2938 / manifest.json
{ "verdict": "reproduced", "impact": "panic", "confidence": "certain", "finding": "DF-2938 OBJT_DEVICE device pager never pins the cdev: device teardown (destroy_dev) while a mapping persists -> use-after-free in old_dev_pager_fault (indirect call dev->si_ops->d_mmap through freed cdev) and old_dev_pager_dtor (KKASSERT + NULL write through freed cdev)", "reproduce": { "build": "sh setup.sh (in-guest: builds devuaf.ko via bsd.kmod.mk, plus trig/swap/status via cc)", "run": "sh /tmp/df2938/orch.sh 0 ; sh /tmp/df2938/orch.sh 1 (cpu arg selects the re-alloc cpu)", "expected": "stock: TRIG page1[0]='B' with STATUS last_a_dev==old_chunk (fault served through the destroyed cdev); on chunk re-use (reused=1, observed on cpu 1) the unprivileged munmap panics: assertion \"dev->si_object\" failed in old_dev_pager_dtor at device_pager.c:343. patched (fix.diff): reused always 0, no panic, clean munmap on all cpus." }, "kernel_refs": [ "sys/vm/device_pager.c:124", "sys/vm/device_pager.c:138-141", "sys/vm/device_pager.c:146-149", "sys/vm/device_pager.c:211", "sys/vm/device_pager.c:312-335", "sys/vm/device_pager.c:337-346", "sys/vm/device_pager.c:348-361", "sys/kern/kern_device.c:262-283", "sys/vm/vm_mmap.c:1363-1381", "sys/vm/vm_mmap.c:1478", "sys/dev/sound/pcm/dsp.c:2357", "sys/dev/sound/pcm/dsp.c:2505-2508", "sys/dev/sound/clone.c:420-434", "sys/bus/u4b/uvc/uvc_v4l2.c:763", "sys/bus/u4b/uvc/uvc_v4l2.c:783-784" ], "artifacts": [ "devuaf.c", "trig.c", "ctl.c", "setup.sh", "orch.sh", "run.log", "run.baseline-cpu1.log", "panic.txt", "fixed.0.log", "fixed.1.log", "fixed.2.log", "fixed.3.log", "fixed.4.log", "fixed.5.log", "env.txt", "fix.diff", "VERDICT.md", "manifest.json", "verdict.json" ] } |