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

One-sided bound checks in the ratectl registry: ieee80211_ratectl_register/unregister/set accept negative type (OOB access below the ratectls[] function-pointer table); currently unreachable β€” all call sites pass constants

Summary

register/unregister/set check only 'type >= IEEE80211_RATECTL_MAX'; a negative type indexes below ratectls[]/ratectl_mod_names[] - in set() that is an OOB read of a function-pointer table stored into vap->iv_rate and then indirectly called. No reachable path today (no IEEE80211_IOC_RATECTL ioctl exists in DF's net80211; every caller passes a compile-time constant). Hardening to mirror the DF-3464 family fix. Fix: two-sided bound checks at all three sites. [VERIFIED pass2: one-sided type bounds confirmed; negative type unreachable constants; type-lt-0 guards compiled]

Discussion (0)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-3471 Β· 4 files
FileTypeDescriptionSize
README.md β€” 236 B ↓ raw
fix.diff β€” 867 B view raw
manifest.json β€” 391 B view raw
verdict.json β€” 1.5 KB view raw

DF-3471 evidence pack

What

ratectl registry index checks are one-sided (negative type 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-3471

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 - all call sites pass constants

Verified recommended fix

type < 0 guards in register/unregister/set

Verdict

Line-accurate confirmation: ieee80211_ratectl_register/unregister (ieee80211_ratectl.c:57-73) and ieee80211_ratectl_set (:135+) check only type >= IEEE80211_RATECTL_MAX; a negative type indexes below ratectls[]/ratectl_mod_names[] and set() stores the OOB-read function pointer into vap->iv_rate for later indirect call. Unreachable today (no IEEE80211_IOC_RATECTL ioctl exists in DFs net80211; every caller passes a compile-time constant). Fix adds type < 0 guards at all three sites; compiled in the F40FIX build.