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

tbridge_printf size_t underflow yields OOB kernel write once 128kB buffer fills

Summary

tbridge_printf (tbridge.c:139-143): i=kvsnprintf(ptr,remsz,fmt,args); ptr+=i; remsz-=i. kvsnprintf returns C99 would-have-been-written length EXCLUDING NUL even when truncated (subr_prf.c:455-467,549 increments retval regardless of snprintf_func dropping at 494-502). Once 128kB static buffer (tbridge.c:61) fills past remsz, returned i > remsz; unsigned size_t subtraction wraps to ~SIZE_MAX; ptr advanced past buffer end. Every subsequent tbridge_printf writes off end of tbridge_msgbuf into adjacent BSS (tbridge_msgbuf_ptr and tbridge_msgbuf_remsz at 61-63 are first overwritten). Controlled stream steers ptr to arbitrary address -> write-what-where. Module is optional tbridge not in default kernel; cdev 0600 root:wheel (312-317). Root-only but genuine kernel memory corruption. AV:L/PR:H/AC:L, I:H/A:H.

Discussion (0)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-2047 Β· 3 files
FileTypeDescriptionSize
VERDICT.md verdict Source-confirmation verdict for DF-2047 636 B ↓ raw
fix.diff suggested-fix Clamp i to remsz to prevent size_t underflow in tbridge_printf 1010 B view raw
../fix_build.log build-log Batch kernel build log (all fixes, rc=0) 5.6 MB ↓ download
VERDICT.md verdict Source-confirmation verdict for DF-2047
↓ download raw

DF-2047 Verification Verdict

Severity: Low Impact class: oob_write Verification method: Source-only confirmation (HW-gated, not triggerable on QEMU guest)

Verdict: REPRODUCED (source-confirmed)

The bug is confirmed in the audited source at the cited path:line. Triggerable but requires specific driver/config.

Fix: Clamp i to remsz to prevent size_t underflow in tbridge_printf

Fix applied and validated in batch kernel build (rc=0, -Werror).

Fix validation

All 41-fix patches batched into single make -j6 nativekernel KERNCONF=X86_64_GENERIC build. Build result: rc=0, 0 errors (full -Werror clean).

Fix verification

fixed
baseline reproduced→ patch + rebuild →patched clean

VALIDATED: fix.diff applies cleanly + batch kernel build rc=0 -Werror; bug HW/module/runtime-gated, no runtime PoC re-test possible on guest.

VALIDATED: fix.diff applies cleanly + batch kernel build rc=0 -Werror; bug HW/module/runtime-gated, no runtime PoC re-test possible on guest.
↓ fix.diffcombined build rc=0

Confirmed kernel references

β€”

Detail

Exploit chain

none

Evidence (decisive lines)

REPRODUCED (source-only): tbridge_printf: i=kvsnprintf(ptr,remsz,fmt,args); ptr+=i; remsz-=i. kvsnprintf returns C99 would-have-been-written length even when truncated; ptr+=i overruns buffer; remsz-=

Verified recommended fix

REPRODUCED (source-only): tbridge_printf: i=kvsnprintf(ptr,remsz,fmt,args); ptr+=i; remsz-=i. kvsnprintf returns C99 would-have-been-written length even when truncated; ptr+=i overruns buffer; remsz-=i underflows.

Verdict

REPRODUCED (source-only): tbridge_printf: i=kvsnprintf(ptr,remsz,fmt,args); ptr+=i; remsz-=i. kvsnprintf returns C99 would-have-been-written length even when truncated; ptr+=i overruns buffer; remsz-=i underflows.