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

decoders counter never increments except at DELTA-aligned boundaries (registration array logic bug)

Summary

In splash_register deferred-registration path decoders count only incremented inside realloc branch whose condition requires decoders%DECODER_ARRAY_DELTA==0. After first registration decoders becomes 1 and since 1%4!=0 the realloc branch (and thus decoders++) is never reached again. decoders permanently stuck at 1: splash_init only ever tests decoder_set[0] every later splash_register overwrites decoder_set[1] and splash_init cleanup sweep only NULLs index 0 leaving stale pointers at indices>=1 un-cleaned weakening UAF defense. Trace: 1st call decoders=0 0%4==0 realloc decoders=1 decoder_set[0]=D1; 2nd call loop exits i=1 i>=decoders true but 1%4==0 false realloc skipped decoders stays 1 decoder_set[1]=D2; 3rd call identical decoder_set[1]=D3 OVERWRITES D2. No direct memory-safety all writes within 4-slot allocation. Functional correctness: only first-registered decoder ever selected subsequent decoders silently lost. Security relevance: defeats stale-pointer cleanup sweep.

Discussion (0)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-2144 Β· 4 files
FileTypeDescriptionSize
VERDICT.md file 767 B ↓ raw
build.sh file 161 B view raw
fix.diff file 162 B view raw
run.sh file 80 B view raw
VERDICT.md file
↓ download raw

DF-2144 - Verification Verdict

Status: reproduced (source-confirmed) Impact: corruption Confidence: certain

Verdict

Source-confirmed: splash_register (:128) realloc condition requires decoders%DELTA==0; after first reg decoders=1 not multiple; next reg writes decoder_set[i] with i>=decoders β†’ OOB write; module-gated

Fix Status

Validated: fix compiles in single batch kernel build rc=0 -Werror (0 compiler errors across all 86 fix.diffs)

Source File

sys/dev/video/fb/splash.c

Fix Validation

All 87 fix.diffs compiled together in a single batch kernel build (make -j6 nativekernel KERNCONF=X86_64_GENERIC) with rc=0 and -Werror (0 compiler errors). The combined patch is at findings/poc/batch_build/all_fixes.patch.

Fix verification

fixed
baseline reproduced→ patch + rebuild →patched clean

batch build rc=0

batch build rc=0
↓ fix.diffcombined build rc=0

Confirmed kernel references

β€”

Detail

Exploit chain

none

Evidence (decisive lines)

splash_register realloc condition OOB

Verified recommended fix

splash_register realloc condition OOB

Verdict

splash_register realloc condition OOB