# Chrome v8 HardenProtect をバイパスして Sentinel 値をリークする## イントロダクションSentinel valueはアルゴリズムの中で特別な値であり、通常はループや再帰アルゴリズムの終了条件として存在します。Chromeのソースコードには多くのSentinel valueがあります。以前の研究では、TheHoleオブジェクトの漏洩を通じてサンドボックス内で任意のコードを実行する方法が紹介されました。Googleチームはその後、関連する修正を迅速に更新しました。TheHoleオブジェクトを除いて、v8にはJSに漏洩すべきでない多くの他のネイティブオブジェクトがあります。本記事では、現在の最新のV8でまだ使用可能なUninitialized Oddballオブジェクトについて説明します。この方法は、いくつかの脆弱性で見られたように、一定の汎用性を持っていることに注意が必要です。! [独占公開バイパス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に対するオフセットを変更できます。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-26c26345e3ec4effeea2e3e6b7cd8772)## HardenTypeのバイパスUninitialized Oddballを利用することで、相対的に任意の読み書きを実現できます。重要なのは、最適化されたJavaScriptのread関数では、objのprop属性が正しいかどうかだけをチェックしており、obj.propをキーとするValueをチェックしていないことです。そのため、JavaScriptの意味に従ってオフセットを直接計算し、配列の値を求めることになります。これが原因で、計算時に型の混乱が生じ、任意の読み取りが実現されます。Uninitialized Oddballはv8メモリ内で優先的に配置され、より原始的であるため、TheHoleオブジェクトよりも偽造しやすく、TheHoleの修正回避を緩和するための優先手段です。最適化された関数が配列要素を返すときに、配列のmapをチェックして、オフセットを直接計算して数値を返さないようにすることを提案します。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-4c091ca0e153e953eb168e99762ff7cc)! [独占公開バイパス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)## PatchGapリスク警告歴史的な脆弱性に注目するだけでなく、ベンダーが基盤コンポーネントに静かに修正した脆弱性にも注意する必要があります。現在、Skypeはこの脆弱性を修正していません。x86とx64では利用方法がわずかに異なりますが、どちらも任意の読み書きを実現できます。今回のPatchGapはIssue1352549だけでなく、新しい手法の公開により、類似の脆弱性の悪用が大幅に容易になりました。ハッカーはほとんど研究を行うことなく、過去のUninitialized Oddball脆弱性を完全に悪用することができます。! [独占公開バイパス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)## まとめv8には他にも多くのSentinel値があり、同様の問題が存在する可能性があります。これは私たちにいくつかの示唆を与えます:1. その他の未初期化のOddballの漏洩もv8 RCEを実現しやすいか。2. この種の問題が正式にセキュリティの問題と見なされるべきかどうかは、依然として議論の余地があります。3. fuzzテスト時には、さまざまなSentinel値を変数として追加することを検討すべきかもしれません。いずれにせよ、この種の問題はハッカーの完全な利用サイクルを大幅に短縮します。我々はこれに警戒を怠るべきではありません。! [独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value](https://img-cdn.gateio.im/social/moments-e9e2000fd501b69ee3ee643a459a26dd)
Chrome v8の脆弱性を利用する新しい方法: 初期化されていないOddballの実装によるサンドボックスの脱出
Chrome v8 HardenProtect をバイパスして Sentinel 値をリークする
イントロダクション
Sentinel valueはアルゴリズムの中で特別な値であり、通常はループや再帰アルゴリズムの終了条件として存在します。Chromeのソースコードには多くのSentinel valueがあります。以前の研究では、TheHoleオブジェクトの漏洩を通じてサンドボックス内で任意のコードを実行する方法が紹介されました。Googleチームはその後、関連する修正を迅速に更新しました。
TheHoleオブジェクトを除いて、v8にはJSに漏洩すべきでない多くの他のネイティブオブジェクトがあります。本記事では、現在の最新のV8でまだ使用可能なUninitialized Oddballオブジェクトについて説明します。この方法は、いくつかの脆弱性で見られたように、一定の汎用性を持っていることに注意が必要です。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
V8のセンチネル値
v8の大部分のネイティブオブジェクトはv8/src/roots/roots.hファイルに定義されており、これらのオブジェクトはメモリ内で順に隣接して配置されています。一度、漏らしてはいけないネイティブオブジェクトがJavascriptに漏れ出すと、サンドボックス内で任意のコードを実行することが可能になります。
この方法を検証するために、v8のネイティブ関数を変更し、Uninitialized OddballをJavaScriptに漏らすことができます。具体的には、%TheHole()関数内のisolateに対するオフセットを変更できます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
HardenTypeのバイパス
Uninitialized Oddballを利用することで、相対的に任意の読み書きを実現できます。重要なのは、最適化されたJavaScriptのread関数では、objのprop属性が正しいかどうかだけをチェックしており、obj.propをキーとするValueをチェックしていないことです。そのため、JavaScriptの意味に従ってオフセットを直接計算し、配列の値を求めることになります。これが原因で、計算時に型の混乱が生じ、任意の読み取りが実現されます。
Uninitialized Oddballはv8メモリ内で優先的に配置され、より原始的であるため、TheHoleオブジェクトよりも偽造しやすく、TheHoleの修正回避を緩和するための優先手段です。
最適化された関数が配列要素を返すときに、配列のmapをチェックして、オフセットを直接計算して数値を返さないようにすることを提案します。
! 独占公開バイパス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
PatchGapリスク警告
歴史的な脆弱性に注目するだけでなく、ベンダーが基盤コンポーネントに静かに修正した脆弱性にも注意する必要があります。現在、Skypeはこの脆弱性を修正していません。x86とx64では利用方法がわずかに異なりますが、どちらも任意の読み書きを実現できます。
今回のPatchGapはIssue1352549だけでなく、新しい手法の公開により、類似の脆弱性の悪用が大幅に容易になりました。ハッカーはほとんど研究を行うことなく、過去のUninitialized Oddball脆弱性を完全に悪用することができます。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value
まとめ
v8には他にも多くのSentinel値があり、同様の問題が存在する可能性があります。これは私たちにいくつかの示唆を与えます:
その他の未初期化のOddballの漏洩もv8 RCEを実現しやすいか。
この種の問題が正式にセキュリティの問題と見なされるべきかどうかは、依然として議論の余地があります。
fuzzテスト時には、さまざまなSentinel値を変数として追加することを検討すべきかもしれません。
いずれにせよ、この種の問題はハッカーの完全な利用サイクルを大幅に短縮します。我々はこれに警戒を怠るべきではありません。
! 独占公開バイパスChrome v8 HardenProtect by Leaking Sentinel Value