Slide 1

Slide 1 text

Site Isolationの話

Slide 2

Slide 2 text

職務質問 Q: お名前は? A: 小勝純です Q: SNS教えなさい A: @shhnjkです Q: お仕事は? A: マイクロソフトでBrowser Vulnerability Researchチームに所属してます Q: ビザ見せなさい A: 日本人です

Slide 3

Slide 3 text

Agenda 1. Site Isolationについて 2. Cross-Origin Read Blockingについて 3. Spectreについて 4. 見つけたバグの話 5. まとめ

Slide 4

Slide 4 text

Chromeのプロセスモデル ブラウザプロセス: Chromeのプロセスの中で一番権限が高いプロセス。サンドボックス外の プロセスで、各レンダラプロセスの管理やリソースの供給、権限の授与を担当

Slide 5

Slide 5 text

Chromeのプロセスモデル ブラウザプロセス: Chromeのプロセスの中で一番権限が高いプロセス。サンドボックス外の プロセスで、各レンダラプロセスの管理やリソースの供給、権限の授与を担当 レンダラプロセス: Chromeのプロセスの中で一番権限が低い、サンドボックスされたプロセス。ウェブ ページをレンダリングしたり、JSを実行したりする

Slide 6

Slide 6 text

Site Isolationの背景 ● オンライン上のデータの重要度が日に日に増している

Slide 7

Slide 7 text

Site Isolationの背景 ● オンライン上のデータの重要度が日に日に増している ● ブラウザのサンドボックスをエスケープしなくてもレンダラプロセスを掌握出来 ればUXSSなどが可能だった

Slide 8

Slide 8 text

Site Isolationの背景 ● オンライン上のデータの重要度が日に日に増している ● ブラウザのサンドボックスをエスケープしなくてもレンダラプロセスを掌握出来 ればUXSSなどが可能だった ● 今後の攻撃がサンドボックスをエスケープするものから他サイトへのアクセス を悪用するものに推移するのではないか

Slide 9

Slide 9 text

Site Isolationとは サイトごとにレンダラプロセスを隔離する Chromeのセキュリティ機能 Siteとは: Scheme と eTLD+1 https://www.example.com:443 https://www.chromium.org/developers/design-documents/site-isolation

Slide 10

Slide 10 text

Cross-Origin Read Blockingの背景 クロスサイトなタブやフレームはSite Isolationでプロセスが隔離されるが、他のリ ソースはプロセスの隔離がされない 例:

Slide 11

Slide 11 text

Cross-Origin Read Blockingの背景 クロスサイトなタブやフレームはSite Isolationでプロセスが隔離されるが、他のリ ソースはプロセスの隔離がされない 例: imgタグで指定されたリソースをパースする為に、そのリソースをレンダラプロセス 内のメモリにロードする必要がある =レンダラプロセスを掌握されると任意のサイトのレスポンスが読める

Slide 12

Slide 12 text

Cross-Origin Read Blockingとは HTMLかXMLかJSONのContent-Typeを持つリソースがクロスオリジンな プロセスにロードされないようにするセキュリティ機能 X-Content-Type-Options: nosniffが指定されていない場合はコンテンツを スニフする Renderer: https://evil.tld Browser process victim.tld Content-Type: text/html X-Content-Type-Options: nosniff

Slide 13

Slide 13 text

Spectre ● サイドチャネル攻撃を使うことで別プロセスのデータを読み取れる CPUの脆弱性

Slide 14

Slide 14 text

Spectre ● サイドチャネル攻撃を使うことで別プロセスのデータを読み取れる CPUの脆弱性 ● OSレベルのパッチにより、今まで通り OSプロセスの隔離は保証されるが、同 一プロセス内に機密データと信頼出来ないコードが共存する場合は未だにサ イドチャネル攻撃が可能

Slide 15

Slide 15 text

Spectre ● サイドチャネル攻撃を使うことで別プロセスのデータを読み取れる CPUの脆弱性 ● OSレベルのパッチにより、今まで通り OSプロセスの隔離は保証されるが、同 一プロセス内に機密データと信頼出来ないコードが共存する場合は未だにサ イドチャネル攻撃が可能 ● 脆弱性無しでもJavascriptを使うと同一プロセス内の全てのデータを 読めてしまう

Slide 16

Slide 16 text

ChromeによるSpectreの緩和策 performance.now()の精度削減、SharedArrayBufferの無効化、投機的実行時の メモリマスクなど >これらは総合的で効率的な緩和策ではない 詳細:https://v8.dev/blog/spectre

Slide 17

Slide 17 text

ChromeによるSpectreの緩和策 performance.now()の精度削減、SharedArrayBufferの無効化、投機的実行時の メモリマスクなど >これらは総合的で効率的な緩和策ではない 詳細:https://v8.dev/blog/spectre OSレベルでの隔離が保証されるSite Isolationが一番効果的なSpectre対策

Slide 18

Slide 18 text

Spectre対策としてのSite Isolation 当時完成していなかったSite Isolationを効果的なSpectre対策とする為に、新たな 脅威モデルによるSite IsolationがChrome 67から有効にされた 1. クロスサイトなタブやフレームには別プロセスを振り分ける 2. CORBを有効にする

Slide 19

Slide 19 text

Spectre対策としてのSite Isolation 当時完成していなかったSite Isolationを効果的なSpectre対策とする為に、新たな 脅威モデルによるSite IsolationがChrome 67から有効にされた 1. クロスサイトなタブやフレームには別プロセスを振り分ける 2. CORBを有効にする しかし、レンダラプロセス内のデータが改ざんされてブラウザプロセスを騙す様な当 初のSite Isolationが想定していた脅威モデルには対応せず

Slide 20

Slide 20 text

Spectre対策としてのSite Isolation 当時完成していなかったSite Isolationを効果的なSpectre対策とする為に、新たな 脅威モデルによるSite IsolationがChrome 67から有効にされた 1. クロスサイトなタブやフレームには別プロセスを振り分ける 2. CORBを有効にする しかし、レンダラプロセス内のデータが改ざんされてブラウザプロセスを騙す様な当 初のSite Isolationが想定していた脅威モデルには対応せず レンダラプロセス内のデータを改ざんせずに上記2つのどちらかをバイパス出来れ ば報奨金が貰える!

Slide 21

Slide 21 text

クロスサイトを突き詰める URLのHostがドメイン名ではない場合、SchemeとHostが完全一致した場合のみ 同一サイトと判断される 例:http://204.79.197.200/

Slide 22

Slide 22 text

クロスサイトを突き詰める URLのHostがドメイン名ではない場合、SchemeとHostが完全一致した場合のみ 同一サイトと判断される 例:http://204.79.197.200/ Blob URLやFileSystem URLなどオリジンがURL内にあるものは、そのオリジンを 元に同一サイトかを比較する 例:blob:https://www.bing.com/ed14d1bc-2fdc-4408-82ed-37c06ba1eab5

Slide 23

Slide 23 text

クロスサイトを突き詰める URLのHostがドメイン名ではない場合、SchemeとHostが完全一致した場合のみ 同一サイトと判断される 例:http://204.79.197.200/ Blob URLやFileSystem URLなどオリジンがURL内にあるものは、そのオリジンを 元に同一サイトかを比較する 例:blob:https://www.bing.com/ed14d1bc-2fdc-4408-82ed-37c06ba1eab5 一つ目のバグが分かりましたか?

Slide 24

Slide 24 text

Blob URLのオリジン CSP/iframeサンドボックスもしくはData URLから作られたBlob URLは以下の様に なる blob:null/06a61233-03ba-4ebe-a0ad-5b5c71e56bd0 SchemeとHostが完全に一致しているので常に同一サイトとみなされる

Slide 25

Slide 25 text

Blob URLのオリジン CSP/iframeサンドボックスもしくはData URLから作られたBlob URLは以下の様に なる blob:null/06a61233-03ba-4ebe-a0ad-5b5c71e56bd0 SchemeとHostが完全に一致しているので常に同一サイトとみなされる 結果、クロスサイトなはずの2つの Blob URLが同一プロセス内にレンダリングされ てしまう CVE-2018-16074: $3000

Slide 26

Slide 26 text

Data URLの扱い Data URLがiframe内で表示された場合、ナビゲーションを開始したサイトと Data URLは同一サイトとみなされる https://example.tld 同一サイト https://example.tld https://evil.tld location.href=”data:,test”; クロスサイト

Slide 27

Slide 27 text

ブラウザ復元時の挙動 https://victim.tld https://evil.tld location.href=”data:,test”; https://evil.tldからData URLがロードされた後 にブラウザプロセスをクラッシュする 例:https://crbug.com/935050

Slide 28

Slide 28 text

ブラウザ復元時の挙動 https://victim.tld https://evil.tld location.href=”data:,test”; https://evil.tldからData URLがロードされた後 にブラウザプロセスをクラッシュする 例:https://crbug.com/935050

Slide 29

Slide 29 text

ブラウザ復元時の挙動 https://victim.tld https://evil.tld location.href=”data:,test”; https://evil.tldからData URLがロードされた後 にブラウザプロセスをクラッシュする 例:https://crbug.com/935050 https://victim.tld data:,test ローカルキャッシュから復元される際にクロスサイトな Data URLが同一サイトとみなされてしまう CVE-2018-16073: $3000

Slide 30

Slide 30 text

修正後 ブラウザまたはタブ復元後のData URLはどのサイトに属しているかがわからない 為、復元後はフラグメントを抜いた Data URL自体をサイトとして扱う様になった

Slide 31

Slide 31 text

修正後 ブラウザまたはタブ復元後のData URLはどのサイトに属しているかがわからない 為、復元後はフラグメントを抜いた Data URL自体をサイトとして扱う様になった しかしChromeにはData URLのフラグメント以降もData URLのボディとして扱う挙 動があった data:text/html,body#this is body too

Slide 32

Slide 32 text

ブラウザ復元時の挙動を使ったバグ2 https://evil.tld data:text/html, alert(1); https://victim.tld data:text/html, secret

Slide 33

Slide 33 text

ブラウザ復元時の挙動を使ったバグ2 https://evil.tld data:text/html, alert(1); https://victim.tld data:text/html, secret クラッシュ

Slide 34

Slide 34 text

ブラウザ復元時の挙動を使ったバグ2 https://evil.tld data:text/html, alert(1); https://victim.tld data:text/html, secret https://evil.tld data:text/html, alert(1); https://victim.tld data:text/html, secret クラッシュ 同一サイト $500 https://www.chromestatus.com/feature/5656 049583390720

Slide 35

Slide 35 text

CORBをバイパスしてみる Application CacheはクロスオリジンのリソースをCORS無しで明示的にキャッシュ することが出来る CACHE MANIFEST CACHE: https://www.google.com

Slide 36

Slide 36 text

CORBをバイパスしてみる Application CacheはクロスオリジンのリソースをCORS無しで明示的にキャッシュ することが出来る CACHE MANIFEST CACHE: https://www.google.com ブラウザがこのキャッシュを行う際 CORBのチェックを怠っていた為、 明示的にキャッシュしたリソースを使うことによって CORBがバイパス 出来た Chrome Securityチームが先に見つけていたので重複

Slide 37

Slide 37 text

レンダラプロセスを信頼しないSite Isolationへ 当初の目標であったレンダラプロセスを一切信頼しない脅威モデルの確立に向け て着々と実装が行われている ● Out-of-Renderer CORS ● 各IPCの再チェック ● 現状の実装で実際のサイトが守れるかの確認 などなど

Slide 38

Slide 38 text

レンダラプロセスを信頼しないSite Isolationへ 当初の目標であったレンダラプロセスを一切信頼しない脅威モデルの確立に向け て着々と実装が行われている ● Out-of-Renderer CORS ● 各IPCの再チェック ● 現状の実装で実際のサイトが守れるかの確認 などなど こちらも実際に見つかったバグを紹介します ※まだ実装が完璧ではない為、セキュリティのバグではなくセキュリティ機能の向上 として 扱われる場合があります

Slide 39

Slide 39 text

Blob URLを使ったUXSS キヌガワさんが見つけたバグ! Blob URLを作る際、レンダラプロセス内のオリジンを偽 装することでブラウザプロセスを騙して別オリジンの Blob URLを作ることが出来る Blob URLのコンテンツも自由に指定出来るので UXSS となる CVE-2018-18345: $8000 Browser Process Renderer Process https://evil.tld I need a Blob URL for Google.com! Sure!

Slide 40

Slide 40 text

ナビゲーションコミット時のオリジン偽装 Chromeにはナビゲーションが開始された後にレスポンスをロードする為のレンダ ラプロセスからナビゲーションをコミットするという概念がある Life of a Navigation:https://youtu.be/mX7jQsGCF6E Navigate to https://evil.tld Commit navigation with https://victim.tld

Slide 41

Slide 41 text

UXSSに昇格 別オリジンにコミット出来ることは Chromeチームが知っていたので重複 レンダラプロセス自体は攻撃者のサイト用のままのなので UXSSが出来ない

Slide 42

Slide 42 text

UXSSに昇格 別オリジンにコミット出来ることは Chromeチームが知っていたので重複 レンダラプロセス自体は攻撃者のサイト用のままのなので UXSSが出来ない レンダラプロセスがアクセス出来るオリジンを確認されてしまう APIには オリジンの偽装がバレるが、そうでない APIは上手く騙せていた Service Workerを使うサイトに対してはCache APIを使ってUXSSが出来た https://crbug.com/915396

Slide 43

Slide 43 text

postMessageのオリジン偽装 レンダラプロセス内のオリジンを偽装した後に postMessageすると メッセージを受け取った側に偽装されたオリジンが送られてしまう https://evil.tld https://victim.tld frames[0].postMessage(“hello”,”*”); alert(event.origin)// https://victim.tld $3000 https://crbug.com/915398

Slide 44

Slide 44 text

気をつけて欲しいこと 開発者へ ● 信頼出来ないData URLをiframeで表示することはXSSではないが危険

Slide 45

Slide 45 text

気をつけて欲しいこと 開発者へ ● 信頼出来ないData URLをiframeで表示することはXSSではないが危険 ● HTML、XML、JSON以外の機密ファイルでクロスサイトに読み込まれる必要 がないものにはCORPヘッダーを設定しよう!

Slide 46

Slide 46 text

気をつけて欲しいこと 開発者へ ● 信頼出来ないData URLをiframeで表示することはXSSではないが危険 ● HTML、XML、JSON以外の機密ファイルでクロスサイトに読み込まれる必要 がないものにはCORPヘッダーを設定しよう! ● https://www.chromium.org/Home/chromium-security/corb-for-developers

Slide 47

Slide 47 text

気をつけて欲しいこと 開発者へ ● 信頼出来ないData URLをiframeで表示することはXSSではないが危険 ● HTML、XML、JSON以外の機密ファイルでクロスサイトに読み込まれる必要 がないものにはCORPヘッダーを設定しよう! ● https://www.chromium.org/Home/chromium-security/corb-for-developers ユーザへ ● 信頼出来ないローカルファイルは開かないようにしよう! (現状全てのFile URLは同一サイト)

Slide 48

Slide 48 text

Site Isolationで変わってきたこと ● レンダラプロセスを掌握してもUXSSをする為には更にバグが必要になった

Slide 49

Slide 49 text

Site Isolationで変わってきたこと ● レンダラプロセスを掌握してもUXSSをする為には更にバグが必要になった ● ブラウザプロセスのアタックサーフェイスが増加した

Slide 50

Slide 50 text

Site Isolationで変わってきたこと ● レンダラプロセスを掌握してもUXSSをする為には更にバグが必要になった ● ブラウザプロセスのアタックサーフェイスが増加した ● ブラウザのバグがサイトの設定で防げるようになってきた

Slide 51

Slide 51 text

Site Isolationで変わってきたこと ● レンダラプロセスを掌握してもUXSSをする為には更にバグが必要になった ● ブラウザプロセスのアタックサーフェイスが増加した ● ブラウザのバグがサイトの設定で防げるようになってきた ● SOPバイパスがSite Isolation関連で守られていない所に集中し始めた

Slide 52

Slide 52 text

Site Isolationで変わってきたこと ● レンダラプロセスを掌握してもUXSSをする為には更にバグが必要になった ● ブラウザプロセスのアタックサーフェイスが増加した ● ブラウザのバグがサイトの設定で防げるようになってきた ● SOPバイパスがSite Isolation関連で守られていない所に集中し始めた ● Siteという概念がより強くなり始めた

Slide 53

Slide 53 text

Site Isolationをテストしたい方へ Spoof.js https://github.com/shhnjk/spoof.js Chromeのレンダラプロセス内のオリジンと URLを偽装してくれる WinDbgの拡張スクリプト オリジンとURLを偽装した後に任意のAPIを呼ぶことでそのAPIが偽装したオリジン やURLに騙されないか試せる

Slide 54

Slide 54 text

Questions? Acknowledgement: Thanks Chrome Site Isolation team! (nasko, lukasza, creis, and others)