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 HardenProtect をバイパスし、Sentinel 値をリークします
Sentinel valueはアルゴリズムにおける特殊な値で、ループや再帰アルゴリズムの終了条件によく使用されます。Chromeのソースコードには複数のSentinel valueが存在します。以前の研究では、TheHoleオブジェクトを利用してサンドボックス内で任意のコードを実行する方法が指摘されました。本稿では、もう一つのV8ネイティブオブジェクト - Uninitialized Oddballについて議論します。この方法は現在でも最新のV8で使用可能です。
この方法は普遍性を持っています:
1.リークされた内部初期化されていないオッドボールの概念は、Issue1216437で最初に提案されました。
Issue1314616でもUninitializedOddballが直接漏洩していることが明らかになりましたが、その時の利用方法はまだ明確ではありません。
Issue1352549はその潜在的な影響に注目する価値があります。
現在、一部のソフトウェアはまだこの脆弱性を修正していません。
V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、これらのオブジェクトはメモリ内で隣接して配置されています。一度、漏洩してはならないネイティブオブジェクトがJavaScriptに露出すると、サンドボックス内で任意のコード実行が可能になる可能性があります。
この方法を検証するために、V8のネイティブ関数を変更し、Uninitialized OddballをJavaScriptに漏らすことができます。具体的には、%TheHole()関数のisolateに対するオフセットを変更できます。
この回避方法のコアコードは以下の通りです:
JavaScriptの 関数 read(obj, prop) { obj[prop]を返します。 }
uninitialized_oddball = %TheHole(); arr = [1.1, 2.2, 3.3];
(letの場合、i = 0; 私は100000<。 i ++) { read(arr、0);
}
val = read(uninitialized_oddball, 0); console.log(val);
V8 11.0.0でテストしたところ、%TheHole()がUninitializedOddballを返すときでも、相対的に任意の読み取りが可能です。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
最適化されたread関数の主要なアセンブリは以下の通りです:
0x558b20004086 MOV R11、RDI 0x558b20004089 MOVZX EDI、バイト PTR [R11+0xb] 0x558b2000408d CMP EDI 0x81 0x558b20004093 JNZ 0x558b200040d8 0x558b20004095 MOV R9、QWORD PTR [R11+0xf] 0x558b20004099 esiをテストする、esi 0x558b2000409b js 0x558b200040d8 0x558b2000409d movsxd r11,esi 0x558b200040a0 CMP R11、QWORD PTR [R9+0xf] 0x558b200040a4・ジェ0x558b200040d8 0x558b200040a6 vmovsd xmm0、[R9+R11*8+0x7]
uninitialized_oddballが渡されると、objを起点として0x558b20004086から計算され、最後にvmovsd命令で任意の読み取りが完了し、データがXMM0レジスタに保存されます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
推奨される修正方法は、最適化された関数が配列要素を返す際に、配列のマップのチェックを追加し、オフセットを直接計算して配列の値を返すのを避けることです。
注目すべきは、いくつかのソフトウェアがまだこの脆弱性を修正していないことです。x86プラットフォームでの利用方法はわずかに異なります。アドレス圧縮がないため、任意の読み書きはプロセス全体に対して行われます。ASLRを有効にしていても、ファイルが大きすぎるため、依然としてターゲット内容を読み書きする可能性が高いです。
この新しいバイパス方法は、以前の類似の脆弱性の悪用の難易度を大幅に減少させました。すべてのuninitialized_oddballの漏洩の脆弱性を再評価することをお勧めします。
V8には他のSentinel値も存在し、同様の問題を引き起こす可能性があります。これが私たちに以下の示唆を与えます:
V8 RCEを他のuninitialized_Oddballリークと一緒に実装するのは簡単ですか?
この種の問題が正式にセキュリティ問題と見なされるべきかどうかには依然として議論があります。
FuzzerにおいてSentinel valueを変数として追加し、新しいエクスプロイトプリミティブを発掘すべきか。
いずれにせよ、この種の問題はハッカーが完全に利用するサイクルを大幅に短縮することになります。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value