⬢ DragonFlyBSD Kernel Audit
DF-3438 / verdict.json
← back to finding ↓ download raw
{
  "finding_id": "DF-3438",
  "status": "untested",
  "reproduced": 0,
  "impact": "none",
  "confidence": "speculative",
  "verdict": "Info/hardening, not exercised (guest has no 802.11 radio, so cipher keys cannot be installed against a real cipher module). Code walk: ieee80211_crypto_unregister (ieee80211_crypto.c:213-228) clears ciphers[cip] with the in-code admission XXX disallow if references - no reference accounting exists; the policy-module unload gate (_IEEE80211_POLICY_MODULE, ieee80211_dragonfly.h:250-262) checks the cipher modules nrefs unsynchronized against the nrefs++ the cipher performs in ic_attach under the key-update lock (ieee80211_crypto_ccmp.c:115). kldunload wlan_ccmp racing a CCMP key install can unlink the module while key->wk_cipher still points into it; subsequent ic_encap/ic_decap/ic_detach calls through that key jump into unmapped module text (UAF). Both trigger sides are root-gated; the window is narrow; severity Info for triage but the consequence is a kernel UAF.",
  "exploit_chain": "",
  "evidence": [
    "README.md: path:line walk (unregister vs attach/nrefs)"
  ],
  "kernel_refs": [
    "sys/netproto/802_11/wlan/ieee80211_crypto.c:194",
    "sys/netproto/802_11/wlan/ieee80211_crypto.c:213",
    "sys/netproto/802_11/wlan/ieee80211_crypto.c:227",
    "sys/netproto/802_11/ieee80211_dragonfly.h:250",
    "sys/netproto/802_11/wlan_ccmp/ieee80211_crypto_ccmp.c:115"
  ],
  "poc_changes": "",
  "attempts": 0,
  "guest_uname": "",
  "runtime_sec": 0,
  "guest_dirty": 0,
  "build_cmd": "",
  "run_cmd": "",
  "code_hash": "",
  "notes": "Fix the codes own TODO: per-cipher reference count taken in ic_attach and dropped in ic_detach, checked under the wlan serialization in ieee80211_crypto_unregister / the module unload gate.",
  "recommended_fix": "Add reference counting to the cipher registry so unregister/unload is refused while keys are bound to the cipher."
}