⬢ DragonFlyBSD Kernel Audit
DF-3922 / verdict.json
← back to finding ↓ download raw
{
  "finding_id": "DF-3922",
  "status": "not_reproduced",
  "reproduced": 0,
  "impact": "none",
  "confidence": "likely",
  "verdict": "Mechanics certain, manifestation racy. DragonFly callout_stop() sleeps without timeout waiting for an in-progress callback (kern_timeout.c:910-921). hpt_timeouts first action is lock_driver() (entry.c:2629); fOsCommandDone calls callout_stop on the same callout while holding driver_lock (entry.c:2910, all completion contexts hold it). Concurrent fire => CPU0 sleeps in costp holding driver_lock, CPU1 sleeps acquiring it: permanent wedge of the controller, its DPC worker and - because the SIM shares &sim_mplock (entry.c:2047) - potentially all legacy-locked CAM I/O. Not reproducible on the audit guest (no RR1820 hardware).",
  "exploit_chain": "sustained IO on RR1820 -> command completion racing its 20 s timeout -> AB-BA sleep deadlock -> unkillable storage wedge (DoS)",
  "evidence": "VERDICT.md: lock/callout order trace with kern_timeout.c:920 ssleep and entry.c:2629/2910",
  "kernel_refs": [
    "sys/dev/raid/hptmv/entry.c:2629",
    "sys/dev/raid/hptmv/entry.c:2910",
    "sys/kern/kern_timeout.c:1091",
    "sys/kern/kern_timeout.c:920"
  ],
  "poc_changes": "n/a (fresh pack)",
  "attempts": 1,
  "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 x86_64",
  "runtime_sec": 10,
  "guest_dirty": 0,
  "build_cmd": "n/a",
  "run_cmd": "hardware: sustained IO; race completion vs 20 s timeout",
  "code_hash": "",
  "notes": "Standard LLDD timeout-lock inversion; also note hptmv hijacks CAMs ccb_h.timeout_ch callout for its private timeout (entry.c:2669/2865), making the synchronous-stop semantics load-bearing.",
  "recommended_fix": "hpt_timeout must not sleep on driver_lock (LK_NOWAIT + requeue), removing the AB-BA against callout_stop under the lock",
  "fix_status": "not_testable",
  "fix_baseline_reproduced": 0,
  "fix_patched_reproduced": 0,
  "fix_verdict": "fix.diff converts hpt_timeout to LK_NOWAIT+requeue; cannot validate without hardware",
  "fix_evidence": "fix.diff in this pack; never applied to sys/"
}