あるユーザーが、TP-Link EAP770 v1 Wi-Fi 7アクセスポイントにおいて、大きなファイルの転送中にデータ破損を引き起こす重大なハードウェアレベルのバグを発見しました。この問題は、TCPチェックサムが有効に見えるにもかかわらず、HTTPSのダウンロード中に「bad record mac」エラーが発生したり、`rsync`の転送が失敗したりする形で現れました。パケット分析とドライバの調査を通じて、ユーザーは原因がQualcommの`qca-nss-dp`ドライバにおけるDMAキャッシュ一貫性のバグであることを特定しました。具体的には、ドライバの高速送信パスにおいて、ネットワークインターフェースカード(NIC)にバッファを戻す前に、受信バッファ全体のCPUキャッシュを同期できていないことが原因です。これにより、以前の操作による「汚れた」キャッシュラインがDRAMに書き戻され、新しいパケットデータの64バイトブロックを上書きしてしまいます。

この破損は、デバイスのSFE/PPE(Switch Fabric Engine / Packet Process Engine)オフロード機能によって悪化します。これらの機能は、メモリ内でデータがすでに破損した後にTCPチェックサムを再計算することでブリッジトラフィックを高速化します。チェックサムは破損したペイロードに対して再計算されるため、TCPレイヤーはそれらのセグメントを有効なものとして受け入れ、TLSやSSHにおけるエンドツーエンドの整合性チェックによってのみエラーが検知されることになります。ユーザーは、この問題を修正するには`l2_feature`と`ppe_rfs_feature`という2つの特定のsysfs設定を無効にする必要があることを突き止めました。しかし、TP-Linkはv1ハードウェアを「製品寿命終了」と分類してファームウェアの更新提供を拒否しており、デバイスのデフォルトのSSHシェルではこれらの設定を変更する権限が与えられていませんでした。

これらの制限を回避するため、ユーザーはルート権限を取得するためのカーネルエクスプロイトを開発しました。このエクスプロイトは、Linuxカーネルの`legacy_parse_param()`関数における整数アンダーフローであるCVE-2022-0185を利用するもので、特権のないユーザーが4 KiBのスラブオブジェクト内で書き込みオーバーフローを誘発することを可能にします。カーネルメモリをグルーミングし、パイプバッファを操作することで、ユーザーは任意の書き込みを達成し、最終的に`modprobe_path`を上書きしてグローバルなルート権限を持つシェルを実行しました。これにより、メーカー提供のパッチを必要とせずに、欠陥のあるオフロード機能を手動で無効化し、データ破損を正常に停止することができました。ユーザーは、システムは一般的なエクスプロイトに対して高度に堅牢化されていたものの、古いハードウェアのメンテナンス不足が、根本的なドライバの欠陥を解決するためにカーネルレベルのプリミティブの使用を強いたと述べています。

TP-Linkアクセスポイントのトラブルシューティングのためにコンピュータを操作する人物
ハードウェアバグの特定からTP-Link EAP770のためのカーネルエクスプロイト開発に至るまでのユーザーの道のり。blog.dfb.sh

DMAキャッシュ一貫性のバグを特定し、最終的にハードウェアの制限を回避するためのカーネルエクスプロイトを開発するユーザーのプロセス。