DF-4527 / verdict.json
{ "finding_id": "DF-4527", "status": "untested", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Info-severity kernel-address disclosure, hardware-gated (no ath radio on the audit guest); Phase V skipped per policy for Info findings. Code trace: HAL_DIAG_ANI_CURRENT (ar5212_misc.c:1081-1085, reached from ar5416 via ar5416GetDiagState -> ar5212GetDiagState, ar5416_misc.c:557) exports sizeof(struct ar5212AniState) bytes of the internal per-channel ANI state; that structs LAST member is the kernel pointer const struct ar5212AniParams *params (ar5212.h:181-198), which ath_ioctl_diag() then copyout()s verbatim to userspace (if_ath_ioctl.c:214-219) \u2014 an 8-byte kernel heap address disclosure (offset of &ahp->ah_aniParams24/5 inside the ath_hal_5416 softc) on every SIOCGATHDIAG HAL_DIAG_ANI_CURRENT call. The exported HAL_ANI_STATE type in ah.h deliberately stops before the pointer; the diag path sizes the copy from the internal struct instead. Same ATH_DIAGAPI + missing-priv-check (DF-2059/DF-4320) gates as DF-4526; no KASLR on current DFly keeps impact informational.", "exploit_chain": "", "evidence": "code trace only (no pack; Info finding, skipped per Phase V policy)", "kernel_refs": [ "sys/dev/netif/ath/ath_hal/ar5212/ar5212_misc.c:1081-1085", "sys/dev/netif/ath/ath_hal/ar5212/ar5212.h:181-198", "sys/dev/netif/ath/ath_hal/ar5416/ar5416_misc.c:530-557", "sys/dev/netif/ath/ath/if_ath_ioctl.c:214-219" ], "poc_changes": "", "attempts": 0, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 x86_64", "runtime_sec": 0, "guest_dirty": 0, "build_cmd": "", "run_cmd": "", "code_hash": "", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "not applicable (skipped, Info)", "fix_evidence": "", "notes": "Fix: size the export from the exported type: *resultsize = offsetof(struct ar5212AniState, txFrameCount) (or sizeof of a sanitized snapshot struct) instead of sizeof(struct ar5212AniState).", "recommended_fix": "Copy out only the exported prefix of ar5212AniState (up to listenTime), not the full internal struct containing the params pointer." } |