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.
Chrome V8エンジンSentinel Valueのセキュリティ脆弱性の詳細な分析
Chrome V8エンジンにおけるセンチネル値のセキュリティリスクについての詳細な考察
Sentinel値はアルゴリズムにおける特別な値で、通常はループや再帰アルゴリズムの終了条件として使用されます。ChromeのソースコードではSentinel値が広く使用されています。最近、セキュリティ研究者はTheHoleオブジェクトの漏洩を通じてChromeサンドボックス内で任意のコード実行が可能であることを発見しました。Googleチームはこの脆弱性を迅速に修正しました。
しかし、V8にはJavaScriptに漏洩すべきではない他のネイティブオブジェクトも存在します。本稿では、初期化されていないOddballオブジェクトの漏洩がより広範なセキュリティリスクを引き起こす可能性があることに焦点を当てます。現在、この問題に対する修正は行われておらず、この手法は最新のV8でも引き続き使用可能です。
注目すべきは、この方法が非常に汎用性が高いことである:
リークされた内部の初期化されていないオッドボールのpocは、CVE-2021-30551で最初に提案されました。
CVE-2022-1486は、POCでUninitializedOddballも直接リークしました。
Issue1352549(は未割り当てのCVE)で、完全なエクスプロイトコードを示しています。
これらのケースは、影響を受ける可能性のあるソフトウェアを徹底的に検査する必要性を十分に示しています。現時点で、Skypeはこの脆弱性を修正していません。
V8のセンチネル値
V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、これらのオブジェクトはメモリ内で隣接して配置されています。一度、漏洩してはいけないネイティブオブジェクトがJavaScriptに漏洩すると、サンドボックス内で任意のコードを実行できる可能性があります。
この方法が最新のV8で有効であることを検証するために、V8のネイティブ関数を修正して、Uninitialized OddballをJavaScriptに漏らすことができます。具体的な方法は、%TheHole()関数内のisolateに対するオフセットを変更して、Uninitialized Oddballを返すようにします。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
HardenType保護のバイパス
Issue1352549で提供されたコードを簡略化することで、V8 11.0.0バージョンで相対的な任意読み取りを実現できます:
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
%TheHole()がUninitializedOddballを返すとき、最適化されたJavaScriptのread関数は、obj.propのValueをチェックすることなく、JavaScriptの意味論に従ってオフセットを直接計算し、タイプ混乱を引き起こし、任意の読み取りを実現します。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
TheHoleオブジェクトに似て、uninitialized_oddballはV8メモリ内でより前にソートされ、より原始的で、偽造が容易です。TheHoleの緩和策が回避された後、この方法は優先される回避策となりました。
最適化された関数が配列要素を返すときに、配列のマップをチェックして、オフセットを直接計算して配列の値を返さないようにすることをお勧めします。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
PatchGapの警告
Issue1352549を分析した結果、Skypeは現在もその脆弱性を修正していないことがわかりました。x86環境下では、任意の読み書きがわずかに異なります:アドレス圧縮がないため、任意の読み書きはプロセス全体に対して直接行われます。
SkypeはASLRを有効にしていますが、ファイルが大きいため、直接4GBのメモリに置かれると、攻撃者は特定のアドレスに対して読み書きを行うだけで、Skypeファイルの内容にアクセスできる可能性が高くなります。PE解析などの従来の手法を組み合わせることで、完全な脆弱性の悪用チェーンを完成させることは難しいことではありません。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
今回のPatchGapはIssue1352549だけでなく、新しいバイパス方法の公開により、CVE-2022-1486やCVE-2021-30551のような脆弱性の悪用の難易度が大幅に低下しました。攻撃者は、uninitialized_oddballの漏洩に関する脆弱性を完全に利用するために、ほとんど追加の研究を行う必要がありません。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
まとめ
この記事では、Sentinel value内のuninitialized_Oddballを漏洩させることによって任意の読み取り原語を実現する方法について簡単に説明します。V8には他にもSentinel valueが存在し、テスト中にクラッシュが発生することがよくあります。Uninitialized_OddballとTheHoleの両方がV8で環境バイパスを実現できることを考慮すると、他のSentinel valueも同様の問題を引き起こす可能性があると疑う理由があります。
これが私たちに以下の示唆を与えます:
1.他のuninitialized_OddballリークはV8のRCEを簡単に達成できますか?
GoogleはTheHoleのバイパスを迅速に修正しましたが、長期にわたってガベージコレクションを利用したASLRのバイパスが放置されていることは、このような問題が正式なセキュリティ問題と見なされているかどうかに依然として曖昧な境界が存在することを示しています。
もしそれを正式なセキュリティ問題と見なすなら、fuzzerに%TheHole/uninitialized_OddballなどのSentinel値を変数として追加する必要がありますか?他の利用原語を発掘するために。
いずれにせよ、この種の問題は攻撃者が完全な悪用を実現するサイクルを大幅に短縮します。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value