
1.xx~2xxファームウェア向けPS5ハイパーバイザーエクスプロイト。
PS5 ハイパーバイザーエクスプロイト(ファームウェア <= 2.xx 対応)。このリポジトリには 2 つの脆弱性とエクスプロイトチェーンが含まれており、それぞれ独立しているため、どちらか一方を使用できます。一方のエクスプロイトは主に保存目的で提供されており(/_old_jump_table_exploit)、通常は主要なエクスプロイトチェーン(QA フラグエクスプロイト)のみを使用すればよいです。
この研究は hardwear.io NL 2024 で発表されました。スライドはこちらから入手できます。講演動画は近日公開予定です。
ジャンプテーブルエクスプロイト
最初のエクスプロイトは、ハイパーバイザーコードのジャンプテーブルがゲストカーネルと共有されている脆弱性を利用し、/_old_jump_table_exploit/ に含まれています。VMMCALL_HV_SET_CPUID_PS4 ハイパーコールのジャンプテーブルエントリをハイジャックすることで、ハイパーバイザー内でのコード実行を達成します。ネステッドページング(NPT)とゲストモード実行トラップ(GMET)を無効化する ROP チェーンを実行し、カーネルのページテーブルエントリ(PTE)内の eXecute Only Memory(XOM)別名 xotext を無効化してダンプできるようにし、さらに PTE に書き込みを有効化してカーネルのフック/パッチも行えるようにします。
この手法はかなりの数のガジェットとオフセットを必要とするため、このエクスプロイトが主要なものではない主な理由となっています。また、現在は ROP チェーンが実行されるコア上でのみハイパーバイザーを破壊でき、他のコアではハイパーバイザーが依然としてアクティブなため、無効化する必要があります。
QA フラグエクスプロイト
主要かつ推奨されるエクスプロイトは、システムの品質保証(QA)フラグがハイパーバイザーとゲストカーネル間で共有されている事実を利用します。ハイパーバイザーの初期化時に、ネステッドページテーブルを構築する init コードは QA フラグ内の System Level(SL)デバッグフラグをチェックします。このフラグが設定されている場合、ネステッドページテーブルエントリ(PTE)のカーネル .text ページには xotext ビットが設定されず、さらにカーネル .text ページには書き込みビットも設定されます。
これらのフラグは、スリープモードからの復帰時にセキュアローダーによって再初期化されませんが、ハイパーバイザーは再初期化されます。SL フラグを設定してシステムをスリープ状態にし、復帰させることで、ゲストカーネルのページテーブルを編集してカーネル .text ページを読み取り/書き込み可能にし、カーネルのダンプとフック/パッチを可能にします。
このエクスプロイトペイロードは PS5-Payload-Dev SDK を使用してビルドされます。また、hen/ のビルドはやや特殊で、カーネルコードケーブにコピーされるフラットバイナリにコンパイルされます。hen/ 内のコード全体はスーパーバイザー/カーネルモードで実行されます。
byepervisor.elf を送信します。byepervisor.elf をもう一度送信します(John Tornblom の ELF ローダーを使用している場合、復帰後も ELF ローダーはペイロードを受け付け続けるはずです。受け付けない場合は UMTX エクスプロイトを再度実行する必要があります)。byepervisor.elf の送信を 1 回だけで済むようにするPS5 の研究/開発に貢献したい方は、私が開設した Discord に参加できます。こちら