CVE-2022-24125 および CVE-2022-24126 向けのドキュメントと概念実証コード
2022年8月25日、Dark Souls IIIの新たなゲームアップデート1.15.1が、オンラインサービスの復旧とともにリリースされました。このアップデートでは、CVE-2022-24125とCVE-2022-24126の両方が修正され、さらにゲームのP2Pネットワーキングに存在する多種多様なその他の潜在的なセキュリティ脆弱性(OOB読み取り/書き込み)も修正されました。さらに、他のプレイヤーのセーブデータを破損させる既知のエクスプロイトもすべて修正されています。オンラインマルチプレイ中によく遭遇する「呪いのナイフ」などの一般的なチートもパッチされています。
このリポジトリには、FROM SOFTWAREのゲームに影響を与える最新のRCEエクスプロイトCVE-2022-24126の概念実証コードとドキュメントが含まれています。理論上は他のゲームでも可能ですが、この研究はDark Souls IIIで行われたため、焦点はそちらに当てられています。現時点では概念実証コードはDark Souls IIIにのみ存在しますが、脆弱性は以下のゲームに存在することが確認されています:
脆弱性のあるコードはSEKIROにも存在します(クレジット:LukeYui)が、トリガーする方法はありません。Demon's Soulsでの存在は確認されていませんが、非常に可能性が高いです。クローズドネットワークテストは影響を受けましたが、リリース版のELDEN RINGは影響を受けていません。 実際、Dark Souls IIIに存在していたネットワーククラッシュ、範囲外読み取り/書き込み、およびピアのゲームデータを変更できるエクスプロイトの膨大なリストは、ELDEN RINGではパッチされています。LukeYui によるこのリストの作成と、迅速に対応したFROM SOFTWAREに称賛を送ります!ELDEN RINGは、ハッカーが引き起こせる被害の範囲に関して、疑いなく最も安全なFROM SOFTWAREのタイトルであることを嬉しく思います。
一般に信じられているのとは反対に、これはピアツーピアネットワーキングのエクスプロイトではありません。マッチメイキングサーバーに関連しており、別のマッチメイキングサーバーの脆弱性(CVE-2022-24125)のため、脆弱性を引き起こすためにマルチプレイヤーアクティビティに参加する必要がないという点で、はるかに深刻です。
サーバー停止前の数ヶ月間、平均同時プレイヤー数が約20,000人であったことを考えると、これは即座に修正が必要な問題であることは明らかでした。特にELDEN RINGにも存在する可能性があったからです。FROM SOFTWAREが、概念実証ビデオと詳細なエクスプロイトドキュメント(このREADMEの大部分はこれに基づいています)を含む私の最初の報告から40日以上経っても行動を起こさなかったため、私はエクスプロイトの存在を無害な方法で公に示し、開発者に対応を促す注意を喚起することを決意しました。そしてそれは功を奏しました。
これらの3つのガジェットの詳細についてはこちらを参照してください。他のゲームでこの仮想呼び出し方式が実現可能でない場合、任意のコードリダイレクトは、より伝統的なROPエクスプロイトをセットアップするためにも使用できます。
概念実証コードを実行するには、まず接続先のサーバーが必要です。公式サーバーはエクスプロイトのために無効化されていますが、ds3os を使用してプライベートサーバーをセットアップできます。ds3os は小売サーバーの動作を可能な限り模倣するように設計されていますが、このエクスプロイトを修正するためのセキュリティパッチがすでにこのプロジェクトに適用されています。ただし、BuildConfig.h で SEND_MESSAGE_TO_PLAYERS_SANITY_CHECKS と NRSSR_SANITY_CHECKS の定数を false に設定して自分でプロジェクトをビルドすることで、テスト環境をセットアップすることもできます。これにより、安全でない小売サーバーの動作が模倣されます。ds3os が提供する手順に従ってゲームを起動し、サーバーに接続します。
これが完了し、ゲームがサーバーに接続されたら、PoCコードをビルドして Injector.exe 実行可能ファイルを起動します。これにより、エクスプロイトコードを含むDLLがDark Souls IIIプロセスに注入されます。このDLLは、FRPGメッセージをサーバーに送信するゲーム関数を使用して、自分のクライアントにエクスプロイトを配信します。
関数 140ca5010 はエントリサイズをチェックしますが、140ca4fa0 は可変サイズのエントリ用であり、サイズフィールドに対する健全性チェックを実行しません(バグ #1)。上記の任意のコードリダイレクトエクスプロイトを達成するには、これを 14F3B0 に設定する必要があります。これにより約1.3MiBの範囲外読み取りが発生しますが、メモリページはアクセス違反を回避するのに十分な大きさであるはずです。
140ca56b0前の関数によって nrssr_data を引数として呼び出されます。スタック上に DLMemoryInputStream オブジェクトを作成し、それがNRSSRパーサーに引数として渡されます。
141955f50: ParseNRSessionSeachResultNRSessionSearchResult パーサー。NRSSRの署名とバージョン番号を検証し(14196a0f0)、プロパティリスト(14196a260)、ホスト名(14195603a)、およびその他の情報(rce.hを参照)を解析します。
14195603a上記の関数内のループで、ホスト名を安全でない方法でコピーします(バグ #2)。バッファオーバーフロー中に何が起こっているかを追跡するのに役立つアドレスをいくつか示します:
14F128DLMemoryInputStream スタックアドレス:14F3A0DLMemoryInputStream vtable ポインタ:1439e8b30DLInputStreamReader が使用する DLMemoryInputStream の仮想関数のオフセット:0x181439e8b48MOV RCX,qword ptr [RCX + 0x8]
MOV RAX,qword ptr [RCX]
JMP qword ptr [RAX + 0x40]
上書きされたメモリストリームvftableによって引き起こされた最初のコードリダイレクトの後に辿り着く場所です。ここから仮想呼び出しリダイレクションチェーンが始まります。
Dark Souls III Ver. 1.15 の場合。理論上の最大ペイロードサイズはスタックレイアウトに依存するため、ゲームとバージョンによって異なります。 ↩