DF-5358 / manifest.json
{ "verdict": "reproduced", "impact": "panic", "confidence": "certain", "finding_id": "DF-5358", "title": "pc64 kvm_access_check() residency gate built on pmap_kextract() which validates no paging level: /dev/kmem read at ungrown KVA page-faults the validator (kernel panic); PTE-empty queries return (va & PAGE_MASK) garbage instead of 0", "kernel_refs": [ "sys/platform/pc64/x86_64/vm_machdep.c:1276", "sys/platform/pc64/x86_64/vm_machdep.c:1284", "sys/platform/pc64/x86_64/vm_machdep.c:1285", "sys/platform/pc64/x86_64/pmap.c:1865", "sys/platform/pc64/x86_64/pmap.c:1872", "sys/platform/pc64/x86_64/pmap.c:1884", "sys/kern/kern_memio.c:257", "sys/kern/kern_memio.c:266", "sys/kern/kern_memio.c:285", "sys/vm/vm_kern.c:494", "sys/vm/pmap.h:249" ], "reproduce": { "build": "guest root, /root/df5358: printf 'KMOD=\\tpmxtest\\nSRCS=\\tpmxtest.c\\n.include <bsd.kmod.mk>\\n' > Makefile && make && cc -O2 -o pmx_user pmx_user.c", "run": "guest root: kldload ./pmxtest.ko ; ./pmx_user 0xfffff80140000000 8 # absent-PDPT KVA probed by the module on this guest", "expected": "Stock: Fatal trap 12, Stopped at pmap_kextract.part.23+0x16 (movq (%rax,%rdx,1),%rdx), fault VA = recursive-map PDE-slot address, guest DOWN in DDB; module also prints pmap_kextract(va+0x30)=0x30 for a PT-present/PTE-0 hole. Patched (fix.diff): pread returns -1/EFAULT, guest up; unaligned PTE-0 extract returns 0." }, "artifacts": [ "pmxtest.c", "pmx_user.c", "Makefile-in-build.sh", "build.sh", "run.sh", "build.log", "fix_build.log", "build.tail.log", "run.log", "panic.txt", "fix_run.log", "run.fixed.log", "env.txt", "fix.diff", "VERDICT.md", "manifest.json", "verdict.json" ] } |