TAG_OVERLOAD consumed without length validation β zero-length overload option at the end of an options region reads one byte past the region and adopts an arbitrary overload value
| Field | Value |
|---|---|
| ID | DF-3046 |
| Status | new |
| Severity | Info |
| CVSS 3.1 | CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:N |
| CWE | CWE-125 / CWE-20 |
| File | sys/vfs/nfs/bootp_subr.c |
| Lines | 1283, 1299-1300, 1323-1332 |
| 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 | novel |
Summary
In bootpc_tag_helper the overload option's value is taken as
tctx->overload = *j with no check that its length byte is 1. Two
consequences: (1) a TAG_OVERLOAD with len != 1 sets the overload flag
from the first value byte regardless (RFC 2131 requires len==1); (2)
with len == 0 positioned so its length byte is the final byte of the
region, the guard admits it and *j reads one byte past the end of
the parsed region (for the vend walk the first byte past
struct bootp_packet's last member β still inside the parent kmalloc'd
ifctx allocation; for the file/sname walks it lands on adjacent
in-struct fields). The read value only steers which additional bounded
areas get re-walked β no leak, no corruption, no crash demonstrated.
Same netboot threat model as DF-0802. Fix: require len == 1 for
TAG_OVERLOAD (row diff).
Timeline
- 2026-09-02 Discovered during pass-2 audit of bootp_subr.c (GLM 5.3).
No comments yet.