# Chrome v8エンジンにおけるSentinel Valueの漏洩によるセキュリティ問題の分析Sentinel値はアルゴリズムにおける特別な値であり、通常ループや再帰アルゴリズムの終了条件として使用されます。Chromeのソースコードには複数のSentinel値が存在し、そのいくつかがJavaScript環境に漏洩すると安全上の問題を引き起こす可能性があります。以前の研究では、TheHoleオブジェクトの漏洩を通じて、Chromeサンドボックス内で任意のコード実行が可能であることが示されています。その後、Googleチームは関連するCVEを修正しました。しかし、TheHoleオブジェクトを除いて、v8にはJSに漏洩すべきではない他のネイティブオブジェクトも存在します。本稿では、Uninitialized Oddballオブジェクトについて議論します。この回避方法は、現在の最新のV8でも引き続き利用可能です。注目すべきは、この方法には一定の汎用性があるということです。1. CVE-2021-30551において、最初のPOCは内部の初期化されていない異常値の漏洩です。2. CVE-2022-1486では、POCはUninitializedOddballも直接リークしました。3. Issue1352549(に未分配CVE)の完全なエクスプロイトコードが示されています。これらのケースは、Uninitialized Oddballの漏洩が深刻なセキュリティ問題を引き起こす可能性があることを示しています。## V8のセントリナル値V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、これらのオブジェクトはメモリ内に順次隣接して配置されています。漏れてはいけないネイティブオブジェクトがJavaScriptに漏れると、サンドボックス内で任意のコードを実行することが可能になるかもしれません。これを確認するために、V8のネイティブ関数を変更して、Uninitialized OddballをJavaScriptに漏らすことができます。具体的には、%TheHole()関数のisolateに対するオフセットを変更して、Uninitialized Oddballを返すようにします。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-263e5651876fc00c4e0af0cfcd350210)## HardenType保護のバイパスUninitialized Oddballを利用することで、相対的な任意読み取りを実現できます。重要なコードは以下の通りです:JavaScriptの関数 read(obj, idx) { obj[idx]を返します。}uninitialized_oddball = %TheHole();let ab = new ArrayBuffer(8);let fa = new Float64Array(ab);let ia = new BigInt64Array(ab);悪 = [1.1, 2.2, 3.3];evil.prop = 1;%最適化のための関数を準備(読み取る);read(evil、0);read(evil、1);%次の呼び出しで最適化(読み取る);read(evil、0);let val = read(uninitialized_oddball, "prop");fa[0] = val;console.log(ia[0]);最適化されたアセンブリコードでは、JavaScriptのセマンティクスに従ってオフセットを直接計算し、配列の値を返しますが、obj.propがkeyのValueであるかどうかをチェックしていません。これにより、型の混乱が生じ、任意の読み取りが可能になります。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-26c26345e3ec4effeea2e3e6b7cd8772)Uninitialized OddballはV8メモリ内で先に並び、より原始的であり、TheHoleオブジェクトよりも偽造が容易なため、HardenTypeを回避するための最適な方法です。提案された修正案は、最適化された関数が配列要素を返す際に、配列のマップをチェックして、オフセットを直接計算して配列の値を返さないようにすることです。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-4c091ca0e153e953eb168e99762ff7cc)## PatchGapの警告Issue1352549を分析した結果、いくつかのソフトウェアにPatchGapの問題が存在する可能性があることがわかりました。例えば、Skypeは現在もこの脆弱性を修正していません。x86プラットフォームでは、アドレス圧縮がないため、任意の読み書きはプロセス全体に対して相対的です。SkypeはASLRを有効にしましたが、ファイルが大きいため、ハッカーは特定の固定アドレスに対して読み書きするだけで、Skypeのファイル内容を読み書きする高い確率があります。PE解析などの従来の方法と組み合わせることで、全体の脆弱性利用チェーンを完成させることができます。今回のPatchGapはIssue1352549に関連しているだけでなく、CVE-2022-1486やCVE-2021-30551などの脆弱性の悪用の難易度を大幅に低下させることになります。ハッカーはほぼ追加の研究なしで完全な悪用を実現できます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-1e3fda77c04bceafdcc40413824a5d37)## まとめこの記事では、Uninitialized Oddballの漏洩を通じて任意の読み取りプリミティブを実現する方法について簡単に説明します。V8には他にも多くのSentinel値があり、同様のセキュリティリスクが存在する可能性があります。これにより、私たちに以下の示唆を与えます:1. 他の未初期化のOddballの漏洩は、V8 RCEを簡単に実現できるでしょうか。2. この種の問題が正式にセキュリティ問題と見なされるべきかどうかは、依然として議論があります。3. 新しいエクスプロイト プリミティブをマイニングするために、Fuzzer で %TheHole/Uninitialized Oddball を変数として追加する必要がありますか?いずれにせよ、この種の問題はハッカーが完全に利用するまでのサイクルを大幅に短縮するため、私たちが高く重視すべきです。! [独占公開バイパス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)
V8エンジンのSentinel値漏洩がセキュリティリスクを引き起こし、初期化されていないオッドボールが新たな攻撃ベクトルとなる
Chrome v8エンジンにおけるSentinel Valueの漏洩によるセキュリティ問題の分析
Sentinel値はアルゴリズムにおける特別な値であり、通常ループや再帰アルゴリズムの終了条件として使用されます。Chromeのソースコードには複数のSentinel値が存在し、そのいくつかがJavaScript環境に漏洩すると安全上の問題を引き起こす可能性があります。
以前の研究では、TheHoleオブジェクトの漏洩を通じて、Chromeサンドボックス内で任意のコード実行が可能であることが示されています。その後、Googleチームは関連するCVEを修正しました。しかし、TheHoleオブジェクトを除いて、v8にはJSに漏洩すべきではない他のネイティブオブジェクトも存在します。本稿では、Uninitialized Oddballオブジェクトについて議論します。この回避方法は、現在の最新のV8でも引き続き利用可能です。
注目すべきは、この方法には一定の汎用性があるということです。
CVE-2021-30551において、最初のPOCは内部の初期化されていない異常値の漏洩です。
CVE-2022-1486では、POCはUninitializedOddballも直接リークしました。
Issue1352549(に未分配CVE)の完全なエクスプロイトコードが示されています。
これらのケースは、Uninitialized Oddballの漏洩が深刻なセキュリティ問題を引き起こす可能性があることを示しています。
V8のセントリナル値
V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、これらのオブジェクトはメモリ内に順次隣接して配置されています。漏れてはいけないネイティブオブジェクトがJavaScriptに漏れると、サンドボックス内で任意のコードを実行することが可能になるかもしれません。
これを確認するために、V8のネイティブ関数を変更して、Uninitialized OddballをJavaScriptに漏らすことができます。具体的には、%TheHole()関数のisolateに対するオフセットを変更して、Uninitialized Oddballを返すようにします。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
HardenType保護のバイパス
Uninitialized Oddballを利用することで、相対的な任意読み取りを実現できます。重要なコードは以下の通りです:
JavaScriptの 関数 read(obj, idx) { obj[idx]を返します。 }
uninitialized_oddball = %TheHole(); let ab = new ArrayBuffer(8); let fa = new Float64Array(ab); let ia = new BigInt64Array(ab);
悪 = [1.1, 2.2, 3.3]; evil.prop = 1;
%最適化のための関数を準備(読み取る); read(evil、0); read(evil、1); %次の呼び出しで最適化(読み取る); read(evil、0);
let val = read(uninitialized_oddball, "prop"); fa[0] = val; console.log(ia[0]);
最適化されたアセンブリコードでは、JavaScriptのセマンティクスに従ってオフセットを直接計算し、配列の値を返しますが、obj.propがkeyのValueであるかどうかをチェックしていません。これにより、型の混乱が生じ、任意の読み取りが可能になります。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
Uninitialized OddballはV8メモリ内で先に並び、より原始的であり、TheHoleオブジェクトよりも偽造が容易なため、HardenTypeを回避するための最適な方法です。
提案された修正案は、最適化された関数が配列要素を返す際に、配列のマップをチェックして、オフセットを直接計算して配列の値を返さないようにすることです。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
PatchGapの警告
Issue1352549を分析した結果、いくつかのソフトウェアにPatchGapの問題が存在する可能性があることがわかりました。例えば、Skypeは現在もこの脆弱性を修正していません。x86プラットフォームでは、アドレス圧縮がないため、任意の読み書きはプロセス全体に対して相対的です。
SkypeはASLRを有効にしましたが、ファイルが大きいため、ハッカーは特定の固定アドレスに対して読み書きするだけで、Skypeのファイル内容を読み書きする高い確率があります。PE解析などの従来の方法と組み合わせることで、全体の脆弱性利用チェーンを完成させることができます。
今回のPatchGapはIssue1352549に関連しているだけでなく、CVE-2022-1486やCVE-2021-30551などの脆弱性の悪用の難易度を大幅に低下させることになります。ハッカーはほぼ追加の研究なしで完全な悪用を実現できます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
まとめ
この記事では、Uninitialized Oddballの漏洩を通じて任意の読み取りプリミティブを実現する方法について簡単に説明します。V8には他にも多くのSentinel値があり、同様のセキュリティリスクが存在する可能性があります。これにより、私たちに以下の示唆を与えます:
他の未初期化のOddballの漏洩は、V8 RCEを簡単に実現できるでしょうか。
この種の問題が正式にセキュリティ問題と見なされるべきかどうかは、依然として議論があります。
新しいエクスプロイト プリミティブをマイニングするために、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
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value