β¬’ DragonFlyBSD Kernel Audit
← triage Β· dashboard
DF-3464

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)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-3464 Β· 4 files
FileTypeDescriptionSize
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_testable

fix.diff applied in the F40FIX verification kernel build (RC=0, zero -Werror errors); no runtime A/B for this item (line-certain hardening)

↓ fix.diffper-fix-DF-3464

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.