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

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)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-1601 Β· 4 files
FileTypeDescriptionSize
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
VERDICT.md verdict source-confirmation analysis
↓ download 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

fixed
baseline reproduced→ patch + rebuild →patched clean

fix.diff compiled in batch kernel build rc=0 -Werror

fix.diff compiled in batch kernel build rc=0 -Werror
↓ fix.diffcombined build rc=0

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)