# Sentinel 値は Chrome v8 でバイパスされます HardenProtectSentinel値はアルゴリズムにおける特殊な値で、ループや再帰アルゴリズムの終了条件に一般的に使用されます。Chromeのソースコードでは、この種の特殊な値が広く使用されています。最近の研究によると、特定のSentinel値オブジェクトを漏洩させることで、Chromeサンドボックス内で任意のコードを実行できることが示されています。この記事では、Uninitialized Oddballオブジェクトを利用してChrome v8 HardenProtectメカニズムを回避する方法について探ります。この方法は、Project0のメンバーによってIssue1352549で最初に提案され、現在でも最新のV8で使用可能であり、Googleはまだこれに対して修正を行っていません。注目すべきは、この方法が強い汎用性を持っているということです。1. Issue1216437(CVE-2021-30551)で、内部未初期化のオッドボールの漏洩に対するpocが初めて提供されました。2. UninitializedOddballオブジェクトは、Issue1314616(CVE-2022-1486)でも直接リークされています。3. Issue1352549(にはCVE)は表示されておらず、この方法の完全なエクスプロイトチェーンが示されています。これらの事例は、この回避策が複数のソフトウェアバージョンに影響を与える可能性があることを示しています。現在のところ、Skypeなどのソフトウェアはこの脆弱性を修正していません。## V8におけるセントネル値V8のソースコードには、多くのネイティブオブジェクトが定義されており、さまざまなセンチネル値が含まれています。これらのオブジェクトはメモリ内で隣接して配置されています。一度、漏洩すべきでないネイティブオブジェクトがJavaScriptに露出すると、サンドボックス内で任意のコードが実行される可能性があります。この方法を検証するために、V8の%TheHole()関数を変更して、未初期化のOddballオブジェクトを返すようにすることができます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-263e5651876fc00c4e0af0cfcd350210)## HardenTypeのバイパス以下のコードは、漏洩した初期化されていないOddballオブジェクトを利用して任意の読み取りを実現する方法を示しています:JavaScriptの関数 read(obj, idx) { obj[idx]を返します。}uninitialized_oddball = %GetUninitialized();let ab = new ArrayBuffer(8);f64 = new Float64Array(ab);u32 = 新しいUint32Array(ab)とします。(letの場合、i = 0; 私は< 0x10000; i ++) { read({prop: 1.1}, 0); }%次の呼び出しで最適化(読み取り);let val = read({prop: uninitialized_oddball}, 0x1234);f64[0] = val;console.log(u32[0].toString(16)、 u32[1].toString(16));最適化されたread関数のアセンブリコードは、関数がobjのprop属性のみをチェックし、obj.propの値をチェックせずにオフセットを直接計算していることを示しており、これにより型の混乱が生じ、任意の読み取りが実現されています。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-26c26345e3ec4effeea2e3e6b7cd8772)修正提案: 最適化された関数が配列要素を返す際に、配列のマップのチェックを追加し、オフセットを直接計算しないようにします。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-4c091ca0e153e953eb168e99762ff7cc)## PatchGapの警告この回避策は、歴史的な脆弱性に影響を与えるだけでなく、現在のソフトウェアにも影響を与える可能性があります。たとえば、Skypeは現在もこの問題を修正していません。x86プラットフォームでは、アドレス圧縮が欠如しているため、任意の読み書き範囲がより広くなっています。今回のPatchGapはIssue1352549だけでなく、Issue1314616やIssue1216437のような脆弱性の利用難易度も大幅に低下させました。メーカーは関連する脆弱性を徹底的に調査することをお勧めします。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-1e3fda77c04bceafdcc40413824a5d37)## まとめこの記事では、Uninitialized Oddballを利用してV8の任意読みを実現する方法について説明します。V8には他にもさまざまなSentinel valueがあり、似たようなセキュリティ上の脆弱性が存在する可能性があります。さらなる研究をお勧めします:1. その他のSentinel値の漏洩はV8 RCEを実現できますか2. Sentinel値を変数としてFuzzerに追加し、新しい利用プリミティブを掘り出す3. このような問題がもたらす可能性のある安全リスクを正視するこの問題が正式にセキュリティ脆弱性としてリストされるかどうかにかかわらず、それはハッカーの完全な悪用サイクルを大幅に短縮する可能性があります。この記事が関係者の注目を集めることを願っています。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-ed89289bebf59d4b27f5bffb5511a8c5)! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-0e52075003a8ee2ca492a5fc9f35c36b)! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-230537e420d579aabd89bdd168b20878)! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-506159c94c9e0988552cbcbd13d971e1)! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-e9e2000fd501b69ee3ee643a459a26dd)
Chrome v8 HardenProtect Bypass: Sentinel 値を活用して任意のコードを実行
Sentinel 値は Chrome v8 でバイパスされます HardenProtect
Sentinel値はアルゴリズムにおける特殊な値で、ループや再帰アルゴリズムの終了条件に一般的に使用されます。Chromeのソースコードでは、この種の特殊な値が広く使用されています。最近の研究によると、特定のSentinel値オブジェクトを漏洩させることで、Chromeサンドボックス内で任意のコードを実行できることが示されています。
この記事では、Uninitialized Oddballオブジェクトを利用してChrome v8 HardenProtectメカニズムを回避する方法について探ります。この方法は、Project0のメンバーによってIssue1352549で最初に提案され、現在でも最新のV8で使用可能であり、Googleはまだこれに対して修正を行っていません。
注目すべきは、この方法が強い汎用性を持っているということです。
Issue1216437(CVE-2021-30551)で、内部未初期化のオッドボールの漏洩に対するpocが初めて提供されました。
UninitializedOddballオブジェクトは、Issue1314616(CVE-2022-1486)でも直接リークされています。
Issue1352549(にはCVE)は表示されておらず、この方法の完全なエクスプロイトチェーンが示されています。
これらの事例は、この回避策が複数のソフトウェアバージョンに影響を与える可能性があることを示しています。現在のところ、Skypeなどのソフトウェアはこの脆弱性を修正していません。
V8におけるセントネル値
V8のソースコードには、多くのネイティブオブジェクトが定義されており、さまざまなセンチネル値が含まれています。これらのオブジェクトはメモリ内で隣接して配置されています。一度、漏洩すべきでないネイティブオブジェクトがJavaScriptに露出すると、サンドボックス内で任意のコードが実行される可能性があります。
この方法を検証するために、V8の%TheHole()関数を変更して、未初期化のOddballオブジェクトを返すようにすることができます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
HardenTypeのバイパス
以下のコードは、漏洩した初期化されていないOddballオブジェクトを利用して任意の読み取りを実現する方法を示しています:
JavaScriptの 関数 read(obj, idx) { obj[idx]を返します。 }
uninitialized_oddball = %GetUninitialized(); let ab = new ArrayBuffer(8); f64 = new Float64Array(ab); u32 = 新しいUint32Array(ab)とします。
(letの場合、i = 0; 私は< 0x10000; i ++) { read({prop: 1.1}, 0);
}
%次の呼び出しで最適化(読み取り);
let val = read({prop: uninitialized_oddball}, 0x1234); f64[0] = val; console.log(u32[0].toString(16)、 u32[1].toString(16));
最適化されたread関数のアセンブリコードは、関数がobjのprop属性のみをチェックし、obj.propの値をチェックせずにオフセットを直接計算していることを示しており、これにより型の混乱が生じ、任意の読み取りが実現されています。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
修正提案: 最適化された関数が配列要素を返す際に、配列のマップのチェックを追加し、オフセットを直接計算しないようにします。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
PatchGapの警告
この回避策は、歴史的な脆弱性に影響を与えるだけでなく、現在のソフトウェアにも影響を与える可能性があります。たとえば、Skypeは現在もこの問題を修正していません。x86プラットフォームでは、アドレス圧縮が欠如しているため、任意の読み書き範囲がより広くなっています。
今回のPatchGapはIssue1352549だけでなく、Issue1314616やIssue1216437のような脆弱性の利用難易度も大幅に低下させました。メーカーは関連する脆弱性を徹底的に調査することをお勧めします。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
まとめ
この記事では、Uninitialized Oddballを利用してV8の任意読みを実現する方法について説明します。V8には他にもさまざまな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