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.
V8 Sentinel Value の脆弱性: 保護をバイパスすることで任意のコードが実行される
Sentinel Valueを使用してChrome V8の保護を突破する方法を探る
Sentinel valueはアルゴリズムにおける特別な値であり、通常はループや再帰アルゴリズムの終了条件として使用されます。Chromeのソースコードには、さまざまなSentinel valueが存在します。以前の研究では、TheHoleオブジェクトの漏洩を通じて、特定のCVEのサンドボックス内での任意のコード実行が可能であることが示されています。Googleのチームは、我々がその緩和策の回避を説明した約1週間後に、関連するCVEを迅速にGitHubに更新しました。
Chrome のソースコードから、TheHole オブジェクトによる任意のコード実行を防ぐための緩和修正が確認できます。しかし実際には、V8 には JS に漏洩すべきではない他の多くのネイティブオブジェクトがあります。本稿では、Uninitialized Oddball オブジェクトについて議論します。このバイパス手法は、Issue1352549 で最初に登場しました。注目すべきは、この手法が現在の最新版 V8 でも依然として利用可能であり、Google はこれに対する修正を行っていないということです。
この方法は高い汎用性を持っています:
Issue1216437(CVE-2021-30551)で初めて提示されたPOCは、内部の初期化されていないオッドボールの漏洩です。
Issue1314616(CVE-2022-1486) の POC も直接リークしました。
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 値にも同様の問題が存在する可能性があります。
これにはいくつかの示唆があります:
他のuninitialized_OddballリークもV8のRCEを簡単に達成できますか?
グーグルは TheHole のバイパスを迅速に修正しましたが、ガベージコレクションを利用した ASLR のバイパス問題は長期間放置されており、類似の問題が正式なセキュリティ問題と見なされるかどうかは依然としてあいまいな境界が存在します。
それを正式なセキュリティ問題と見なす場合、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