
funcionalidade WPA3 para o chip Wi-Fi em um MacBook Pro de 2014
wl fechado)Apple/Broadcom nunca deu WPA3 ao BCM4360 (14e4:43a0). Seu único driver Linux é o
blob fechado broadcom-sta (wl); o brcmfmac não consegue conduzi-lo. Isto adiciona WPA3-SAE + PMF 802.11w completo
a esse blob fechado — inteiramente a partir do software do host, sem fonte de firmware.
Comprovado no ar contra um AP apenas WPA3, com MFP obrigatório: autenticação SAE → assoc → 4-way → dados CCMP, estável, e resistente a ataques de deauth-flood e derrubada SA-Query.
O blob é um arquivo .o ELF realocável não removido (não uma imagem de firmware final) — essa é a
razão principal para isso funcionar. Nós não reescrevemos; linkamos novo C contra ele e redirecionamos alguns
pontos de chamada:
wpa_supplicant executa SAE + o 4-way (a criptografia do blob é apenas SHA-1; SAE precisa de SHA-256).wl_cfg80211_hybrid.c, wl_linux.c) faz a ponte entre auth/assoc/chaves.auth para aceitar SAE (alg=3).objcopy --globalize-symbol — torna ~10 funções internas do blob chamáveis a partir do nosso C.wl_reloc.py — reescreve .rela.text para que as chamadas do blob a
wlc_recv/wlc_sendauth/wlc_authresp_client caiam em nossos ganchos __wrap_*.Isso é suficiente para enviar quadros SAE pelo ar, injetar o IE RSN do wpa_supplicant no
assoc-req, instalar chaves derivadas do espaço do usuário e adicionar PMF via software (descartar deauth não protegido;
SW-CCMP responder a SA-Queries).
Ferramentas: Ghidra (headless), nm, objdump, strings, um sniffer em modo monitor (iw + tcpdump).
# 1. The blob ships inside broadcom-sta and is NOT stripped (~4091 syms) -> Ghidra recovers names.
GHIDRA=/opt/ghidra
$GHIDRA/support/analyzeHeadless ./proj wl -import wlc_hybrid.o_amd64 \
-analysisTimeoutPerFile 3600 # auto-analyze, then decompile in the GUI
# 2. Triage what's present BEFORE picking a strategy (absent crypto must move host-side):
nm wlc_hybrid.o_amd64 | grep -iE 'sha256|sae|bip|igtk|mmie' # -> empty here
nm wlc_hybrid.o_amd64 | grep -iE 'wpa|akm|sup|sendauth|key_insert'
# 3. Verify any offset before you patch it (.text vaddr V == file offset V+0x40 in this blob):
objdump -d --start-address=0x47d40 --stop-address=0x47d60 wlc_hybrid.o_amd64
Estratégia: comece nos pontos de entrada cfg80211 na cola aberta (wl_cfg80211_connect,
wl_set_auth_type) e siga os iovars (auth, wpa_auth, wsec) para dentro do blob. Descompile
o que eles alcançam: o portão AKM (bcmwpa_akm2WPAauth), a FSM join/auth (wlc_join_BSS + o
avançador auth→assoc em 0x5b79d), o despacho RX (wlc_recv) e o caminho PMK/chave
(wlc_sup_set_pmk, wlc_key_insert). Verifique cada endereço com objdump.
.o ELF realocável não removido (file, nm). Uma imagem de firmware
removida não funcionará dessa forma.set_pmk/inserção de chave.build.sh (--add-symbol re_auth_advance=..., a lista de globalize) e
patches/wl_reloc.py (os alvos __wrap_*).wl_linux.c (wlc+0x6a8 txq, bsscfg+0x320 assoc, scb+0x18 bss)
— estes são layout e diferem por versão do blob.--add-symbol estava com um dígito hex
errado (0x15b79d vs 0x5b79d), caindo no meio de uma instrução → call <lixo> → falha NX.
O sinal é o aviso de build objtool: ... can't find starting instruction; verifique se cada
símbolo sintético é um início de função real.dmesg --follow via SSH para uma segunda máquina — ele libera o oops
antes da reinicialização.sme->ie do wpa_supplicant em .connect e aponte o buffer do IE do assoc-req do blob
(*(bsscfg+0x320)+0x30) para ele — também satisfaz a verificação de IE RSN do 4-way.-22 — apenas o IGTK (BIP, idx 4); o motor de chave de hardware não tem slot BIP.
Requer cabeçalhos do kernel, gcc, binutils, python3. O blob não está neste repositório (proprietário).
# 1. Get the pristine blob from 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 (or download it from Releases)
sudo rmmod b43 brcmfmac bcma ssb wl 2>/dev/null # free the card
sudo insmod wl-src/wl.ko # wlan0 appears
O NetworkManager usa WPA3-SAE através deste driver — basta usar a GUI de Wi-Fi: escolha sua rede, digite a senha, pronto. O NM salva e reconecta automaticamente a cada boot. Equivalente em CLI:
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 does SAE + 4-way + DHCP
(Alternativa autônoma: sudo ./examples/connect.sh wlan0 examples/wpa3-sae.conf.example.)
sudo dkms/install.sh
Registra o driver com DKMS (recompila automaticamente em upgrades de kernel), insere na lista negra os
drivers conflitantes presentes no kernel + o wl padrão, e carrega o nosso na inicialização antes do
NetworkManager. Em seguida, conecte-se pela GUI de Wi-Fi. Detalhes e a única pegadinha do DKMS:
dkms/README.md. Para uma recompilação manual única, execute ./build.sh →
wl-src/wl.ko.
O driver imprime depuração detalhada de WPA3/PMF por padrão. Silencie em tempo de execução (ou permanentemente):
echo 0 | sudo tee /sys/module/wl/parameters/re_verbose # this boot
echo 'options wl re_verbose=0' | sudo tee /etc/modprobe.d/wl-quiet.conf # permanent
wlc_hybrid.o_amd64) é propriedade da Broadcom — obtenha-o do broadcom-sta você mesmo.
O wl.ko nos Releases o incorpora (mesma situação do broadcom-sta-dkms do Debian).dmesgccm(aes)) para ler a query e emitir uma
resposta criptografada.