DF-4662 / verdict.json
{ "finding_id": "DF-4662", "status": "reproduced", "reproduced": 1, "impact": "dos", "confidence": "certain", "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT DragonFly 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 root@dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64", "runtime_sec": 3, "guest_dirty": 0, "build_cmd": "cd /root/df2413 && sh build.sh", "code_hash": "649368a4f0ba8c2b3e06ce44e4570d0ca199c48de7f40bd49afefb09bcc22a81", "fix_status": "fixed", "fix_baseline_reproduced": 1, "fix_patched_reproduced": 0, "fix_verdict": "Validated on the guest: fixA+B+C applied to a copy of the pristine ar2413.c, function bodies re-extracted verbatim from the patched copy, harness rebuilt and re-run. Baseline reproduces the defect; patched build shows the defect GONE (mode 1: no overflow / mode 2: early return, sentinel minPower, no wild-read propagation / mode 3: completes without the wild-address SIGSEGV). fix.diff is git-apply-able against the pristine tree (git apply --check clean) and was never applied to sys/.", "fix_evidence": "fix_run.log (full patched 3-mode run) vs run.log (baseline); fix.diff in pack; PATCHES_APPLIED + FIXED_BUILD_OK in fix_run.log.", "verdict": "REPRODUCED on the DragonFly guest (verbatim-extraction harness, mode 3): with four used pdGains carrying FLAT EEPROM curves (all pwr_delta_t2 zero -> pwr_t4={124,124,124,124} -> Pmax_t2==Pmin_t2==62 -> sizeCurrVpdTable==0) the reads VpdTable_I[ii][sizeCurrVpdTable-1/-2] at ar2413.c:464-465 wrap the uint32 index to 0xFFFFFFFF/0xFFFFFFFE and read at row +0x1FFFFFFFE bytes (+8.59 GB): SIGSEGV with si_addr EXACTLY equal to &vpdTable_I[0][0]+0x1FFFFFFFE (0x20040286a), asserted in the handler; stable across two baseline runs. In-kernel the same wild read lands in the direct map (garbage Vpd_step -> garbage extrapolated PDADC values programmed to the radio via ar2413.c:471-479/:586-593) or in a KVA hole -> panic. sizeCurrVpdTable==1 (single-step curve) wraps the -2 term identically. Twin of DF-4622 (ar5413) / DF-4650 (ar2316). Hardware-gated (crafted EEPROM on an AR2413 card); no exfil channel, no uid0 route. Fix validated: clamping sizeCurrVpdTable to >=2 makes mode 3 complete without faulting.", "exploit_chain": "flat-calibrated/crafted v3 EEPROM curve on AR2413 card -> sizeCurrVpdTable==0 -> uint32-wrap wild read at vpdTable_I row+0x1FFFFFFFE on every channel set -> KVA-hole panic (or direct-map garbage -> radio misprogramming). No uid0 route.", "evidence": "run.log mode 3: REPRODUCED: SIGSEGV si_addr=0x20040286a, expected wild address 0x20040286a / MATCH; repeat section same address; fix_run.log patched mode 3: completes, no fault.", "kernel_refs": [ "sys/dev/netif/ath/ath_hal/ar5212/ar2413.c:457", "sys/dev/netif/ath/ath_hal/ar5212/ar2413.c:464", "sys/dev/netif/ath/ath_hal/ar5212/ar2413.c:465", "sys/dev/netif/ath/ath_hal/ar5212/ar2413.c:471", "sys/dev/netif/ath/ath_hal/ar5212/ar2413.c:586" ], "poc_changes": "Same harness as DF-4660 (mode 3); no kernel-code changes.", "notes": "Same uint32-underflow class as DF-4661 but different trigger (flat curve vs xpd_mask==0) and different guard; both distinct from known DF-1796 (numChannels==0, pass 1, NOT re-reported).", "recommended_fix": "Clamp sizeCurrVpdTable to >=2 before the VpdTable_I[ii][sizeCurrVpdTable-1/-2] reads (fix.diff).", "run_cmd": "./ar2413_harness 3", "attempts": 1 } |