
funzionalità wpa3 per il chip wifi in un MacBook Pro del 2014
wl chiuso)Apple/Broadcom non ha mai dato al BCM4360 (14e4:43a0) il WPA3. Il suo unico driver Linux è il blob chiuso broadcom-sta (wl); brcmfmac non può pilotarlo. Questo aggiunge WPA3-SAE + 802.11w PMF completo a quel blob chiuso — interamente dal software host, nessuna fonte del firmware.
Testato in onda contro un AP solo WPA3 con MFP richiesto: autenticazione SAE → assoc → 4-way → dati CCMP, stabile e resistente agli attacchi deauth-flood e SA-Query teardown.
Il blob è un .o ELF rilocabile non strippato (non un'immagine firmware finale) — questo è il motivo per cui funziona. Non lo riscriviamo; colleghiamo nuovo C contro di esso e reindirizziamo pochi siti di chiamata:
wpa_supplicant esegue SAE + il 4-way (la crittografia del blob è solo SHA-1; SAE necessita SHA-256).wl_cfg80211_hybrid.c, wl_linux.c) fa da ponte per auth/assoc/chiavi.auth in modo che accetti SAE (alg=3).objcopy --globalize-symbol — rendi richiamabili ~10 funzioni interne del blob dal nostro C.wl_reloc.py — riscrivi .rela.text in modo che le chiamate del blob a
wlc_recv/wlc_sendauth/wlc_authresp_client finiscano nei nostri hook __wrap_*.Questo basta per inviare frame SAE in onda, iniettare l'RSN IE di wpa_supplicant nella assoc-req, installare chiavi derivate dallo userspace e aggiungere PMF software (scarta deauth non protetti; SW-CCMP risponde alle SA-Queries).
Strumenti: Ghidra (headless), nm, objdump, strings, uno sniffer in modalità monitor (iw + tcpdump).
# 1. Il blob è spedito in broadcom-sta e NON è strippato (~4091 sym) -> Ghidra recupera i nomi.
GHIDRA=/opt/ghidra
$GHIDRA/support/analyzeHeadless ./proj wl -import wlc_hybrid.o_amd64 \
-analysisTimeoutPerFile 3600 # auto-analizza, poi decompila nella GUI
# 2. Triage di ciò che è PRESENTE prima di scegliere una strategia (crittografia assente deve passare all'host):
nm wlc_hybrid.o_amd64 | grep -iE 'sha256|sae|bip|igtk|mmie' # -> vuoto qui
nm wlc_hybrid.o_amd64 | grep -iE 'wpa|akm|sup|sendauth|key_insert'
# 3. Verifica ogni offset prima di patcharlo (.text vaddr V == file offset V+0x40 in questo blob):
objdump -d --start-address=0x47d40 --stop-address=0x47d60 wlc_hybrid.o_amd64
Strategia: parti dai punti di ingresso cfg80211 nel collante aperto (wl_cfg80211_connect, wl_set_auth_type) e segui gli iovar (auth, wpa_auth, wsec) dentro il blob. Decompila ciò che raggiungono: il gate AKM (bcmwpa_akm2WPAauth), la FSM join/auth (wlc_join_BSS + l'avanzatore auth→assoc a 0x5b79d), il dispatch RX (wlc_recv), e il percorso PMK/chiave (wlc_sup_set_pmk, wlc_key_insert). Verifica ogni indirizzo con objdump.
.o rilocabile non strippato (file, nm). Un'immagine firmware strippata non funzionerà in questo modo.set_pmk/key-insert.build.sh (--add-symbol re_auth_advance=..., la lista globalize) e patches/wl_reloc.py (i target __wrap_*).wl_linux.c (wlc+0x6a8 txq, bsscfg+0x320 assoc, scb+0x18 bss) — questi sono layout e differiscono per versione del blob.--add-symbol era sbagliato di una cifra esadecimale (0x15b79d vs 0x5b79d), finendo a metà istruzione → call <garbage> → NX fault.
L'indizio è l'avviso di build objtool: ... can't find starting instruction; verifica che ogni simbolo sintetico sia un vero inizio di funzione.dmesg --follow via SSH su una seconda macchina — scarica l'oops prima del riavvio.sme->ie di wpa_supplicant in .connect e punta il buffer IE della assoc-req del blob (*(bsscfg+0x320)+0x30) su di esso — soddisfa anche il controllo RSN-IE del 4-way.-22 — solo l'IGTK (BIP, idx 4); il motore chiavi HW non ha slot BIP.
Necessita di header del kernel, gcc, binutils, python3. Il blob non è in questo repo (proprietario).
# 1. Ottieni il blob originale da broadcom-sta 6.30.223.271:
# hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz -> lib/wlc_hybrid.o_amd64
cp /path/to/wlc_hybrid.o_amd64 wl-src/lib/wlc_hybrid.o_amd64.orig
# 2. Build:
./build.sh # -> wl-src/wl.ko (o scaricalo dalle Release)
sudo rmmod b43 brcmfmac bcma ssb wl 2>/dev/null # libera la scheda
sudo insmod wl-src/wl.ko # appare wlan0
NetworkManager guida WPA3-SAE attraverso questo driver — basta usare la GUI wifi: scegli la rete, inserisci la password, fatto. NM la salva e si riconnette automaticamente a ogni avvio. Equivalente da riga di comando:
nmcli con add type wifi ifname wlan0 con-name w ssid "YOUR_SSID"
nmcli con modify w wifi-sec.key-mgmt sae wifi-sec.psk "YOUR_PASS" 802-11-wireless-security.pmf 3
nmcli con up w # NM fa SAE + 4-way + DHCP
(Alternativa standalone: sudo ./examples/connect.sh wlan0 examples/wpa3-sae.conf.example.)
sudo dkms/install.sh
Registra il driver con DKMS (ricostruzione automatica agli aggiornamenti del kernel), blacklista i driver in-albero conflittuali + lo stock wl, e carica il nostro all'avvio prima di NetworkManager. Poi connettiti dalla GUI wifi. Dettagli e l'unico gotcha di DKMS: dkms/README.md. Per una ricostruzione manuale una tantum invece, esegui ./build.sh → wl-src/wl.ko.
Il driver stampa debug dettagliato di WPA3/PMF di default. Silenzialo a runtime (o permanentemente):
echo 0 | sudo tee /sys/module/wl/parameters/re_verbose # questo avvio
echo 'options wl re_verbose=0' | sudo tee /etc/modprobe.d/wl-quiet.conf # permanente
wlc_hybrid.o_amd64) è proprietario Broadcom — ottienilo da broadcom-sta da solo.
Il wl.ko nelle Release lo incorpora (stessa situazione di Debian's broadcom-sta-dkms).dmesgccm(aes)) per leggere la query ed emettere una risposta crittata.