# Chrome V8エンジンでのSentinel値エクスプロイト分析Sentinel valueはアルゴリズムにおける特殊な値であり、通常はループや再帰アルゴリズムの終了条件として使用されます。Chromeのソースコードには多数のSentinel valueが存在します。以前の研究では、TheHoleオブジェクトの漏洩を通じてChromeサンドボックス内で任意のコードを実行できることが示されました。Googleチームはその後、関連する脆弱性を修正しました。しかし、V8 には JS に漏洩すべきではない他のネイティブオブジェクトも存在します。本稿では、初期化されていないオッドボールオブジェクトについて説明します。このオブジェクトの漏洩は、現在の最新バージョンの V8 でもサンドボックスをバイパスする方法を引き起こす可能性があります。注目すべきは、この方法には一定の汎用性があることです。1. CVE-2021-30551 の最初の PoC は、内部の初期化されていない異常値を漏洩させることです。2. CVE-2022-1486は、PoCでUninitializedOddballも直接リークしました。3. Issue1352549 (に未割り当てのCVE)の利用方法が詳しく記載されています。これらのケースは、未初期化のオッドボール漏洩を利用した攻撃の可能性が重要であることを示しています。## V8におけるセンチネル値V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、メモリ内で順に隣接して配置されています。一旦これらの漏洩すべきでないネイティブオブジェクトがJavaScriptに漏洩すると、サンドボックス内で任意のコード実行が可能になる可能性があります。これを検証するために、V8のネイティブ関数%TheHole()の戻り値をUninitialized Oddballに変更することができます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-263e5651876fc00c4e0af0cfcd350210)## HardenType保護のバイパスIssue1352549 に完全なバイパスコードが提供されています。簡略化されたコアロジックは以下の通りです:JavaScriptの関数 read(obj, idx) { obj[idx]を返します。}初期化されていない = %TheHole();arr = [1.1];let res = read(uninitialized, 0x12345);%デバッグ印刷(結果);このコードは最新の V8 11.0.0 バージョンでも相対的な任意の読み取りを実現できます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-26c26345e3ec4effeea2e3e6b7cd8772)最適化された read 関数のアセンブリコードを分析すると、obj の prop 属性が正しいかどうかしか確認しておらず、obj.prop をキーとしての Value を確認していないことがわかります。これにより、計算時に型の混同が発生し、任意の読み取りが実現されました。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-4c091ca0e153e953eb168e99762ff7cc)uninitialized_oddball が渡されたとき、特定の命令から obj を起点として計算を開始し、最終的に vmovsd xmm0,[r9+r11*8+0x7] 命令で任意の読み取りを完了し、データは xmm0 レジスタに保存されます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-1e3fda77c04bceafdcc40413824a5d37)提案された修正方法は、最適化された関数が配列要素を返す際に、配列のマップを確認し、オフセットを直接計算して配列の値を返すことを避けることです。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-ed89289bebf59d4b27f5bffb5511a8c5)## PatchGapの警告PatchGap の可能性のあるソフトウェアを調査していると、Skype がこの脆弱性をまだ修正していないことがわかりました。x86 アーキテクチャでは、アドレス圧縮がないため、任意の読み書きはプロセス全体に対して直接行われます。SkypeはASLRを有効にしていますが、ファイルが大きいため、直接4GBのメモリに配置されてしまいます。そのため、攻撃者は特定の固定アドレスに対して読み書きを行うだけで、Skypeのファイル内容にアクセスする可能性が非常に高くなります。PE解析などの従来の手法と組み合わせることで、全体の脆弱性利用チェーンを完成させることができます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-0e52075003a8ee2ca492a5fc9f35c36b)今回のPatchGapは、Issue1352549に関わるだけでなく、Issue1314616やIssue1216437のような利用の難易度を大幅に低下させました。ハッカーは、追加の研究をほとんど必要とせず、以前の未初期化のuninitialized_oddball脆弱性を完全に利用することができます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-230537e420d579aabd89bdd168b20878)## まとめこの記事では、Sentinel value の uninitialized_Oddball を漏洩させることにより、任意の読み取り原語を実現する方法について説明します。V8 には他にも Sentinel value が存在し、類似の問題を引き起こす可能性があります。これは私たちに以下の示唆を与えます:1. 他のuninitialized_OddballリークもV8のRCEを簡単に達成できますか?2. この種の問題が正式に安全問題として扱われるべきかどうかは依然として議論の余地があります。3. ファザーに %TheHole/uninitialized_Oddball などの Sentinel 値を変数として追加して、他のエクスプロイト プリミティブをマイニングすることを検討してください。いずれにせよ、この種の問題はハッカーが完全な利用を実現するサイクルを大幅に短縮します。! [独占公開バイパス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 Engine Sentinel Value Exploit Analysis: RCE は追加の調査なしで達成できます
Chrome V8エンジンでのSentinel値エクスプロイト分析
Sentinel valueはアルゴリズムにおける特殊な値であり、通常はループや再帰アルゴリズムの終了条件として使用されます。Chromeのソースコードには多数のSentinel valueが存在します。以前の研究では、TheHoleオブジェクトの漏洩を通じてChromeサンドボックス内で任意のコードを実行できることが示されました。Googleチームはその後、関連する脆弱性を修正しました。
しかし、V8 には JS に漏洩すべきではない他のネイティブオブジェクトも存在します。本稿では、初期化されていないオッドボールオブジェクトについて説明します。このオブジェクトの漏洩は、現在の最新バージョンの V8 でもサンドボックスをバイパスする方法を引き起こす可能性があります。
注目すべきは、この方法には一定の汎用性があることです。
CVE-2021-30551 の最初の PoC は、内部の初期化されていない異常値を漏洩させることです。
CVE-2022-1486は、PoCでUninitializedOddballも直接リークしました。
Issue1352549 (に未割り当てのCVE)の利用方法が詳しく記載されています。
これらのケースは、未初期化のオッドボール漏洩を利用した攻撃の可能性が重要であることを示しています。
V8におけるセンチネル値
V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、メモリ内で順に隣接して配置されています。一旦これらの漏洩すべきでないネイティブオブジェクトがJavaScriptに漏洩すると、サンドボックス内で任意のコード実行が可能になる可能性があります。
これを検証するために、V8のネイティブ関数%TheHole()の戻り値をUninitialized Oddballに変更することができます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
HardenType保護のバイパス
Issue1352549 に完全なバイパスコードが提供されています。簡略化されたコアロジックは以下の通りです:
JavaScriptの 関数 read(obj, idx) { obj[idx]を返します。 }
初期化されていない = %TheHole(); arr = [1.1]; let res = read(uninitialized, 0x12345); %デバッグ印刷(結果);
このコードは最新の V8 11.0.0 バージョンでも相対的な任意の読み取りを実現できます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
最適化された read 関数のアセンブリコードを分析すると、obj の prop 属性が正しいかどうかしか確認しておらず、obj.prop をキーとしての Value を確認していないことがわかります。これにより、計算時に型の混同が発生し、任意の読み取りが実現されました。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
uninitialized_oddball が渡されたとき、特定の命令から obj を起点として計算を開始し、最終的に vmovsd xmm0,[r9+r11*8+0x7] 命令で任意の読み取りを完了し、データは xmm0 レジスタに保存されます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
提案された修正方法は、最適化された関数が配列要素を返す際に、配列のマップを確認し、オフセットを直接計算して配列の値を返すことを避けることです。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
PatchGapの警告
PatchGap の可能性のあるソフトウェアを調査していると、Skype がこの脆弱性をまだ修正していないことがわかりました。x86 アーキテクチャでは、アドレス圧縮がないため、任意の読み書きはプロセス全体に対して直接行われます。
SkypeはASLRを有効にしていますが、ファイルが大きいため、直接4GBのメモリに配置されてしまいます。そのため、攻撃者は特定の固定アドレスに対して読み書きを行うだけで、Skypeのファイル内容にアクセスする可能性が非常に高くなります。PE解析などの従来の手法と組み合わせることで、全体の脆弱性利用チェーンを完成させることができます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
今回のPatchGapは、Issue1352549に関わるだけでなく、Issue1314616やIssue1216437のような利用の難易度を大幅に低下させました。ハッカーは、追加の研究をほとんど必要とせず、以前の未初期化のuninitialized_oddball脆弱性を完全に利用することができます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
まとめ
この記事では、Sentinel value の uninitialized_Oddball を漏洩させることにより、任意の読み取り原語を実現する方法について説明します。V8 には他にも Sentinel value が存在し、類似の問題を引き起こす可能性があります。これは私たちに以下の示唆を与えます:
他のuninitialized_OddballリークもV8のRCEを簡単に達成できますか?
この種の問題が正式に安全問題として扱われるべきかどうかは依然として議論の余地があります。
ファザーに %TheHole/uninitialized_Oddball などの Sentinel 値を変数として追加して、他のエクスプロイト プリミティブをマイニングすることを検討してください。
いずれにせよ、この種の問題はハッカーが完全な利用を実現するサイクルを大幅に短縮します。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value