You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix WPA3/SAE attack correctness, honesty, and dead flags
Audit of the WPA3-SAE subsystem surfaced several issues where the code
either misled the user or didn't do what its flags/docs promised.
Honest success semantics (wpa3.py, model/sae_handshake.py):
- A captured SAE handshake is NOT offline-crackable (WPA3-SAE/Dragonfly
is a PAKE that resists dictionary attacks; there is no hashcat mode that
recovers a PSK from captured SAE frames). Stop reporting a bare SAE
capture as a green "success"; print an explicit caveat explaining that
offline recovery is only feasible via transition-mode downgrade or a
Dragonblood timing partition. The capture is still saved.
- SAE completeness now requires BOTH an SAE Commit (auth seq 1) and a
Confirm (auth seq 2); previously any >=2 SAE auth frames (e.g. two
retransmitted commits) falsely counted as a complete handshake.
Dead/inconsistent CLI flags:
- --no-downgrade and --force-sae were parsed and documented but never
consulted. Gate the downgrade strategy on them (can_use_downgrade) and
skip the transition-mode WPA2 fallback attacks for --force-sae.
- --wpa3-only only duplicated --wpa3's discovery filter. Enforce it at
attack time: skip any non-WPA3 target (so WPA2-only/WEP/OWE are never
attacked), while still attacking transition-mode APs.
- Downgrade now honours --wpa3-timeout (was hardcoded to 30s), and the
previously-unreachable "no clients" warning now fires partway through
the (configurable) window.
Reliability:
- Dragonblood live timing: derive the commit->response latency from
wpa_supplicant's own microsecond timestamps (-t) instead of Python
readline/poll-sleep times, which injected tens of ms of jitter and
swamped the microsecond-scale signal. Return no sample (not a noisy
one) when timestamps are unavailable.
- hcxdumptool min version bumped 6.0.0 -> 7.0.0 to match the 7.x-only
capture syntax the wrapper emits (-w, --rds=1, band-suffix channels).
- has_captured_data() is now meaningful (data beyond the pcapng header,
via a baseline recorded at start) and a new has_new_data() lets the
capture loops skip re-validation when the file hasn't grown.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
0 commit comments