# Chrome V8 HardenProtect をバイパスして Sentinel Value をリークした裏話## イントロダクションセンティネル値はアルゴリズムにおける特別な値で、ループや再帰アルゴリズムで終了条件としてよく使われます。Chromeのソースコードではこのような値が広く使用されています。最近、セキュリティ研究者たちはTheHoleオブジェクトの漏洩を通じてChromeサンドボックス内で任意のコード実行が可能であることを発見しました。Googleチームはその後、これらの野生での脆弱性を迅速に修正しました。しかし、V8にはJavaScriptに漏洩すべきではない他のネイティブオブジェクトも存在します。本稿では、新しいオブジェクトであるUninitialized Oddballについて論じます。この回避策は、Project0のメンバーが提出したIssueに最初に登場し、現在も最新のV8バージョンで使用可能です。注意すべきは、この方法が強い汎用性を持っていることです。1. CVE-2021-30551では、最初のPOCは内部の未初期化の奇妙な値を漏洩させることです。2. CVE-2022-1486のPOCも直接リークしましたUninitializedOddball。3. 割り当てられていないCVEの問題も同様の方法を使用しました。これらの事例は、この問題の重要性を十分に示しており、影響を受ける可能性のあるソフトウェアを再評価する価値があります。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-263e5651876fc00c4e0af0cfcd350210)## 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-26c26345e3ec4effeea2e3e6b7cd8772)! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-4c091ca0e153e953eb168e99762ff7cc)## HardenTypeのバイパスUninitialized Oddballを利用することで、相対的に任意の読み書きが可能になります。重要なのは、最適化されたread関数がobjのprop属性のみをチェックし、obj.propをキーとするvalueをチェックしていないことです。これにより、計算時に型混乱が発生し、任意の読み取りが実現されます。! [独占公開バイパス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)! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-0e52075003a8ee2ca492a5fc9f35c36b)x86アーキテクチャでは、アドレス圧縮がないため、任意の読み書きはプロセス全体に対して行われます。アドレス圧縮による利便性が欠けているものの、一部の大型ソフトウェアファイルが非常に大きいため、依然としてターゲット内容に高い確率で読み書きすることができます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-230537e420d579aabd89bdd168b20878)## PatchGapの警告今回のPatchGapはIssue1352549だけでなく、Issue1314616やIssue1216437に類似した複数の脆弱性も含まれています。新しい回避方法が公開された後、これらの脆弱性の悪用の難易度が大幅に低下しました。ハッカーは追加の研究をほとんど必要とせずに完全な悪用チェーンを完成させることができます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-506159c94c9e0988552cbcbd13d971e1)## サマリーV8には他にも多くのSentinel値があり、同様の問題が存在する可能性があります。これが私たちにいくつかの示唆を与えます:1. 他のuninitialized_OddballリークもV8 RCEを達成できますか?2. この種の問題は正式にセキュリティ問題と見なされるべきですか?3. FuzzerテストではSentinel valueを変数として追加すべきですか?いずれにせよ、この種の問題はハッカーが完全に利用するサイクルを大幅に短縮するため、私たちは非常に重要視する必要があります。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-e9e2000fd501b69ee3ee643a459a26dd)
Chrome V8エンジンの新しい脆弱性: 未初期化のオッドボールによるサンドボックスの回避
Chrome V8 HardenProtect をバイパスして Sentinel Value をリークした裏話
イントロダクション
センティネル値はアルゴリズムにおける特別な値で、ループや再帰アルゴリズムで終了条件としてよく使われます。Chromeのソースコードではこのような値が広く使用されています。最近、セキュリティ研究者たちはTheHoleオブジェクトの漏洩を通じてChromeサンドボックス内で任意のコード実行が可能であることを発見しました。Googleチームはその後、これらの野生での脆弱性を迅速に修正しました。
しかし、V8にはJavaScriptに漏洩すべきではない他のネイティブオブジェクトも存在します。本稿では、新しいオブジェクトであるUninitialized Oddballについて論じます。この回避策は、Project0のメンバーが提出したIssueに最初に登場し、現在も最新のV8バージョンで使用可能です。
注意すべきは、この方法が強い汎用性を持っていることです。
CVE-2021-30551では、最初のPOCは内部の未初期化の奇妙な値を漏洩させることです。
CVE-2022-1486のPOCも直接リークしましたUninitializedOddball。
割り当てられていないCVEの問題も同様の方法を使用しました。
これらの事例は、この問題の重要性を十分に示しており、影響を受ける可能性のあるソフトウェアを再評価する価値があります。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
V8におけるセンティネル値
V8のほとんどのネイティブオブジェクトはv8/src/roots/roots.hファイルで定義されており、メモリ内で順番に隣接して配置されています。これらの漏洩してはいけないネイティブオブジェクトがJavaScriptに漏洩すると、サンドボックス内で任意のコードが実行される可能性があります。
私たちはV8のネイティブ関数を修正することによって、Uninitialized OddballをJavaScriptに漏らすことができます。具体的な方法は、%TheHole()関数のisolateに対するオフセットを修正し、Uninitialized Oddballを返すようにすることです。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
HardenTypeのバイパス
Uninitialized Oddballを利用することで、相対的に任意の読み書きが可能になります。重要なのは、最適化されたread関数がobjのprop属性のみをチェックし、obj.propをキーとするvalueをチェックしていないことです。これにより、計算時に型混乱が発生し、任意の読み取りが実現されます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
x86アーキテクチャでは、アドレス圧縮がないため、任意の読み書きはプロセス全体に対して行われます。アドレス圧縮による利便性が欠けているものの、一部の大型ソフトウェアファイルが非常に大きいため、依然としてターゲット内容に高い確率で読み書きすることができます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
PatchGapの警告
今回のPatchGapはIssue1352549だけでなく、Issue1314616やIssue1216437に類似した複数の脆弱性も含まれています。新しい回避方法が公開された後、これらの脆弱性の悪用の難易度が大幅に低下しました。ハッカーは追加の研究をほとんど必要とせずに完全な悪用チェーンを完成させることができます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
サマリー
V8には他にも多くのSentinel値があり、同様の問題が存在する可能性があります。これが私たちにいくつかの示唆を与えます:
他のuninitialized_OddballリークもV8 RCEを達成できますか?
この種の問題は正式にセキュリティ問題と見なされるべきですか?
FuzzerテストではSentinel valueを変数として追加すべきですか?
いずれにせよ、この種の問題はハッカーが完全に利用するサイクルを大幅に短縮するため、私たちは非常に重要視する必要があります。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value