
マリオカート8 デラックスの「KartLANPwn」スタックベースバッファオーバーフロー脆弱性に関する情報と概念実証(PoC)
著者: Chad Hyatt
| CVE | CVE-2024-45200 |
| CVSS 3.1 | 未確定 (任天堂.. は4.3/10と主張) |
| 報奨金 | $512 |
| H1レポート | #2611669 |
| 発見日 | 2024年7月2日 |
| 修正日 | 2024年9月11日 (v3.0.3) |
| 開示日 | 2024年9月29日 |
KartLANPwnは、マリオカート8 デラックスにおける Pia P2Pネットワーキングライブラリの誤った使用に存在する脆弱性です。この脆弱性では、「CopyAppData」の各実装が、outバッファ自体よりも大きなoutBufSizeを指定して呼び出されることがあります。これにより、情報漏えいと組み合わせた場合、ピアの本体上でユーザーモードのリモートコード実行(RCE)に至る可能性があります。KartLANPwnは、PiaによるLAN/LDNマルチプレイおよびNEXオンラインマルチプレイの実装の使用に影響を与えます。
この脆弱性は、マリオカート8 デラックスのv3.0.1まで(中国/Tencent版ではv3.0.2まで)の全バージョンに影響します。特に、MK8DXのv3.0.1製品版における「LANプレイ」機能を介して実証されています。
2024年9月11日時点で、任天堂は中国を除く全地域向けにv3.0.3とともにKartLANPwnの修正を展開しました。2024年9月27日時点で、v3.0.3は中国向けにもリリースされています。私たちは任天堂の許可を得た上で、この情報を安全に開示しました。
proprietary Piaネットワーキングライブラリは、ローカルまたはオンラインプレイに対応した任天堂製Nintendo Switchゲームで使用され、LAN/LDN(ローカルマルチプレイ)およびオンラインマルチプレイに使用されるNEXプロトコル向けのピアツーピアネットコード実装を提供します。
デモンストレーションのため、ここでは特にPiaのLANプロトコルに焦点を当てます。ルームホストの本体は、ローカルブロードキャストアドレス(255.255.255.255)の:30000でUDP「ディスカバリ」ソケットを開きます。同じネットワーク上の他の本体は、同じく:30000の自機のソケットから「ブラウズ要求」をルーターにアドバタイズし、同じネットワーク上の他のデバイスに転送してもらうことになっています。
ルームホスト(私たちの「サーバー」)は、ルームに関する情報(ホストの表示名、Miiデータ、プレイヤー数など)を含むはずの初期「ブラウズ応答」を返信します。ブラウズ応答パケット内では、outバッファにコピーされるアプリケーションデータの長さを最大150の値で制御できます。ただし、outの幅はわずか128バイトしかありません。これにより、スタックフレーム上の値(この特定のケースではpop {r4-r8, pc}用の値)をオーバーフローさせることが可能になります。
少なくともMK8DXが使用しているPiaバージョンの場合、ここで注目しているLANのブラウズ応答パケットは次のように構築されます:
(すべてのint型はビッグエンディアンでエンコードされます)
| インデックス | 疑似型 | 説明 |
|---|---|---|
| 0 | u8 | パケットタイプ(0x1) |
| 1 | u32 | セッション情報ボディのサイズ(このケースでは1266) |
| 5 | (42 bytes) | その他のセッション情報フィールド(今回の件には無関係) |
| 47 | (0x180 bytes) | アプリケーションデータ用領域の開始位置 |
| 431 | u32 | アプリケーションデータの長さ |
残りのセッション情報も続きますが、KartLANPwn用のパケットを作成する上では重要ではありません
LAN_CopyAppData" 疑似コードデモンストレーション用に、以下は「CopyAppData」のLAN実装からの大まかな疑似コードです。この関数単体には本質的に問題はありませんが、(MK8DXの場合の)誤った使用方法により、packet内の入力アプリケーションデータでスタックフレームが上書きされる可能性があります。
(関数はMK8DX v3.0.1のmain内の+0xA0F8C0にあります)
void LAN_CopyAppData(int* r0, int packet, int out, uint outBufSize) {
int u1 = 68612;
if (out != NULL) {
// The actual length to read from the `packet` buffer at the start of our
// application data (which our 'server' controls)
uint appDataLength = *(uint *)(packet + 432);
// In some cases, outBufSize is input as a larger number than the bounds of the
// `out` buffer, which allows a stack buffer overflow (in our specific case, `*out`
// is 128 bytes long, and outBufSize is 150!)
if (appDataLength <= outBufSize) {
memcpy(out, packet + 48, outBufSize); // packet[47], start of application data
u1 = 0;
}
*r0 = u1;
return;
}
*r0 = 68615;
return;
}
Pythonで書かれたシンプルなPoCスクリプトを用意しました。これは偽のルームホストとして動作し、特別に細工された「ブラウズ応答」パケットをピアの本体に返信します。スクリプトを実行しているコンピューターと同じネットワーク上の本体からMK8DXで「LANプレイ」メニューを開くと、ゲームのプロセスがクラッシュします。
GitHubからリポジトリのzipを直接ダウンロードするか、gitを使用してクローンします:
git clone https://github.com/latte-soft/kartlanpwn.git && cd kartlanpwn
python3 kartlanpwn-poc.py
ビデオデモ(YouTube)をご覧ください:
そして、ARMマニアの皆さん向けに、GDBでの結果として生じたプロセスのセグメンテーションフォルトのスクリーンショットをどうぞ:

バグ自体の詳細を解明するのには数日しかかかりませんでしたが、オーバーフローを実際に悪用するとなると? それはまったく別の厄介な問題です。Nintendo Switchカーネルのユーザーモードは決して甘くありません。可能な限りの隅々まで非常に厳格です。私たちはさまざまなアイデアや手がかりを交換し、試行錯誤しながら多くの時間を費やしましたが、最終的には真の(任意の)コード実行には至りませんでした。私たちの特定のケースでは、信頼性の高いROPでさえも実現はかなり難しそうでした。ネットワーク関連の関数のほぼすべてがクラスベースであり、さらに直接書き込みアクセスができたのはr4-r8だけだったからです。(*_thisよ、愛しい)さらに、事前の情報漏えいがなければ、mov r4, r0などをスキップして_thisポインターを制御することもあまり現実的ではありません。楽しい作業でした!
報告に関して言えば、今回は報告から開示まで、任天堂のトリアージも含めて実際には比較的スムーズなプロセスでした。報奨金の**$512**は私の予想よりはるかに少なかったですが(いつもそうでしょう?)、「任天堂の忍者」が私の家のドアに現れるよりはましです……
任天堂は、Wii、3DS、さらにはWii Uの単純だった時代から、間違いなく教訓を学んでいます。彼らはしっかりと研究しています。Switch上でユーザーモードからのサービス拒否(DoS)クラッシュ以外のいかなる種類の悪用も、ほぼ成功させることは不可能です。ASLR、強制されたNo-eXecuteページ(実行可能なメモリページに直接書き込むことはできず、ゲームはJITのために専用のシステムモジュールを使用する必要があります!)、ROPが不可能であること、その他にも多くの痛点があります。(改造シーンがすぐにこの言葉を覆してくれるのを待っています…) 一方で、この数ヶ月で、まったく新しいプラットフォームとアーキテクチャ(少なくとも私にとっては)について、非常に短い時間でたくさん学ぶことができました。KartLANPwnで一緒に仕事ができた素晴らしい人々は言うまでもありません!(Pabloとfishguy、ありがとう 😄)
| 日付 | 情報 |
|---|---|
| 2024/07/18 | HackerOne経由で任天堂に報告書を提出 |
| 2024/07/31 | 報告が社内でトリアージされる |
| 2024/09/11 | 中国を除く全地域向けに、マリオカート8 デラックスv3.0.3とともに修正がリリースされる |
| 2024/09/12 | 任天堂から報奨金が支払われる |
| 2024/09/12 | 他の研究者が、v3.0.3のバイナリ差分(bindiff)で「ゲームのネットコードのセキュリティ上の欠陥」の修正をかなり素早く発見 |
| 2024/09/27 | 中国地域向けにマリオカート8 デラックスv3.0.3がリリースされる |
| 2024/09/29 | 任天堂が開示を許可し、このリポジトリが公開される |
| 2024/09/30 | NVDがCVE-2024-45200を公開 |
KartLANPwn © 2024 はCC BY 4.0の下でライセンスされています。
このライセンスのコピーを表示するには、https://creativecommons.org/licenses/by/4.0/ にアクセスしてください。