
PS5向けのWebKitベースのカーネルエクスプロイトおよびジェイルブレイク
このリポジトリは、Synacktiv が報告した UMTX race use-after-free (CVE-2024-43102) 脆弱性 を利用した WebKit ROP エクスプロイトです。基本的には fail0verflow's と flatz' のエクスプロイト戦略を移植したものです。UAF を悪用してカーネルスレッドスタックへの読み書きマッピングを取得し、パイプの読み書きを活用してカーネル内での(理想的とは言えない)任意読み書きプリミティブを確立します。この読み書きはさらに、ipv6 ソケットペアとパイプペアを利用した安定した読み書きへと昇格され、以前の IPV6 PS5 kernel exploit と同様の方法でペイロードに渡すことができます。
ページ自体は idlesauce's PS5 Exploit Host を簡素化・改変したもので、psfree を私が以前使用していたコードスタイルに統合する作業をすでに行っていたためです。このホストは動作が非常にスムーズで、便利なペイロードを統合しているため、私個人としても実行時に選択するホストです。近いうちにこのエクスプロイトに対応するよう更新されることを願っています <3。
最終的にはペイロードローダーが起動し、ポート 9021 でペイロード ELF を待ち受けます。PS5 Payload Dev SDK を推奨します。カーネルオフセットが追加されれば、このローダーと完全な互換性があるはずです。
この脆弱性は 1.00 ファームウェアから 7.61 ファームウェアに影響しますが、FW >= 3.00 では追加の緩和策が存在するようで、エクスプロイトの調整が必要です。私は主に低いファームウェアにしか興味がないため、このエクスプロイトは現時点で FW >= 3.00 をサポートしていません。 さらに、チェーンする WebKit の脆弱性は 6.00 で修正されているため、これらのシステムにはユーザーランド読み書きを達成する別の WebKit エクスプロイトが必要です。繰り返しになりますが、私は高いファームウェアに焦点を当てていないため、これは現在未完成のままです。
重要な注意事項
現在サポートされているファームウェアは以下のとおりです:
dns.conf で fakedns を設定し、manuals.playstation.net を PC の IP アドレスに向けますpython fakedns.py -c dns.confpython host.py0.0.0.0 のままにします
ELF ローダーを使用するには、エクスプロイトが完了するまで実行します。完了すると、ポート :9021 でサーバーが起動します。接続して ELF を TCP で PS5 に送信すると実行されます。このローダーは、ブラウザを終了した後もペイロードの受け入れと実行を継続します。
初期の double free
このエクスプロイトの戦略は主に fail0verflow と flatz によるものです。脆弱性の詳細については chris@accessvector's writeup を参照してください。悪用すると、基本的に double free が得られます。これを使用して、カーネルスタックの vmobject を mmap マッピングのものとオーバーラップさせ、カーネルスレッドのスタックへの窓を取得できます。この非常に強力な機能により、スタック上の任意のカーネルポインタを読み書きでき、ASLR の無効化とプリミティブの作成が可能になります。スタックにアクセスできるスレッドを victim thread と呼びます。
任意読み書きの取得
メインスレッドでパイプを作成してパイプバッファを満たし、victim thread を使用してそこに書き込もうとすると、victim thread はバッファに空きができるのを待ってブロックします。この間に、カーネルスタックへの窓を使用して iovec ポインタをカーネルポインタに変更し、フラグを設定してカーネルアドレスとして扱われるようにします。その後、メインスレッドでパイプを読み取ることで、カーネル任意読み取りを取得できます。
同様に、victim thread にパイプを読み取らせると、受信データを待ってブロックします。そこで再度 iovec ポインタを上書きしてカーネルポインタにし、メインスレッドでデータを書き込むことで、カーネル任意書き込みを取得できます。
任意読み書きの昇格
この段階では、実質的な制約のない任意読み書きを保持していますが、動作にマルチスレッドとブロッキングが必要であり、理想的ではありません。次に、R/W を使用してプロセスの FD テーブルを反復し、2 つの IPV6 ソケットの pktopts をオーバーラップさせます。その後、IPV6_PKTINFO sockopt を介して別の任意読み書きを作成できます。ただし、この読み書きプリミティブも、基になるソケットオプションによりサイズと内容に制約があるため、理想的ではありません。このステップは、ほとんどのペイロードなどが構築された IPV6 エクスプロイトのシナリオをエミュレートするために主に保持しています。
パイプを介してより良い読み書きを取得できます。プロセスの FD テーブルを再度反復し、pipemap バッファオブジェクトを変更することで、読み書きを確立できます。IPV6 ソケットペアは、pipemap バッファを制御するメカニズムとして使用されます。
破損の修正/回避
このままの状態でブラウザを閉じようとすると、システムがクラッシュします。これは、プロセスのクリーンアップが、すでに解放されたカーネルスタックを解放しようとするためです。これを回避するために、次の 2 つのことを行います:
td_kstack をゼロにする。FW < 3.00 では、このエクスプロイトは非常に安定しています。唯一の重大な失敗点は、vmobjects のオーバーラップに失敗することです。より高いファームウェアでは、ページ/ヒープアロケータレベルでの緩和策が原因で、このオーバーラップが達成しにくくなっています。
PS5 の研究/開発への貢献に興味がある方は、私が設立した Discord に参加できます こちら。