
2014 MacBook ProのWi-Fiチップ向けのwpa3機能
wl バイナリ)Apple/Broadcom は BCM4360 (14e4:43a0) に WPA3 を提供したことはありません。唯一の Linux ドライバはクローズドな broadcom-sta (wl) バイナリであり、brcmfmac では駆動できません。本プロジェクトは、そのクローズドバイナリに WPA3-SAE + 完全な 802.11w PMF を追加します。すべてホストソフトウェア側で実現し、ファームウェアのソースコードは不要です。
実際に WPA3 のみ・MFP 必須の AP に対してオンエアで検証済み:SAE 認証 → アソシエーション → 4-way ハンドシェイク → CCMP データ通信が安定し、deauth-flood および SA-Query ティアダウン攻撃にも耐性があります。
このバイナリは 非ストリップ・再配置可能な ELF .o(最終ファームウェアイメージではありません)であることが、この手法が機能する唯一の理由です。バイナリを書き換えるのではなく、新しい C コードとリンクし、いくつかのコールサイトをリダイレクトします。
wpa_supplicant が SAE と 4-way ハンドシェイクを実行します(バイナリの暗号は SHA-1 のみ。SAE には SHA-256 が必要)。wl_cfg80211_hybrid.c、wl_linux.c)が認証・アソシエーション・キーを仲介します。auth iovar の制限を解除し、SAE(alg=3)を受け付けるようにします。objcopy --globalize-symbol — 約 10 個のバイナリ内部関数を C コードから呼び出し可能にします。wl_reloc.py — .rela.text を書き換え、バイナリ内部の wlc_recv/wlc_sendauth/wlc_authresp_client への呼び出しが、私たちの __wrap_* フックに着地するようにします。これにより、SAE フレームを無線で送受信し、wpa_supplicant の RSN IE をアソシエーションリクエストに挿入し、ユーザー空間で生成された鍵をインストールし、ソフトウェア PMF(保護されていない deauth をドロップ、SW-CCMP で SA-Query に応答)を追加することができます。
使用ツール:Ghidra(ヘッドレス)、nm、objdump、strings、モニターモードスニファ(iw + tcpdump)。
# 1. バイナリは broadcom-sta に同梱されており、ストリップされていません(約 4091 シンボル)→ Ghidra が名前を復元します。
GHIDRA=/opt/ghidra
$GHIDRA/support/analyzeHeadless ./proj wl -import wlc_hybrid.o_amd64 \
-analysisTimeoutPerFile 3600 # 自動解析後、GUI で逆コンパイル
# 2. 戦略を決める前に、何が存在するかトリアージします(不足している暗号はホスト側に移動する必要があります):
nm wlc_hybrid.o_amd64 | grep -iE 'sha256|sae|bip|igtk|mmie' # → ここでは空
nm wlc_hybrid.o_amd64 | grep -iE 'wpa|akm|sup|sendauth|key_insert'
# 3. パッチを当てる前にオフセットを確認します(このバイナリでは .text vaddr V == ファイルオフセット V+0x40):
objdump -d --start-address=0x47d40 --stop-address=0x47d60 wlc_hybrid.o_amd64
戦略:オープン グルーコード(wl_cfg80211_connect、wl_set_auth_type)内の cfg80211 エントリポイントから始め、iovar(auth、wpa_auth、wsec)を追跡してバイナリ内部へ進みます。それが到達するコードを逆コンパイルします: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/key-insert。build.sh(--add-symbol re_auth_advance=...、グローバル化リスト)および patches/wl_reloc.py(__wrap_* ターゲット)に記述します。wl_linux.c 内の構造体オフセットを修正します(wlc+0x6a8 txq、bsscfg+0x320 assoc、scb+0x18 bss)— これらはレイアウトであり、バイナリバージョンごとに異なります。dmesg をネットワーク経由でキャプチャします(苦労した点を参照)。--add-symbol のアドレスが 1 桁ずれていた(0x15b79d vs 0x5b79d)、命令途中に着地 → call <garbage> → NX フォールト。
兆候はビルド時の警告 objtool: ... can't find starting instruction です。すべての合成シンボルが実際の関数開始点であることを確認してください。dmesg --follow を別のマシンにストリーム出力します — リブート前に oops がフラッシュされます。.connect 内の wpa_supplicant の sme->ie をキャプチャし、バイナリのアソシエーションリクエスト IE バッファ(*(bsscfg+0x320)+0x30)をそこに向けます — これで 4-way の RSN-IE チェックも満たされます。-22 で失敗する — それは IGTK(BIP、idx 4)のみ。ハードウェア鍵エンジンに BIP スロットがない。
IGTK はソフトウェアで受け入れます。PTK/GTK は正常にインストールされ、データ通信が流れます。カーネルヘッダ、gcc、binutils、python3 が必要です。バイナリはこのリポジトリには含まれていません(プロプライエタリ)。
# 1. 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.sh # -> wl-src/wl.ko (Releases からダウンロードも可能)
sudo rmmod b43 brcmfmac bcma ssb wl 2>/dev/null # カードを解放
sudo insmod wl-src/wl.ko # wlan0 が出現
NetworkManager はこのドライバ経由で WPA3-SAE を制御できます — 通常の WiFi 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 が SAE + 4-way + DHCP を実行
(スタンドアロンの代替:sudo ./examples/connect.sh wlan0 examples/wpa3-sae.conf.example)
sudo dkms/install.sh
ドライバを DKMS に登録(カーネルアップグレード時に自動再ビルド)、競合するカーネル内蔵ドライバと標準の wl をブラックリストに追加し、起動時に NetworkManager より先にロードします。その後、WiFi GUI から接続します。詳細と DKMS の注意点については dkms/README.md を参照してください。手動で再ビルドする場合は ./build.sh → wl-src/wl.ko を実行してください。
ドライバはデフォルトで詳細な WPA3/PMF デバッグを出力します。実行時(または永続的に)に静音化するには:
echo 0 | sudo tee /sys/module/wl/parameters/re_verbose # 今回の起動のみ
echo 'options wl re_verbose=0' | sudo tee /etc/modprobe.d/wl-quiet.conf # 永続的
wlc_hybrid.o_amd64)は Broadcom のプロプライエタリです — broadcom-sta から自分で入手してください。Releases 内の wl.ko にはバイナリが埋め込まれています(Debian の broadcom-sta-dkms と同じ状況)。ccm(aes))を使ってクエリを読み、暗号化された応答を送信します。