PS5&PS4 修正不可能?なPS2エミュレーターのexploitの件

記事の方法を試す前や質問をするまえに必ず下記リンクを見てからにしてください!
このブログについて
http://yyoossk.blogspot.jp/1970/11/blog-post_24.html




調べたら、このタイトルは日本のpsnでは配信されていませんでした


最初に書いておきますが、このexploitはpsnで配信されているPS2のゲームであるボクと魔王のexploitを使用し、別のps2のゲームを起動するというもの
しかもパッチでexploitを封じることができないらしい
といっても、psnからそのゲームを削除すれば済む話
psnに繋がないとできないため最新バージョンにするしかありません
現段階では、別のゲームを起動するだけだが、任意のコードを走らせることも可能になるだろうとのこと
もしpsnでゲットしておけば永久不滅のexploitとして利用される可能性もないとは言い切れませんが、psnから削除されたら終わりです
現在解析が進んでるps5の3.00から4.50を捨ててまでこのexploitに期待する必要があるのか現段階では分かりませんが、個人的には微妙な気がしますが、どうなるか分かりません

PS2エミュレータでPS4 / PS5をハックする
 - Part 1 - Escape
今回は、PlayStation 4用に開発されたPS2エミュレータから脱出することに成功した方法について説明します。
エクスプロイトチェーンの次の部分と、調査に対するPlayStationの対応について取り上げたPart 2(公開予定)もご覧ください。
せっかちな方のために、このチェーンの最初の部分のデモビデオを本記事の後半で紹介しています。
なお、これらの脆弱性は2021年9月に発見・報告されましたが、今になってようやく公開することができました。

PS5がリリースされ、PlayStationのバグバウンティプログラムが導入されたことで、PS5で動作するエクスプロイトチェーンを試そうという気になりました。
PS2エミュレータを攻撃することにしたのですが、このターゲットが非常に魅力的であることがわかったのは、いくつかの理由があります。
PS2エミュレータを回避することで、PS4、PS5、そしてPSNクラウドゲームサービス上で海賊版PS2ゲームを動作させることが可能になります。
PS2エミュレータは、PS4™、PS5™、そしてPSNクラウドサービスでも利用できるようになります。
PS2エミュレータは、PS5に残された最後のJIT特権付きコードの一部です。
ソニーは、WebブラウザとBluRayプレーヤーの両方でJITを無効化し、PS5からJIT特権の攻撃対象領域を積極的に削除しました。PS2エミュレータは、後方互換性によりPS4のタイトルとして動作しているため、ソフトウェアに変更を加えることができず、そのJIT特権を惜しむ必要があったのです。
JIT権限を持つということは、コンパイラのコプロセスを含むエミュレータを完全に妥協することで、PS4/PS5上で任意のネイティブコード(ROPだけではない)をカーネルエクスプロイトなしで完全に実行できる能力を付与できることを意味します。PS5では、新しく導入されたハイパーバイザーによって、コードページ(ユーザーランドとカーネルの両方)が読めないように強制されており、BadIRETをカーネルダンプなしでPS4に移植したときのように、ブラインドカーネルエクスプロイトを再び書こうとする根気はないため、これは特に便利な機能だろうと思います。
PS4のゲームプロセスで任意のコードが実行されると、JIT最適化エミュレータを含む自作ソフトウェア、そして潜在的には一部の海賊版商用PS4ゲームもこのコンテキストで実行される可能性があります。
PlayStation®のセキュリティ・モデルの下では、この問題は基本的に修正不可能です。
一旦、悪用可能なゲーム(デジタルまたは物理的なもの)にアクセスすると、PlayStationがそのアクセスを削除することは極めて困難です。
つまり、古いバージョンのゲームでも、常に最新バージョンのOSでプレイすることができるのです。
物理的なゲームの場合、アップデートを確認することなく、単に起動することができます。
デジタルゲームの場合は、PSNトラフィックをプロキシングすることでダウングレードできます(サーバー側のコスト削減のため、HTTPSではなく単なるHTTPです)。
これは、サードパーティのゲーム(特に古いバージョンの WebKit に静的にリンクしているゲーム)のセキュリティに PlayStation が責任を持てないため、このように設計されています。彼らのセキュリティモデルは、プラットフォーム(PS5ではカーネルとハイパーバイザー)の高権限レイヤーのセキュリティに焦点を当て、ゲームが危険にさらされることを前提に運用されています。
PS2エミュレータのJITのような特別な特権を持つゲームの存在は、特権を持つコードに将来起こりうる脆弱性を修正するメカニズムが容易に利用できないため、彼らのセキュリティモデルに根本的に違反していると私は解釈しています。
さらに、PlayStationは、このセキュリティモデルに対して二の足を踏んでおり、悪用されやすいことが判明しているPS2ゲームをストアから削除することさえしていません。これらの理由から、私は、このシナリオを、技術的には完全には正確でないにしても、「パッチが当てられない」と呼ぶことに納得しています。

PS2エミュレータの解剖学
エミュレータは、メインのアプリケーションプロセス (eboot.bin) と、そのコンパイラの子プロセス (ps2-emu-compiler.self) の 2 つの別々のプロセスに分かれています。
カーネルはこれらのプロセスにそれぞれ異なる権限を割り当てており、sceSblACMgrIsJitApplicationProcessとsceSblACMgrIsJitCompilerProcess関数(PS4カーネルにまだシンボルがあった頃の名前です)の結果を確認することで実装されています。
コンパイラはコードを書くことができ、アプリケーションはコードを実行することができます。
以前はこのチェックが正しく実装されておらず、PS4ファームウェア1.76のブラウザアプリケーションプロセスは書き込み可能なマッピングと実行可能なマッピングの両方を作成できましたが、現在では完全に任意のコードを生成できるようにするために両方のプロセスを制御する必要があるため、このチェーンのゴールはそこになります。

PS2コード実行のエントリーポイント
我々のexploitチェーンは、PS2ゲームを悪用して、セーブゲーム悪用または純粋なコントローラトリガーexploitにより、エミュレータ内でのコード実行を実現することから始まります。
例えば、GTAのデコンパイルでは、メモリカードから固定サイズのバッファにコピーされ、そのサイズはセーブによって提供されます。これらの脆弱性を利用すれば、ハッキングされたPS4のファームウェア(SAMUキーがあればPCでも可)を用いて、PS2メモリカードを含むPS4のセーブファイルを任意のPSN-IDで暗号化して署名し、設定のUSBセーブインポート機能を用いてターゲットのPS4/PS5へインポートすることが可能です。

PSNにサインインしていること(セーブはアカウントごとに暗号化されているため)に依存し、長時間オフラインにするとPS5でタイムアウトするUSBセーブインポート機能を必要としない機能を持つことを除けば、コントローラ入力トリガー型のエクスプロイトは実用的ではないでしょう。
この方法で攻略可能なPS4で発売されているPS2ゲームを簡単に検索したところ、Dark Cloudが該当することがわかりました(アイテムメニューの同じフレームでカーソル移動とXキーを押すと、境界外メモリからアイテムを拾えるという数十年前の既知のバグがあり、その結果攻略可能です)。
しかし悲しいかな、このゲームはPS4デジタルリリースのみでPS4物理ディスクリリースはありませんでした(したがってPSN要件は解除されません)。
私のチェーンでは、プレイヤー/タウン名を拡張すると典型的なスタックバッファオーバーフローが発生するボクと魔王に落ち着きました。

カスタム PS2 ゲームの起動
さて、PS2 エミュレータを無事脱出させたところで、まず最初にやってみたいことは、他のゲームを起動することです。
外部ゲームファイルを取得するには、いくつかの方法があります。
しかし、PS4のセーブゲームにはファイルサイズの制限があるため(確か1GBだったと思うが、サイバーパンクの発売に合わせて少し引き上げられた)、多くのPS2ゲームではこの方法は使えないだろう。
また、私がPS4 1.76 WebKitとJIT exploit用のネイティブGameBoyエミュレータProof-of-Conceptで行ったように、USBとFATの実装を手動で移植すれば、USBストレージからゲームをコピーできるかもしれません(マウントシステムコールが制限されているため)。
私は、各実行時にローカルネットワーク経由で目的のゲームをコンソールにアップロードすることにしました。私の初歩的な概念実証では、Klonoa 2のような1.3GBのゲームを圧縮せずにWiFi経由で20分近くかかりましたが、これは確実に改善されるはずです。
ISO ファイルがファイルシステム上のどこかにアクセスできるようになったら、ディスクファイル (/app0/images/disc01.iso) を開くエミュレータのコードを見つけるには、sceKernelOpen にブレークポイントを設定し、エクスプロイトを使ってそれを呼び出すだけでした (Traversed Path は、.../../bla/boot/iso のようになっています)。 /../bla/boot.iso のようなトラバースパスで内部チェックを回避)、残っている破損を元に戻し、最後に PS2 コードに LoadExecPS2 を呼び出して、新しくマウントした仮想ディスクで ELF を起動し、新しいゲームを開始させました。
エミュレータは同梱されているゲーム(この場合はボクと魔王)専用に設定されていることに注意してください。また、設定の一部はエクスプロイトによって実行時に調整できるかもしれませんが、他のゲームとの互換性は一般的に不安定になることが予想されます。


第1部 結論
PS2は、パッチがないにもかかわらず、公開できるのが楽しいところですが、私の主な目標は、ネイティブの自作アプリケーションを動作させることでした。
この目標に関しては、エミュレータからの脱出はチェーンの前半に過ぎません。私たちのアプリケーションプロセスは、JIT共有メモリを書き込み可能ではなく実行可能としてマッピングする権限しか持っていないので、任意のネイティブコードを書くことはまだできません。
技術的には、PS4 のネイティブ機能を利用できる「PS4 拡張」PS2 自作アプリケーションを書くことも可能で、その場合、通常の PS4 自作アプリケーションと同じ動作(PS4 コントローラーのタッチパッドへのアクセスなど)が可能ですが、私はより実用的な自作環境として、完全に任意のコードを実行できるようにしたいと思いました。そのため、次のステップではコンパイラのプロセスを攻撃することになります

コメント