Action registry index validation is one-sided: ieee80211_{send,recv}_action_register() accept negative act (OOB write below the function-pointer tables) and the send dispatch accepts negative act (OOB function-pointer read + indirect call)
Summary
Both registration helpers check only 'act >= nitems(table)' before writing table[act] = f - a negative int act passes and writes a function pointer below the table. The dispatch side guards only 'act < nitems(table)' so a negative act reads a function pointer from below the table and tail-calls it. On-air frames cannot supply negative values (ia_action uint8_t and bounded), every in-tree caller passes small non-negative constants - a kernel-internal API contract hazard, not reachable today: one future caller forwarding user/ioctl-influenced act turns the register path into a controlled-index kernel OOB write and the send path into an OOB indirect call. Fix: reject negative act in both register helpers and the send dispatch. [VERIFIED pass2: one-sided act bounds confirmed at all sites; negative act unreachable uint8 constants; two-sided checks compiled]
Discussion (0)
PoC verification
Evidence pack
findings/poc/DF-3464 Β· 4 files| File | Type | Description | Size | |
|---|---|---|---|---|
| README.md | β | 244 B | β raw | |
| fix.diff | β | 2.9 KB | view raw | |
| manifest.json | β | 442 B | view raw | |
| verdict.json | β | 1.7 KB | view raw |
DF-3464 evidence pack
What
ieee80211 action registry index checks are one-sided (negative act OOB)
Verdict
status=not_reproduced impact=none confidence=certain
See VERDICT.md for the full narrative and fix.diff for the verified fix.
Fix verification
not_testablefix.diff applied in the F40FIX verification kernel build (RC=0, zero -Werror errors); no runtime A/B for this item (line-certain hardening)
Confirmed kernel references
Detail
Evidence (decisive lines)
VERDICT.md with path:line citations; run.log where a live demo exists; fix.diff
PoC changes
n/a - no negative-act caller exists
Verified recommended fix
two-sided act bounds in send/recv register helpers and the send dispatch
Verdict
Line-accurate confirmation of all three sites (register at ieee80211_action.c:83-115 checks only act >= nitems() - a negative int act writes a function pointer BELOW the table; the send dispatch at :127-152 checks only act < nitems() - a negative act reads+tail-calls below the table; recv_action_register mirrors the register shape at :182-215). No runtime demonstration: on-air frames cannot supply negative values (ia_action is uint8_t and bounded) and every in-tree caller passes small constants - this is a kernel-internal API contract hazard. Fix adds two-sided checks at all sites; compiled in the F40FIX build.
No comments yet.