UnsignedChad/bcm4360-wpa3

GitHub: UnsignedChad/bcm4360-wpa3

该项目通过在主机端软件实现WPA3-SAE与802.11w PMF,让仅支持闭源驱动的Broadcom BCM4360网卡能够连接纯WPA3网络。

Stars: 5 | Forks: 1

# 在 Broadcom BCM4360(闭源 `wl` blob)上实现 WPA3-SAE + 802.11w Apple/Broadcom 从未为 **BCM4360** (`14e4:43a0`) 提供 WPA3。它在 Linux 上唯一的驱动程序是闭源的 `broadcom-sta` (`wl`) blob;`brcmfmac` 无法驱动它。本项目为该闭源 blob 添加了 **WPA3-SAE + 完整的 802.11w PMF** —— 完全通过主机软件实现,**无需 firmware 源码**。 已在实际空中信号测试中针对仅支持 WPA3 且要求 MFP 的 AP 完成验证:SAE auth → assoc → 4-way → CCMP data,连接稳定,并且能够抵御 **deauth-flood** *和* **SA-Query teardown** 攻击。 ## 工作原理 该 blob 是一个 **non-stripped, relocatable ELF `.o`**(而非最终的 firmware 镜像)—— 这正是此方案可行的根本原因。我们不会重写它;而是针对它**链接新的 C 代码**并**重定向部分调用点**: - `wpa_supplicant` 运行 SAE 和 4-way 握手(该 blob 的加密仅支持 SHA-1;而 SAE 需要 SHA-256)。 - 一个小型的 cfg80211 胶水层(`wl_cfg80211_hybrid.c`, `wl_linux.c`)桥接了 auth/assoc/keys。 - 三个构建步骤使该 blob 变得可 hook: 1. **P1 byte-patch** —— 解除 `auth` iovar 的限制,使其接受 SAE (alg=3)。 2. **`objcopy --globalize-symbol`** —— 使 blob 内部约 10 个函数可从我们的 C 代码中调用。 3. **`wl_reloc.py`** —— 重写 `.rela.text`,使得该 blob 对 `wlc_recv`/`wlc_sendauth`/`wlc_authresp_client` 的调用转入我们的 `__wrap_*` hooks。 这足以在空中驱动 SAE 帧,将 `wpa_supplicant` 的 RSN IE 注入到 assoc-req 中,安装用户空间推导的密钥,并添加软件实现的 PMF(丢弃未受保护的 deauth;通过 SW-CCMP 响应 SA-Queries)。 ## 逆向工程 工具:Ghidra (headless)、`nm`、`objdump`、`strings`、monitor-mode 嗅探器 (`iw` + `tcpdump`)。 ``` # 1. 该 blob 内置于 broadcom-sta 中且未被 strip(约 4091 个 syms) -> Ghidra 可以恢复名称。 GHIDRA=/opt/ghidra $GHIDRA/support/analyzeHeadless ./proj wl -import wlc_hybrid.o_amd64 \ -analysisTimeoutPerFile 3600 # auto-analyze, then decompile in the GUI # 2. 在选择策略之前,先对现有内容进行分类(缺失的 crypto 必须移至 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. 在 patch 之前验证任何 offset(此 blob 中的 .text vaddr V == file offset V+0x40): 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`)、join/auth FSM(`wlc_join_BSS` + 位于 `0x5b79d` 的 auth→assoc 推进器)、RX 分发(`wlc_recv`)以及 PMK/密钥路径(`wlc_sup_set_pmk`, `wlc_key_insert`)。用 `objdump` 交叉检查每一个地址。 ## 移植到其他芯片 1. 确认该 blob 是一个 **non-stripped relocatable `.o`**(`file`, `nm`)。Stripped 的 firmware 镜像无法以这种方式工作。 2. 在 Ghidra 中查找:**auth-alg clamp**、**join→auth→assoc FSM** 及其“auth-succeeded”推进器、**RX 分发**以及 `set_pmk`/key-insert。 3. 将它们的地址放入 `build.sh`(`--add-symbol re_auth_advance=...`、globalize 列表)和 `patches/wl_reloc.py`(`__wrap_*` 目标)中。 4. 修复 `wl_linux.c` 中的结构体偏移量(`wlc+0x6a8` txq, `bsscfg+0x320` assoc, `scb+0x18` bss)—— 这些取决于内存布局,且**每个 blob 版本都不同**。 5. 使用嗅探器在空中信号上进行迭代测试;firmware 故障会导致 kernel panic —— 通过网络捕获 `dmesg`(参见下文的 Struggles)。 ## Struggles → solutions - **在 SAE 期间发生 Kernel hard-locks,没有 backtrace。** 某个 `--add-symbol` 地址偏移了一位十六进制数字(`0x15b79d` 变成了 `0x5b79d`),落在了指令中间 → `call ` → NX fault。 *关键线索是构建警告 `objtool: ... can't find starting instruction`;请验证每个 synthetic symbol 是否都是真实的函数起始位置。* - **无法捕获 panic。** efi-pstore 在 Apple EFI 上损坏了;netconsole 无法通过 USB-ethernet NIC 进行 TX。*通过 SSH 将 `dmesg --follow` 的输出流式传输到另一台机器 —— 它会在重启前刷新 oops。* - **AP 拒绝了 assoc(状态 31,MFP policy)。** 该 blob 构建了自己的 PSK/no-MFP RSN IE。 *在 `.connect` 中捕获 `wpa_supplicant` 的 `sme->ie`,并将该 blob 的 assoc-req IE 缓冲区(`*(bsscfg+0x320)+0x30`)指向它 —— 这同时也满足了 4-way 握手的 RSN-IE 检查。* - **密钥安装失败 `-22`** —— 仅限 IGTK (BIP, idx 4);硬件密钥引擎没有 BIP 插槽。 *在软件中接受 IGTK;PTK/GTK 可以正常安装并且数据流可以正常传输。* - **该 blob 从不解密管理帧**,因此 802.11w SA-Queries 到达时是密文。 *捕获 PTK 并在软件中执行 AES-CCM 解密(kernel `ccm(aes)`),以便读取查询并发出加密的响应。* ## 构建 需要 kernel headers、`gcc`、`binutils`、`python3`。该 blob **不**包含在此 repo 中(专有)。 ``` # 1. 从 broadcom-sta 6.30.223.271 获取原始 blob: # 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** —— 只需使用 wifi 图形界面:选择你的网络,输入密码,即可完成。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`。) ### 永久生效(在重启 + kernel 更新后依然有效) ``` sudo dkms/install.sh ``` 使用 DKMS 注册驱动程序(在 kernel 升级时自动重新构建),将冲突的 in-tree 驱动程序 + 原始的 `wl` 列入黑名单,并在 NetworkManager 之前在引导时加载我们的驱动程序。然后从 wifi 图形界面进行连接。详细信息以及 DKMS 的一个坑请见:[`dkms/README.md`](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 ``` ## 注意事项 - **混合的 WPA2/WPA3 (transition-mode) AP 不可靠** —— 主机驱动的 SAE 并不总是在协商中获胜。请使用单一模式:将 AP 设置为 WPA3-only(或 WPA2-only),或者在 NetworkManager 连接中固定安全模式(WPA3 Personal / SAE,或 WPA2)。纯 WPA3 网络每次都能连接。 - 该 blob (`wlc_hybrid.o_amd64`) 是 **Broadcom 专有的** —— 请自行从 broadcom-sta 获取。 Releases 中的 `wl.ko` 嵌入了它(与 Debian 的 `broadcom-sta-dkms` 情况相同)。 - 偏移量特定于 broadcom-sta **6.30.223.271 / BCM4360**。 - 已在 Linux 6.12 (Debian 13)、Intel MacBookPro11,3 上测试。 - 本项目为研究代码。许可证:GPL-2.0(本 wrapper)+ Broadcom 的许可证(该 blob)。
标签:Wi-Fi, WPA3, 云资产清单, 内核模块, 内核驱动, 安全资源, 客户端加密, 网络协议, 网络安全监控, 逆向工具, 逆向工程, 驱动开发