
ISOをダウンロードしようとしたら、カーネルエクスプロイトを書くことになった
TL;DR: 著者は2023年8月に購入したTP-Link EAP770 v1で、Wi-Fi経由の大容量転送が失敗する問題を調査した。SFE/PPEオフロードを無効化すると破損は止まったが、この機種はサポート終了(End-of-Life)製品とされている。
著者は、TP-Link EAP770 v1のアクセスポイントでWi-Fi経由の大容量TCPダウンロードが破損する問題の原因を調べた。調査は最終的に、設定を書き換えるためのカーネルエクスプロイトの作成へと発展した。
症状と原因の特定
著者が使用しているのは、EAP770(EU) v1.0である。ファームウェアは firmware 1.0.0 Build 20230605 Rel. 71641 で、カーネルは Linux 5.4.164 と報告されている。NixOSのISOをwgetで取得した際には、総サイズ3683778560バイトのファイルでエラーが発生した。HTTP/2経由で取得した128 MiBのNixバイナリキャッシュファイルも失敗し、rsyncやSSHによる数GiBを超えるファイル転送も失敗した。
失敗中に取得されたHTTPSダウンロードのキャプチャでは、64バイトの誤りを含む1440バイトのTCPセグメントが確認された。このセグメントのチェックサムは有効だった。TCPはこのセグメントを受理したが、TLSは「bad record mac」として受信レコードを拒否した。著者は次のように述べている。
「TCPが正しいバイトを届けるのは、そのためのものなのだから。だから問題はrsyncかSSHにあると確信していた」
— 著者
LAN側からWi-Fi側への生のTCPテストでは、8192 MiB中3つの64バイトブロックが破損した。著者は、この原因をqca-nss-dpドライバにおけるDMAキャッシュ一貫性バグと特定している。受信領域は1856バイト(headから192バイト先の29キャッシュライン)である。著者はさらに、以前のバッファ使用で残ったダーティキャッシュラインが、NICが新しいパケットを受信した後に書き戻されうると見ている。
無効化の効果と速度
著者のテストでは、SFE/PPEオフロードを無効化すると破損は止まった。無効化後も、/sys/sfe/exceptions の NOT_SUPPORT_BRIDGE カウンタが増加することが確認されている。速度への影響も測定され、オフロード有効時のLAN-Wi-Fi間転送(8192 MiB、3ブロック破損)は103.4 MiB/sだった。一方、無効化後の夜間実行(破損0ブロック)は95.4 MiB/sであり、ダウンロード速度のコストは約8%とされている。
別の問題として、ラップトップ側のWCN785xカードが1〜4分間データ送信を停止するWi-Fiドロップが起きていた。信号強度は-31〜-42 dBmだった。ドロップ時には、ファームウェアが26388フレーム中10630フレームをCMD_REMOVE_AGED_FRAMESで返していた。ラップトップのWi-Fiカードのファームウェア(最新のアップストリーム版はWLAN.HMT.1.1.c7-00108 UPSTREAM-3)がドロップの原因である可能性もある。著者はAPの5GHz無線をWi-Fi 7からWi-Fi 6に切り替え、24時間の監視テストを実施した。
権限制限と回避策
sysfsの設定はrootのみ書き込み可能で、TP-Linkのシェルも制限されていた。著者は、非特権ユーザー名前空間から到達可能なCVE-2022-0185(legacy_parse_param()の整数アンダーフロー)と、パイプバッファの操作を組み合わせたカーネルエクスプロイトチェーンを構築し、sysfsの2つの値を書き込んだ。作業にはOpus 4.8との試行を含めて17時間を費やしたという。著者によると、Opus 5.5はローカル権限昇格を議論した際にセッションを打ち切ったとされる。
TP-Linkのサポートは、この機種について次のように回答している。
「EAP770 Version 1 is an End-of-Life product. While it may still be available through some retailers, it is no longer supported with firmware updates.」
— TP-Link support
著者は代替機の費用として200 USDの支払いを拒否した。そのうえで、次のように述べている。
「TP-Linkが自分のデバイスを適切に修正させてくれない以上、正しいデータを得るために性能を犠牲にするしかない」
— 著者
筆者の見立て
- Qualcommは、望むならドライバを修正するか、よりオープンな場所でホストできると論じている。
- qca-nss-dpで見つけた類似のDMAバグは、さらに精査する価値があると論じている。
- 破損はビット反転ではなく、キャッシュまたはDMAのバグの証拠だと解釈している。
- 破損したセグメントに有効なチェックサムが付いていたことは、破損後に何かがチェックサムを再計算したことを意味すると解釈している。
- ドロップが止まればWi-Fi 7のバグであり、Wi-Fi 6に留まってath12kにバグレポートを送る可能性を示唆している。
この記事は元記事の事実のみに基づいて自動生成されました。
出典
- 媒体名: blog.dfb.sh
- 元記事タイトル: Wanted to download an ISO, ended up writing a kernel exploit
- URL: https://blog.dfb.sh/blog/eap770-root-for-two-zeros/
- (Wireshark、tcpdump、Fastly、openwrt/qca-nss-dp mirror、Framework 16 の報道による)