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

pps_open is a boolean flag not a reference count; any close tears down the bus/interrupt for all openers

Summary

ppsopen uses single int flag sc->pps_open to decide whether ppbus acquired and interrupt registered. Second open by different process skips setup (pps.c:118) returns valid fd. When ANY holder calls close ppsclose unconditionally tears down interrupt (ppb_release_bus ppbconf.c:514-521) and sets pps_open=0 destroying PPS event delivery for all other open fds. ppsclose also ignores return value of ppb_release_bus (pps.c:153). Sequence: process A opens (bus acquired intr registered pps_open=1); process B opens (skips setup valid fd); process B closes ppb_release_bus tears down intr handler releases bus pps_open=0; process A still holds open fd but no PPS interrupts fire PPS_IOC_FETCH blocks until timeout. Subsequent open by C re-acquires bus registers new handler if A closes ppsclose tears down C interrupt cross-process interference. Attacker: local unprivileged opens /dev/ppsN immediately closes tears down ntpd PPS interrupt handler. DoS of kernel PPS timing subsystem. Narrow preconditions (parallel-port hardware + pps driver + victim using it).

Discussion (0)

No comments yet.

PoC verification

Evidence pack

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

DF-2149 - Verification Verdict

Status: reproduced (source-confirmed) Impact: dos Confidence: likely

Verdict

Source-confirmed: ppsopen uses single int pps_open flag; second open skips setup; any close releases bus+intr for all holders; DoS; ppbus-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/misc/pps/pps.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)

ppsopen single int flag; ppbus-gated

Verified recommended fix

ppsopen single int flag; ppbus-gated

Verdict

ppsopen single int flag; ppbus-gated