PS5 3.xx / 4.xx カーネルエクスプロイト
概要
このリポジトリには、HackerOne に報告された TheFlow の IPV6 Use-After-Free (UAF) に基づく PS5 カーネルエクスプロイトの実験的な WebKit ROP 実装が含まれています。エクスプロイト戦略はおおむね TheFlow の BSD/PS4 の PoC に基づいていますが、厄介な PS5 のメモリレイアウトに対応するためにいくつか変更を加えています(詳細は 研究ノート セクションを参照)。任意読み取り / (半任意)書き込みプリミティブを確立します。このエクスプロイトとその機能には多くの制限があり、そのため主に開発者がシステムの一部をリバースエンジニアリングするために試すことを目的としています。
最新の安定性の改善により、信頼性は約 80% です。このドキュメントには PS5 に関する研究情報が含まれており、このエクスプロイトは今後も継続的に開発・改善されていきます。
PS5 の研究/開発に貢献したい方は、私がセットアップした Discord に参加できます こちら。
エクスプロイトは現在、以下のファームウェアをサポートしています:
- 3.00
- 3.10
- 3.20
- 3.21
- 4.00
- 4.02
- 4.03
- 4.50
- 4.51
現在含まれているもの
- 任意読み取り/書き込みを取得し、読み取り/書き込み用の基本的な RPC サーバー(または大量読み取り用のダンプサーバー)を実行できます(673〜677 行目で独自のアドレス/ポートをエクスプロイトファイルに編集する必要があります)
- デバッグ設定メニューを有効にします(注: 設定を完全に終了して再度入り直すと表示されます)。
- root 権限を取得します
制限事項
- このエクスプロイトは読み取り/書き込みを実現しますが、コード実行はできません。これは、カーネルの .text ページが eXecute Only Memory (XOM) としてマークされているため、現時点ではガジェット用のカーネルコードをダンプできないためです。カーネルの .text ポインタを読み取ろうとするとパニックになります!
- 上記に加えて、ハイパーバイザー (HV) がカーネルの書き込み保護を強制しているため、このエクスプロイトはカーネル空間にパッチやフックをインストールすることもできません。つまり、現時点ではホームブリュー関連のコードはありません。
- Clang ベースのファイングレインな Control Flow Integrity (CFI) が存在し、強制されています。
- Supervisor Mode Access Prevention/Execution (SMAP/SMEP) は HV のため無効化できません。
- 書き込みプリミティブにはいくつかの制約があり、バイト 0x10-0x14 はゼロ(または有効なネットワークインターフェース)でなければなりません。
- ただし、パイプを使用した新しい研究により、現在では完全な任意読み取り/書き込みが可能です
使い方
dns.conf を介して fakedns を設定し、manuals.playstation.net が PC の IP アドレスを指すようにします
- fake dns を実行:
python fakedns.py -c dns.conf
- HTTPS サーバーを実行:
python host.py
- PS5 の詳細なネットワーク設定に移動し、プライマリ DNS を PC の IP アドレスに設定し、セカンダリは
0.0.0.0 のままにします
- マニュアルがそれでも読み込まれないことがあり、再起動が必要な場合があります。なぜなのかはよくわかりませんが、本当に奇妙です
- 設定のユーザーマニュアルに移動し、信頼できない証明書のプロンプトを受け入れて実行します
- 任意: rpc/dump サーバースクリプトを実行します(注: アドレス/ポートはバイナリ形式で exploit.js に置き換える必要があります)
今後の作業
ELF ローダーの使用方法
ELF ローダーを使用するには、エクスプロイトが完了するまで実行してください。完了すると、ポート :9020 でサーバーが起動します。接続して ELF をそのポート経由で PS5 に送信すると、実行されます。ELF がブラウザをクラッシュさせない限り、ELF を永久に実行し続けることができます。
エクスプロイトのステージ
このエクスプロイトは5つのステージで動作し、おおむね theflow の PoC と同じエクスプロイト戦略に従います。
ip6_pktopts で最初の UAF をトリガーし、2つのソケットが同じ pktopts を指すようにする / オーバーラップさせる(マスターソケット <-> オーバーラップスプレーソケット)
- マスターソケットで
pktopts を解放し、タグ付き tclass オーバーラップを含む ip6_rthdr スプレーで偽装します。
- 情報漏えいステップ。
pktopts/rthdr のオーバーラップを使用して、0x200 スラブから kqueue を、0x100 スラブから pktopts を漏えいさせます。
- 任意読み取り/書き込みステップ。
pktopts を再度偽装し、オーバーラップソケットを見つけて IPV6_RTHDR を読み取り/書き込みプリミティブとして使用します。
- クリーンアップ + パッチステップ。ブラウザを正常に終了させるために破損したソケットの参照カウントを増やし、デバッグメニューを有効にするためにデータをパッチし、uid0 の ucreds をパッチします。
- ELF を受け入れてロード/実行する ELF ローダーサーバーを実行します。現在 WIP であり、現時点ではリロケーションには対応していません。
安定性に関するノート
このエクスプロイトの安定性は約 30% 80〜90% で、2つの潜在的な失敗ポイントがあります。観測された発生確率の高い順に:
- ステージ 1 が UAF の回収に失敗し、即時のクラッシュまたはクラッシュを引き起こす潜在的な破損が発生する
- ステージ 4 が victim ソケットの発見に失敗する
研究ノート
さまざまなテストと読み取りプリミティブによるダンプに基づくと、PS5 は PS4 の 0x4000 と比較して 0x1000 のページサイズに戻ったようです。
- さらなる調査の結果、ページサイズは実際には依然として 0x4000 ですが、一部の常識を疑うようなアロケータの変更により、異なるスラブが同じ仮想ページ内に割り当てられる可能性があります。
- また PS5 では、隣接するページが同じスラブに属することはほとんどないようです。隣接するページでは大幅に異なるデータが得られるためです。メモリレイアウトはより散在しているように見えます。
- PS5 がパニックすると(少なくとも WebKit コンテキストでは)、オーディオバッファが何らかの形で破損するため、ひどいオーディオ出力が発生することがよくあります。
- このオーディオの破損が次の起動まで持続することがありますが、理由は不明です。
- PS4 と同様に、PS5 ではパニック後の再起動のためにコンソールの電源ボタンを手動で2回押す必要があります。
- PS5 がインターネットから隔離されている場合、パニックからの再起動に途方もない時間がかかるのは正常です(残念ながら)。起動には3〜4分かかると予想してください。
貢献者 / スペシャルサンクス
テスターへの感謝