DF-3209 / verdict.json
{ "finding_id": "DF-3209", "status": "untested", "reproduced": 0, "impact": "leak", "confidence": "certain", "verdict": "xdr_string_encode() allocates its request mbuf without M_ZERO, copies only the strlen(path) payload bytes, but sets m_len to the 4-byte-padded XDR length and transmits it via sosend(); the 1-3 stale kernel-heap pad bytes after every non-4-aligned path string leak to the mountd/NFS server and any on-path LAN observer. Proven by inspection (krpc_subr.c:466-477, mbuf.h m_getl flags=0 path); not runtime-testable because the only callers are the #if BOOTP||NFS_ROOT boot-mount RPCs (nfs_mountrpc.c:143,160,245) and the audit guest boots from disk, so nfs_mountroot never executes \u2014 same boot-path ceiling as DF-3203/3204/3205.", "exploit_chain": "", "evidence": "findings/poc/DF-3209/VERDICT.md (6-step path:line proof); decisive lines: krpc_subr.c:472 (m_getl flags=0, no M_ZERO), :474 (m->m_len=mlen includes pad), :476 (bcopy of only len bytes), mbuf.h:584-602 (m_getl->m_get does not zero); callers nfs_mountrpc.c:143,160,245", "kernel_refs": [ "sys/vfs/nfs/krpc_subr.c:466", "sys/vfs/nfs/krpc_subr.c:472", "sys/vfs/nfs/krpc_subr.c:474", "sys/vfs/nfs/krpc_subr.c:476", "sys/vfs/nfs/nfs_mountrpc.c:143", "sys/vfs/nfs/nfs_mountrpc.c:160", "sys/vfs/nfs/nfs_mountrpc.c:245", "sys/sys/mbuf.h:584" ], "poc_changes": "none \u2014 seed sketch not executable: builder only runs on the boot path; verdict derived from source arithmetic (dlen=(len+3)&~3 vs bcopy len) plus verified m_getl non-zeroing semantics", "attempts": 0, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 (X86_64_GENERIC; hammer2 disk root \u2014 boot path compiled in via NFS_ROOT at sys/config/X86_64_GENERIC:29 but never executed)", "runtime_sec": 0, "guest_dirty": 0, "build_cmd": "", "run_cmd": "", "code_hash": "", "notes": "Boot-path-only disclosure (0-3 stale heap bytes per boot RPC, <=3 requests per boot). Enum constraint: not_testable is not a legal poc status, hence untested with the ceiling documented here and in VERDICT.md. Guest checked live: nfs_mountroot unreachable on disk-root boot; no runtime syscall path reaches the static nfs_mountdiskless->md_mount chain.", "recommended_fix": "bzero the XDR pad tail in xdr_string_encode (bcopy(str, xs->data, len); bzero(xs->data+len, dlen-len)) or allocate with M_ZERO" } |