wl blob)上实现 WPA3-SAE + 802.11wApple/Broadcom 从未为 BCM4360 (14e4:43a0) 提供 WPA3。其唯一的 Linux 驱动是封闭的 broadcom-sta (wl) blob;brcmfmac 无法驱动它。本项目为这一封闭 blob 添加了 WPA3-SAE + 完整 802.11w PMF —— 完全通过主机软件实现,无需固件源码。
已在空中与仅支持 WPA3、要求 MFP 的 AP 验证:SAE 认证 → 关联 → 四次握手 → CCMP 数据,稳定运行,并能抵抗 去认证洪水 和 SA-Query 拆除 攻击。
该 blob 是一个 未剥离、可重定位的 ELF .o(并非最终的固件镜像)—— 这正是其可行性的根本原因。我们不重写它;而是 将新的 C 代码与之链接,并 重定向少量调用点:
wpa_supplicant 运行 SAE 和四次握手(blob 的加密仅支持 SHA-1;SAE 需要 SHA-256)。wl_cfg80211_hybrid.c、wl_linux.c)桥接认证/关联/密钥。auth iovar 的限制,使其接受 SAE(alg=3)。objcopy --globalize-symbol —— 使约 10 个 blob 内部函数可从我们的 C 代码调用。wl_reloc.py —— 重写 .rela.text,使 blob 对 wlc_recv/wlc_sendauth/wlc_authresp_client 的调用落入我们的 __wrap_* 挂钩。这足以在空中驱动 SAE 帧,将 wpa_supplicant 的 RSN IE 注入关联请求,安装用户空间派生的密钥,并添加软件 PMF(丢弃未受保护的去认证帧;通过 SW-CCMP 应答 SA-Query)。
工具:Ghidra(无头模式)、nm、objdump、strings、一个监控模式嗅探器(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
策略:从 开放 胶水代码中的 cfg80211 入口点(wl_cfg80211_connect、wl_set_auth_type)开始,并沿着 iovars(auth、wpa_auth、wsec)进入 blob。反编译它们所到达的位置:AKM 门控(bcmwpa_akm2WPAauth)、加入/认证 FSM(wlc_join_BSS 和位于 0x5b79d 的认证→关联推进器)、RX 分发(wlc_recv)以及 PMK/密钥路径(wlc_sup_set_pmk、wlc_key_insert)。使用 objdump 交叉检查每个地址。
.o(使用 file、nm 检查)。剥离后的固件镜像无法采用此方式工作。set_pmk/密钥插入。build.sh(--add-symbol re_auth_advance=...、全局化列表)和 patches/wl_reloc.py(__wrap_* 目标)。wl_linux.c 中的结构体偏移量(wlc+0x6a8 txq、bsscfg+0x320 assoc、scb+0x18 bss)—— 这些是布局信息,且 因 blob 版本而异。dmesg(参见“挑战”部分)。--add-symbol 的地址偏移了一个十六进制数字(0x15b79d 而非 0x5b79d),落在了指令中间 → call <garbage> → NX 错误。线索是构建警告 objtool: ... can't find starting instruction;请验证每个合成符号均为真正的函数起始。dmesg --follow 流式传输到第二台机器——它会在重启前刷新 oops 信息。.connect 中捕获 wpa_supplicant 的 sme->ie,并将 blob 的关联请求 IE 缓冲区(*(bsscfg+0x320)+0x30)指向它——同时也满足了四次握手的 RSN-IE 检查。-22 —— 仅 IGTK(BIP,索引 4)出现问题;硬件密钥引擎没有 BIP 槽位。在软件中接受 IGTK;PTK/GTK 安装正常,数据可流通。ccm(aes))以读取查询并发出加密响应。需要内核头文件、gcc、binutils、python3。该 blob 不 在此仓库中(专有)。
# 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
NetworkManager 通过此驱动驱动 WPA3-SAE —— 只需使用 Wi-Fi GUI:选择你的网络,输入密码,即可完成。NM 会保存它并在每次启动时自动重新连接。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
(独立替代方案:sudo ./examples/connect.sh wlan0 examples/wpa3-sae.conf.example)
sudo dkms/install.sh
使用 DKMS 注册驱动(在内核升级时自动重建),将冲突的内核内驱动和原装 wl 加入黑名单,并在启动时在 NetworkManager 之前加载我们的驱动。然后通过 Wi-Fi GUI 连接。详情及一个 DKMS 陷阱:dkms/README.md。如需一次性手动重建,请运行 ./build.sh → wl-src/wl.ko。
该驱动默认输出详细的 WPA3/PMF 调试信息。在运行时(或永久)关闭:
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)是 Broadcom 专有 的 —— 请自行从 broadcom-sta 获取。Releases 中的 wl.ko 嵌入了它(与 Debian 的 broadcom-sta-dkms 情况相同)。