Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Bad_Hoist-WriteUp — Fire30によるCVE-2018-4386のエクスプロイト実装のSleirsgoevy版であるBad_Hoistの解説記事 | Kitploit
ツール/GitHubGitHub/a0zhar/bad_hoist-writeup
脆弱性分析エクスプロイトウェブアプリケーション悪用論文と研究学習と教育バイナリエクスプロイト
GitHuba0zhar/bad_hoist-writeup

Bad_Hoist-WriteUp

Fire30によるCVE-2018-4386のエクスプロイト実装のSleirsgoevy版であるBad_Hoistの解説記事

リポジトリを見る
11年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Sleirsgoevy 版 Bad_Hoist (Write-up) | CVE-2018-4386

[!Note] PS4 に関する背景情報:
PlayStation 4 コンソールはカスタム AMD x86-64 CPU (8 コア) を搭載しており、その Orbis OS は FreeBSD (v9.0) をベースとし、NetBSD の一部も使用しています。 また、Mono VM や WebKit など、多数の追加オープンソースソフトウェアも含まれています。

PS4 インターネットブラウザ:

PS4 で使用されるインターネットブラウザは、実際にはオープンソースの WebKit プロジェクトで構築されています。 これは、iOS、Wii U、3DS、PS Vita、PS4 のブラウザでウェブページをレンダリングするオープンソースのレイアウトエンジンです。

WebProcess:

PS4 インターネットブラウザは、実際には 2 つの別々のプロセスで構成されています。 コード実行のためにハイジャックするのは WebKit コアプロセスです (HTML と CSS の解析、画像のデコード、JavaScript の実行などを処理します)。 もう 1 つはその他すべてを処理します: グラフィックの表示、コントローラ入力の受信、履歴とブックマークの管理など。

ヒープアロケータ

PS4 WebKit ブラウザは複数のヒープアロケータを採用しており、それぞれが異なるコンポーネントを担当しています。以下はその一覧です:

  • FastMalloc は標準のアロケータです。多くの WebKit コンポーネントで使用されます。
  • IsoHeap は DOM エンジンで使用されます。その目的は、UAF 脆弱性を緩和するために、各割り当てを型ごとに分類することです。
  • Garbage Collector は、JavaScript オブジェクトを割り当てるために JavaScript エンジンで使用されます。
  • IsoSubspace も JavaScript エンジンで使用されます。その目的は IsoHeap と同じですが、一部のオブジェクトに使用されます。
  • Gigacage は、特定のオブジェクトに対する範囲外読み取り/書き込みを防ぐための緩和策を実装します。前述のとおり、PS4 では無効化されています。

Bad_Hoist

CVE-2018-4386 の中核は、PS4 ファームウェア 6.XX で使用されている WebKit (v605.1.15) の JavaScriptCore (JSC) エンジンにおける論理上の欠陥です。この欠陥は BytecodeGenerator::hoistSloppyModeFunctionIfNecessary 関数に存在し、スローモードの JavaScript、特に ループ内での変数ホイスティングの不適切な処理に関係します。

for-in

脆弱なコンポーネント (ForInContext): 私たちが主に対象とするのは ForInContext です。これは、JavaScriptCore が for-in ループの状態を管理し、現在の反復変数と列挙対象のプロパティのセットを追跡するために使用する内部構造です。

for-in ループ内で関数宣言がホイストされる場合、反復変数が上書きされると、エンジンは関連する ForInContext オブジェクトを 無効化 する必要があります。しかし、このバグにより、この無効化は発生しません。これにより、反復変数を 任意のオブジェクト に置き換えることができます。それにもかかわらず、エンジンは変数を文字列プロパティ名として扱い続けます。

その後、op_get_direct_pname バイトコードハンドラが呼び出されると、型チェックを行わずに反復変数を文字列オブジェクトとして直接使用します。

文字列の代わりに巧妙に細工されたオブジェクトを渡して型の混乱を引き起こすことで、メモリ破壊を達成し、さらに addrof、fakeobj、任意の読み取り/書き込み などの有用なエクスプロイトプリミティブを達成することができます。

WebKit 内部: 構造 ID と型の混乱

構造 ID: JavaScriptCore 内のすべてのオブジェクトは、WTF::StringImpl などの内部表現も含め、エンジンにオブジェクトの種類とフィールドの解釈方法を伝える 構造 ID (または型タグ) を持っています。

型の混乱: 私たちのエクスプロイトは CVE-2018-4386 のバグを悪用して、JavaScript オブジェクトを StringImpl として解釈させます。これが create_impl() 関数の目的であり、WTF::StringImpl 型混乱オブジェクトを返し、この Write-up の 脆弱性メカニズム の部分で前述した任意のオブジェクトとして trigger() 関数に渡すことができます。

ただし、これを機能させるには、メモリレイアウトと構造 ID が、エンジンが実際の文字列オブジェクトに期待するものに "十分に近い" 必要があります。

JSString::toIdentifier() は内部的に何をするのか?

PS4 インターネットブラウザの WebKit JavaScriptCore エンジンには、JSString::toIdentifier() という名前のメソッドがあります。このメソッドは JavaScript 文字列オブジェクト (JSString) を内部の Identifier 表現に変換します。

この Identifier は、エンジン全体で、プロパティ名、変数名、および JavaScript エンジンが迅速かつ頻繁に参照する必要があるその他の文字列を効率的に比較、保存、検索するために使用されます。

オブジェクトが有効な文字列であり、その構造 ID がエンジンが文字列オブジェクトに期待するものと一致することを確認します。文字列がロープ (文字列の連結) である場合、変換前にフラット化されることがあります。次に、その文字列の既存の Identifier を取得するか、存在しない場合は新しい Identifier を作成します。

この Identifier は、プロパティと変数の高速な検索のために内部的に使用されます。

JSString::toIdentifier() チェックの回避策

エクスプロイトが 1024 回反復する for ループに入ると、各反復で create_impl() 関数によって返された 32 個の新しい 構造 ID を持つ、新しい型混乱 WTF::StringImpl オブジェクトが作成されます。この型混乱オブジェクトが使用され、任意のオブジェクトとして trigger() に渡されると、JSC はそのオブジェクトに対して JSString::toIdentifier() を呼び出します。

JSString::toIdentifier() は構造 ID の特定のビットをチェックして、オブジェクトが有効な文字列であるか、または文字列として扱うことができるかを確認します。異なるレイアウトと構造 ID を持つ多数のオブジェクトを生成することにより、エクスプロイトは、少なくとも 1 つが JSString::toIdentifier() の内部チェックを通過する構造 ID を持つ可能性を高めます。

参照

  • Project Zero: CVE-2018-4386
  • Synacktiv の公開資料
  • PS4 のハッキング (全 3 部シリーズ) by CTurt
  • Fire30 のオリジナル Bad_Hoist
  • Sleirsgoevy の Bad_Hoist バージョン
ツールをダウンロード