BOOTP/DHCP reply acceptance has zero origin validation and a fully deterministic transaction XID β spoofed reply gives same-L2 attacker total control of the diskless client (root/swap NFS server, hostname, default route)
| Field | Value |
|---|---|
| ID | DF-3044 |
| Status | new |
| Severity | Medium |
| CVSS 3.1 | CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-345 / CWE-330 |
| File | sys/vfs/nfs/bootp_subr.c |
| Lines | 595-642, 807, 838-848, 1142-1148, 1487, 1538, 1644-1666 |
| Area | vfs/nfs (netboot) |
| Confidence | certain |
| Discovered | 2026-09-02 |
| Pass | 2 (GLM 5.3 second pass) |
| Bucket | base:vfs |
| Reported | pending |
| Known CVE | none |
| CVE match | variant (RFC 2131 Β§7 acknowledged gap; no RFC 3118) |
| Reported | pending |
Summary
The diskless-boot DHCP/BOOTP client accepts any UDP datagram landing on its unconnected *:68 socket as a valid reply. The entire acceptance test is xid==call.xid, hlen==, and bcmp(chaddr); soreceive is called with a NULL name so the source address and port are never inspected, and there is no giaddr/siaddr sanity check. Worse, the transaction id has zero entropy: gctx->xid is the constant 0xFFFF0000, advanced deterministically by 0x100 per interface and +1 per recompose, so an attacker can compute the exact XID of every query the client will ever send without ever seeing a packet. The only de-facto secret is the client MAC, which is broadcast in every DISCOVER on the local link. A same-L2 attacker races the legitimate server with a crafted OFFER/ACK, and the client then takes yiaddr/siaddr as its identity, mounts root (and optionally swap) from the attacker-chosen NFS server via md_mount, sets the attacker's hostname and default route β the client's entire operating system is supplied by the attacker: full pre-auth compromise of the netboot machine. This is the documented netboot threat model (RFC 2131 Β§7, no RFC 3118 authentication implemented) and DF-0802 already accepts the same-L2 attacker premise for its panics β but the deterministic XID plus absent source-port/address check removes even the weak off-link bar a randomized XID would have kept. Severity Medium: requires the non-default 'options BOOTP' diskless configuration (LINT64 only, absent from X86_64_GENERIC) and an adjacent attacker, but under that config impact is total client compromise β strictly worse than DF-0802's DoS. Not guest-testable (PXE harness; the audit guest boots from disk). Fix: karc4random() xid seed + require reply source port 67 (row diff).
Timeline
- 2026-09-02 Discovered during pass-2 audit of bootp_subr.c (GLM 5.3). DF-0802 re-verified, not re-reported (six panic consumers; the tag walk proven sound post-fix-analysis).
No comments yet.