
функциональность wpa3 для чипа Wi-Fi в MacBook Pro 2014 года
wl)Apple/Broadcom никогда не давали BCM4360 (14e4:43a0) WPA3. Его единственный драйвер для Linux — это закрытый блоб broadcom-sta (wl); brcmfmac не может им управлять. Это добавляет WPA3-SAE + полный 802.11w PMF к этому закрытому блобу — полностью с помощью хост-программного обеспечения, без исходного кода прошивки.
Доказано в эфире против точки доступа, работающей только с WPA3 и требующей MFP: SAE-аутентификация → ассоциация → 4-стороннее рукопожатие → данные CCMP, стабильно и устойчиво к атакам deauth-flood и SA-Query teardown.
Блоб представляет собой необлегчённый перемещаемый ELF-объектный файл .o (не конечный образ прошивки) — именно поэтому это работает. Мы не переписываем его; мы линкуем новый код на C с ним и перенаправляем несколько точек вызова:
wpa_supplicant выполняет SAE + 4-стороннее рукопожатие (криптография блоба только SHA-1; SAE требует SHA-256).wl_cfg80211_hybrid.c, wl_linux.c) связывает аутентификацию/ассоциацию/ключи.auth, чтобы он принимал SAE (alg=3).objcopy --globalize-symbol — сделать ~10 внутренних функций блоба вызываемыми из нашего C.wl_reloc.py — переписать .rela.text, чтобы вызовы блоба к wlc_recv/wlc_sendauth/wlc_authresp_client попадали в наши перехватчики __wrap_*.Этого достаточно, чтобы передавать SAE-кадры в эфир, внедрять RSN IE от wpa_supplicant в запрос ассоциации, устанавливать ключи, полученные в пространстве пользователя, и добавить программный PMF (отбрасывать незащищённые deauth; 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) внутрь блоба. Декомпилировать то, до чего они доходят: шлюз AKM (bcmwpa_akm2WPAauth), конечный автомат присоединения/аутентификации (wlc_join_BSS + продвижение auth→assoc по адресу 0x5b79d), диспетчер RX (wlc_recv) и путь PMK/ключей (wlc_sup_set_pmk, wlc_key_insert). Перепроверить каждый адрес с помощью objdump.
.o (file, nm). Облегчённый образ прошивки так не сработает.set_pmk/key-insert.build.sh (--add-symbol re_auth_advance=..., список globalize) и patches/wl_reloc.py (цели __wrap_*).wl_linux.c (wlc+0x6a8 txq, bsscfg+0x320 assoc, scb+0x18 bss) — это разметка и отличаются для каждой версии блоба.--add-symbol был на одну шестнадцатеричную цифру смещён (0x15b79d вместо 0x5b79d), попадание в середину инструкции → call <мусор> → ошибка NX. Признак — предупреждение сборки objtool: ... can't find starting instruction; проверьте, что каждый синтетический символ является реальным началом функции.dmesg --follow по SSH на вторую машину — он сбрасывает ошибку до перезагрузки.sme->ie от wpa_supplicant в .connect и укажите буфер IE запроса ассоциации блоба (*(bsscfg+0x320)+0x30) на него — это также удовлетворяет проверке RSN-IE в 4-стороннем рукопожатии.-22 — только IGTK (BIP, idx 4); аппаратный движок ключей не имеет слота для BIP. Требуются заголовки ядра, gcc, binutils, python3. Блоба нет в этом репозитории (он проприетарный).
# 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: выберите сеть, введите пароль, готово. 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. Подробности и одна ловушка 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. wl.ko в Releases содержит его встроенным (та же ситуация, что и с Debian'овским broadcom-sta-dkms).dmesgccm(aes)), чтобы прочитать запрос и отправить зашифрованный ответ.