V8 Sentinel Value の脆弱性: 保護をバイパスすることで任意のコードが実行される

robot
概要作成中

Sentinel Valueを使用してChrome V8の保護を突破する方法を探る

Sentinel valueはアルゴリズムにおける特別な値であり、通常はループや再帰アルゴリズムの終了条件として使用されます。Chromeのソースコードには、さまざまなSentinel valueが存在します。以前の研究では、TheHoleオブジェクトの漏洩を通じて、特定のCVEのサンドボックス内での任意のコード実行が可能であることが示されています。Googleのチームは、我々がその緩和策の回避を説明した約1週間後に、関連するCVEを迅速にGitHubに更新しました。

Chrome のソースコードから、TheHole オブジェクトによる任意のコード実行を防ぐための緩和修正が確認できます。しかし実際には、V8 には JS に漏洩すべきではない他の多くのネイティブオブジェクトがあります。本稿では、Uninitialized Oddball オブジェクトについて議論します。このバイパス手法は、Issue1352549 で最初に登場しました。注目すべきは、この手法が現在の最新版 V8 でも依然として利用可能であり、Google はこれに対する修正を行っていないということです。

この方法は高い汎用性を持っています:

  1. Issue1216437(CVE-2021-30551)で初めて提示されたPOCは、内部の初期化されていないオッドボールの漏洩です。

  2. Issue1314616(CVE-2022-1486) の POC も直接リークしました。

  3. Issue1352549(NoCVE)の影響は無視できません。

これらは、PatchGapの影響を受ける可能性のあるソフトウェアを再評価する必要があることを十分に示しています。

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

V8 のセンチネル値

V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、メモリ内で隣接して配置されています。これらの漏洩してはいけないネイティブオブジェクトがJavaScriptに漏洩すると、サンドボックス内で任意のコードが実行される可能性があります。

この方法が最新の V8 で有効であることを確認するために、V8 のネイティブ関数 %TheHole() を変更して、Uninitialized Oddball を返すようにできます。

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

HardenTypeのバイパス

Issue1352549 中に完全なコードが示されており、それを抽出して簡略化した後、V8 11.0.0 でテストしても相対的な任意読み取りが実現可能です。

最適化された JavaScript read 関数の逆アセンブルを見てみると、obj.prop をチェックする際に、obj.prop をキーとする値をチェックせず、JavaScript の意味論に従ってオフセットを計算して配列の値を取得していることがわかります。これにより、計算時に型の混乱が生じ、任意の読み取りが実現されます。

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

uninitialized_oddballを渡すと、OBJが開始点として使用され、最終的にvmovsd xmm0,[r9+r11*8+0x7]命令で任意の読み取りが完了し、データがxmm0レジスタに保存されます。

uninitialized_oddball が V8 メモリ内で前方にソートされ、より原始的であるため、偽造が容易であり、回避の優先方法です。任意の書き込みについては、Issue1352549 の構造分析を参照してください。

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

修正の提案は、最適化された関数が配列要素を返す際に、配列のマップをチェックして、オフセットを直接計算して配列の値を返すのを避けることです。

PatchGapの警告

Issue1352549を分析した後、PatchGapの可能性のあるソフトウェアを調査し、Skypeが未だにその脆弱性を修正していないことを発見しました。x86の任意の読み書きはわずかに異なり、アドレス圧縮がないため、プロセス全体に対して直接的です。

Skypeの利用において、ASLRが有効になっているにもかかわらず、ファイルが大きすぎるため、ハッカーは特定の固定アドレスに対して読み書きするだけで、Skypeファイルの内容にアクセスできる可能性が高いです。PE解析などの従来のアプローチと組み合わせることで、全体の脆弱性利用チェーンを完成させることは難しくありません。

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

今回のPatchGapはIssue1352549だけでなく、新しいバイパス方法の公開により、Issue1314616やIssue1216437に類似した脆弱性の悪用が大幅に容易になりました。ハッカーはほとんど研究コストをかけずに、過去の未初期化のuninitialized_oddball脆弱性を完全に悪用することができます。

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

サマリー

この記事では、uninitialized_Oddball を介して任意の読み取りプリミティブを実現する方法について簡単に説明します。V8 には他にも多くの Sentinel 値があり、テスト中に非 int3 のクラッシュに遭遇することも容易です。Uninitialized_Oddball と TheHole が V8 の保護を回避できるので、他の Sentinel 値にも同様の問題が存在する可能性があります。

これにはいくつかの示唆があります:

  1. 他のuninitialized_OddballリークもV8のRCEを簡単に達成できますか?

  2. グーグルは TheHole のバイパスを迅速に修正しましたが、ガベージコレクションを利用した ASLR のバイパス問題は長期間放置されており、類似の問題が正式なセキュリティ問題と見なされるかどうかは依然としてあいまいな境界が存在します。

  3. それを正式なセキュリティ問題と見なす場合、fuzzer 内で %TheHole/uninitialized_Oddball などのセンチネル値を変数として考慮する必要はありますか?他の利用原語を掘り下げるために。

この種の問題が正式にセキュリティ問題として見なされるかどうかにかかわらず、それはハッカーが完全な利用を実現するサイクルを大幅に短縮します。

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value

原文表示
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • 報酬
  • 6
  • 共有
コメント
0/400
OptionWhisperervip
· 9時間前
この脆弱性はひどいですね、小さな細部が致命的です。
原文表示返信0
OnchainFortuneTellervip
· 9時間前
このバグは素晴らしい
原文表示返信0
ExpectationFarmervip
· 9時間前
脆弱性は本当に防ぎきれません!
原文表示返信0
MysteryBoxBustervip
· 9時間前
v8はまた失敗した 熱いなあ
原文表示返信0
BlockchainFriesvip
· 9時間前
タイトルを一瞥しただけで目が回った
原文表示返信0
alpha_leakervip
· 9時間前
コードの実行は素晴らしいです、バグの兄弟
原文表示返信0
  • ピン
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)