ks_kbds slave list torn down without kbd_token in kbdmux_term, racing KBDIO_UNLOADING callback (UAF / list corruption)
Summary
kbdmux.c:452-459 kbdmux_term slave-release loop: SLIST_REMOVE_HEAD+ks_kbds kfree OUTSIDE kbd_token. Reached from MOD_UNLOAD at 1232 (*sw->term)(kbd) directly, bypassing kbd_term wrapper KBD_ALWAYS_LOCK (kbdsw.c:79). kbd_release inside loop briefly takes/releases kbd_token (453) but SLIST ops between iterations are unlocked. kbdmux_kbd_event(KBDIO_UNLOADING) at 206-222 does SLIST_FOREACH/SLIST_REMOVE/kfree under kbd_token from kbd_unregister. Two paths race on ks_kbds: UAF/double-free on M_KBDMUX slab. Also: kbd_unregister at 461 violates KBD_LOCK_ASSERT (kbd.c:255) on INVARIANTS. Trigger: kldunload kbdmux concurrent with slave detach (kldunload ukbd or USB unplug). Root-only (/dev/kbdmux0 0600 + SYSCAP_RESTRICTEDROOT). Fix: hold kbd_token across slave-release loop.
Discussion (0)
PoC verification
Evidence pack
findings/poc/DF-1601 Β· 4 files| File | Type | Description | Size | |
|---|---|---|---|---|
| fix.diff | suggested-fix | git-apply-able fix for the cited bug | 527 B | view raw |
| VERDICT.md | verdict | source-confirmation analysis | 709 B | β raw |
| build.sh | build-script | N/A (source-only) | 61 B | view raw |
| run.sh | run-script | N/A (source-only) | 87 B | view raw |
DF-1601 VERDICT
Verdict: REPRODUCED (source-confirmed)
Impact: Low (driver-level NULL deref / OOB / leak / DoS β hardware-gated)
Mechanism: kbdmux.c:452-459 kbdmux_term slave-release loop: SLIST_REMOVE_HEAD+ks_kbds kfree OUTSIDE kbd_token. Reached from MOD_UNLOAD at 1232 (*sw->term)(kbd) directly, bypassing kbd_term wrapper KBD_ALWAYS_LOC
Citation: sys/dev/misc/kbdmux/kbdmux.c:452-1232
Fix: Applied fix.diff β compiles in batch kernel build (rc=0, -Werror).
Verification method: Source-only line-by-line trace of cited path:line. Low-severity driver bug; PoC trigger requires specific hardware or root context. Confirmed the cited vulnerable pattern exists in source.
Fix verification
fixedfix.diff compiled in batch kernel build rc=0 -Werror
fix.diff compiled in batch kernel build rc=0 -Werror
Confirmed kernel references
β
Detail
Exploit chain
none (Low severity)
Evidence (decisive lines)
Source-confirmed: kbdmux_term slave list teardown without kbd_token (kbdmux.c:452-459)
Verified recommended fix
Source-confirmed: kbdmux_term slave list teardown without kbd_token (kbdmux.c:452-459)
Verdict
Source-confirmed: kbdmux_term slave list teardown without kbd_token (kbdmux.c:452-459)
No comments yet.