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

ブラウザの脆弱性とそのインパクト

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 ブラウザの脆弱性とそのインパクト

セキュリティ・キャンプ全国大会2017の講義資料です(Masato Kinugawaさんとの共同制作です)。

Avatar for MUNEAKI NISHIMURA

MUNEAKI NISHIMURA

August 15, 2017
Tweet

More Decks by MUNEAKI NISHIMURA

Other Decks in Technology

Transcript

  1. ブラウザの構成要素は • 様々な観点で、心ときめくモジュールを見つけ出す • ドキュメントパーサ • スクリプト処理機能 • プロトコル •

    マルチメディアサポート • 内包しているミドルウェア • 各種API • UI部品 • ブラウズを便利にするための機能 • セキュリティ機能 • 他 Nishimura
  2. 演習1. ブラウザのモジュールを洗い出す(10分) • 以下の観点でブラウザのモジュールを列挙してみよう(何を調べてもOK) • ドキュメントパーサ • スクリプト処理機能 • プロトコル

    • マルチメディアサポート • 内包しているミドルウェア • 各種API • UI部品 • ブラウズを便利にするための機能 • セキュリティ機能 • 他 Nishimura
  3. 演習1の回答例 • 例えばこんなモジュール • ドキュメントパーサ(HTML, XML, SVG, MathML, XUL) •

    スクリプト処理機能(JavaScript, VBScript, asm.js, WebAssembly) • プロトコル(HTTP, FTP, WebSocket, HTTP/2, QUIC, DNS, mDNS, WebRTC) • マルチメディアサポート(JPG, GIF, PNG, WebM, Ogg, AAC, MP3, MP4, FLAC) • 内包しているミドルウェア(Skia, ffmpeg, ICU, NSS, OpenVR, libpng, sqlite) • 各種API(Fetch API, Push API, Extension API, Fullscreen API, Web Speech API) • UI部品(Location Bar, History, Bookmark, Context Menu) • ブラウズを便利にするための機能(Chrome Extension, Reading View, Secret Mode) • セキュリティ機能(SOP, XSS Filter, CSP, SRI, TLS, Mixed Content, HSTS, HPKP, CT) • 他 Nishimura
  4. 新しい機能を探す • 新しく搭載された機能は、まだ誰も脆弱性を探していない可能性が高い • 開発者向けのアルファ版を狙う • Firefox Nightly • Chrome

    Dev, Canary • Safari Technology Preview • EdgeはWindows 10の先行リリース版が狙い目(@shhnjk談) • 新しい機能を知る手段 • Release Notes • 各ブラウザのFeature Status • 各ブラウザベンダーの技術ブログや開発者向けカンファレンスの動画 • バグ管理システム(RSSで取得・ただしS/N比はあまり良くない) Nishimura
  5. 古いイケてない機能を探す • こんな古い機能はイケてない • 標準化されておらず仕様が不明確なもの • 流行らなかったもの • プラグイン全般(Flash/Adobe Reader)

    • まともなドキュメントすらないことも多い • 古い機能を知る手段 • Release Notes • セキュリティ研究者の投稿や発表 Kinugawa
  6. Mario Heiderich: "My Sweet Innocence Exposed - Eleven Reasons why

    we will all miss you, 'e'" https://www.youtube.com/watch?v=aeevfVXPIqo Kinugawa
  7. 列挙する・列挙されたものから探す • 1つテーマを決めて列挙してみる • HTTPリクエストを送信できるJavaScriptのAPI(sendBeacon, Fetch, Worker...) • ブラウザネイティブのダイアログが出現するAPI(alert, confirm,

    getUserMedia...) • MIMEタイプ(text/javascript, image/svg+xml, application/octet-stream...) • 既に列挙されたものをみていくのも有効 • windowオブジェクト • HTTPLeaks • HTML5 Security Cheatsheet • 列挙のメリット • 一度にテストできる • 対象の相対的な面白さに気付ける Kinugawa
  8. コミット履歴から更なる気付きを得る • Gitのコミット履歴から面白そうな機能追加を探す • モバイルOSの新規機能対応(3D Touch, Spotlight, Universal Links) •

    実装中の機能(Web App Manifest, GeckoView) • コミット履歴から新たな着眼点を得る • プログラマが脆弱性を作りやすそうな記述の存在(正規表現, 文字列への変数埋め込み) • 扱いの難しいサードパーティライブラリの利用(SQLite, Alamofire) Nishimura
  9. Webアプリの脆弱性検査から気付きを得る • ブラウザがこう動けばアプリが脆弱になるのに、と気付くことがある • URL文字列を取得するAPIが特定の記号文字列を返すなら… • 信頼できない文字列を扱う一連の関数の動作が1つでもおかしければ… • 任意のhostヘッダを犠牲者に送信させることができたなら… •

    CSPが正しく機能しなければ… • 攻撃のシナリオが明確なら、対象を定めやすい • ➡ location.* プロパティが返す値 • ➡ 利用されている関数の詳細な動作 • ➡ ヘッダを送信できる関数の制限が適切か • ➡ CSPの実装が正確か Kinugawa
  10. Bug 1073952 - CSP can be bypassed with <iframe [sandbox]

    and [srcdoc]> https://bugzilla.mozilla.org/show_bug.cgi?id=1073952 Kinugawa
  11. 過去に学ぶ • 過去の修正された脆弱性の情報を見る • セキュリティアドバイザリ • 時間が経って開示されたバグ票(bugzilla.mozilla.org, bugs.chromium.org) • 報告者のブログやカンファレンスの発表資料

    • 過去のバグからはたくさんの有益な情報が得られる • どこに脆弱性があったのか • どんな脆弱性があるのか • どうすれば脆弱性が発生しうるのか • 報告者はどのように脆弱性を発見したか Kinugawa
  12. Kinugawaがやったこと • はせがわようすけさんの資料を熟読(http://utf-8.jp) • さまざまなブラウザに起因するXSS手法があることを知る • Content Sniffing • 文字コード

    • 使える文字種に縛りがあるときのXSS • mXSS • それぞれを自分の手を動かして再現させた • さらに、深く調べる余地がありそうな部分を自分で調べ直した • 全ての文字コードの動作を一から調べてみよう Kinugawa
  13. 文字コードを調べてみつかったもの(一例) • CVE-2011-3058 • https://bugs.chromium.org/p/chromium/issues/detail?id=109574 • EUC-JPのページで、0x8EE3というバイトシーケンスでバックスラッシュ文字が出現。文字 列リテラル中でユーザ入力を受け付けている場合、本来バックスラッシュが出現する0x5C をエスケープしていてもXSSが起こってしまう。 •

    CVE-2013-5612 • https://www.mozilla.org/en-US/security/advisories/mfsa2013-106/ • POSTリクエストを経由して文字コードが指定されていないページにアクセスすると、直 前の文字コードを使用してページが表示されてしまう。ISO-2022-JPなどの特殊なバイト 表現を持つ文字コードを利用することでHTML構造を破壊しXSSが起こってしまう。 Kinugawa
  14. サードパーティライブラリの脆弱性 • Mozilla NSS(Network Security Module) • FirefoxのTLSや暗号処理で使われているライブラリ • ドイツの研究者Hanno

    Böck氏が、暗号処理で使われるbig_numの剰余演算の脆弱性を AFLによるFuzzingで発見。このFuzzingでは、NSSとOpenSSLの演算結果を比較し、異なる 演算結果が出たときにアサーションする手法が用いられた https://blog.fuzzing-project.org/37-Mozilla-NSS-Wrong-calculation-results-in-mp_div-and-mp_exptmod.html • SQLite • Beijing Chaitin Techの研究者が、SQLiteにおけるメモリ破壊の脆弱性を発見。この脆弱性 はSafariのWeb SQL Databaseに影響することを用い、Pwn2OwnにてSafariの攻略に成功 https://www.blackhat.com/docs/us-17/wednesday/us-17-Feng-Many-Birds-One-Stone-Exploiting-A-Single- SQLite-Vulnerability-Across-Multiple-Software.pdf Nishimura
  15. 対象を深く知る • 目的や使用用途は? • どのように使うのか? • InputとOutputは? • 対象にはどのような制限事項があるのか? •

    ブラウザ上でどんなことが起きてはいけないのか? • 対象が提供する機能は悪用できないか? • ブラウザのセキュリティ機構を迂回できないか? • これまで安全と見られていたWebサイトに対する新たな攻撃手段として利用できないか? Nishimura
  16. 演習4. XSSフィルターの反応原因を探る(20分) • Internet Explorer のXSSフィルターは次のURLになぜか反応します • https://goo.gl/WSEkgq • C:¥Windows¥System32¥mshtml.dll

    のバイナリから正規表現をみつけ、 どの部分に反応したかを推測しよう • 正規表現は"implementation"と検索するとみつかります • また、本来ならどのような攻撃文字列を阻止するものか考え、その文字列を 使って以下のページでアラートを実行してみよう • https://goo.gl/Vmkebc Kinugawa
  17. 演習4の回答: 本来遮断したいもの Kinugawa {[¥"¥'][ ]*(([^a-z0-9~_:¥'¥" ])|((i|(¥¥u0069))(n|(¥¥u006[Ee])))).+?{¥(}.*?{¥)}} "alert" in window //true

    new Date() instanceof Date //true <script>var q=""in alert(1)//"</script> <script>var q=""instanceof alert(1)//"</script> 補足: in と instanceof 演算子について
  18. フィルターを深く調べてみつけたもの • フィルターのバイパス • 以前までのバイパス可能なフィルタールール: Kinugawa <script> var q=""i¥u006E alert(1)//";

    </script> {[¥"¥'][ ]*(([^a-z0-9~_:¥'¥" ])|(in)).+?{¥(}.*?{¥)}} バイパスの例: (※Windows 8.1以下のIE11ではまだ古いルールが使われています。)
  19. 演習5のヒント fetch('http://api.example.jp/path',{ method:'POST', headers: { 'Content-Type':'text/plain' }, body:'Hello World!' }).then(function(res){

    console.log(res.headers.get('Content-Type')); }).catch(function(err){ console.error(err); }); Nishimura
  20. 演習5のヒント fetch('http://api.example.jp/path',{ method:'POST', headers: { 'Content-Type':'text/plain' }, body:'Hello World!' }).then(function(res){

    console.log(res.headers.get('Content-Type')); }).catch(function(err){ console.error(err); }); 常にボディを指定して良い? どんな文字を含めても良い? どんなヘッダの値を読んでも良い? どんな情報が含まれても良い? どんなURLを指定しても良い? どんなヘッダを指定しても良い? どんなメソッドを指定しても良い? Nishimura
  21. 演習5の回答例 • 通信先ホスト • about, blob, data, file, ftp, filesystem,

    http(s)以外のスキームはエラーを返す • 現在のオリジンによって指定できないスキームもある(例:http:  file:のFetchは禁止) • HSTS, HPKP, CSP, Mixed Content Blockに従うこと • SOPおよびCORSに準拠すること • 接続禁止ポート(Port Banning)に従うこと • 通信メソッド • CONNECT, TRACE, TRACKメソッドは指定禁止 Nishimura
  22. 演習5の回答例 • リクエストヘッダ • 以下のヘッダは指定禁止 • Accept-Charset, Accept-Encoding, Access-Control-Request-Headers, Access-Control-Request-

    Method, Connection, Content-Length, Cookie, Cookie2, Date, DNT, Expect, Host, Keep-Alive, Origin, Referer, TE, Trailer, Transfer-Encoding, Upgrade, Via, Proxy-*, Sec-* • ヘッダ名に0x00, 0x0a, 0x0dを含めてはいけない • その他のヘッダはCORSに準拠すること • リクエストボディ • GET, HEADリクエストにリクエストボディを付けてはいけない Nishimura
  23. 演習5の回答例 • レスポンスヘッダ • 以下のヘッダは読み取り禁止 • Set-Cookie, Set-Cookie2 • その他のヘッダはCORSに準拠すること

    • エラーオブジェクト • 接続先のリダイレクト後のURLが異なるオリジンである場合、 返却されるオブジェクトのURLにパスやクエリ文字列を含んではいけない • 接続先が異なるオリジンである場合、取得したデータを含めてはならない Nishimura
  24. 仕様どおりに動くかを調べるだけで脆弱性が見つかる • 2015年5月:Firefox 39 • リクエストにHostやCookieヘッダを付加できる($3000) https://bugzilla.mozilla.org/show_bug.cgi?id=1162411 • 2015年5月:Firefox 40

    Nightly • リダイレクト後のクロスオリジンURLがレスポンスボディに含まれる($3000) https://bugzilla.mozilla.org/show_bug.cgi?id=1162018 • しかも歴史は繰り返す • 次の2ページで紹介するのは2017年に他の人が見つけたMicrosoft Edgeの脆弱性 Nishimura
  25. 対象のおかしな動作を探す • わずかな「いつもと違う」に目を光らせる • 設定通りの動きをしない • アドレスバーが更新されない • クラッシュ、フリーズ •

    文字化け • HTMLタグが効いている • ブラウザによって動作が異なる • 一見ただのバグでも、詳しくみると悪用可能な動作かもしれない Kinugawa
  26. おかしな動作は案外わかりにくい • 問題と気付けるかどうかが重要 • 例えば CVE-2012-3695 • http://masatokinugawa.l0.cm/2012/08/safari-location.href.html • location.href

    に含まれるBasic認証情報部分がデコードして返される • 実際の利用場面を考えれば、まずい動作であることがわかりますか? https://aaa%[email protected]/ https://aaa/@example.com/ Kinugawa
  27. おかしな動作を引き出す方法 • 様々な要素と対象を組み合わせてみる • プロトコルスキーム (http:, https:, ftp:, data:, resource:,

    about:, chrome-extension:) • リクエストメソッド (GET, POST, HEAD, OPTIONS, TRACE) • 表示される場所 (iframe, object/embedタグ, svgのforeignobject, Reading View) • Fetchする方法 (imgタグ, video/audioタグ, WorkerのimportScripts, ServiceWorker内) • ナビゲーションの方法 (Locationヘッダ, meta refresh, window.open, ブラウザバック) • 異常な入力 (重複した値, 長すぎる文字列, 空の値, 大きすぎる数値, マイナスの数値) • あらかじめ1つのくくりで列挙した要素があると便利 Kinugawa
  28. 先週修正されたFirefoxの脆弱性 • CVE-2017-7788 • https://bugzilla.mozilla.org/show_bug.cgi?id=1073952 • <iframe sandbox>のsrcdoc属性にscript要素を記述すると、CSPのscript-src指定に関わらず インラインスクリプトが実行される。ただしスクリプトが動作するオリジンはsandbox originであり、親フレームのCookieなどは盗めない

    • CVE-2017-7789 • https://bugzilla.mozilla.org/show_bug.cgi?id=1074642 • HTTPレスポンスにHSTSヘッダが複数付いているとHSTSが効かない。サイトの構成で OriginとEdgeサーバの両方でHSTSヘッダを付けた場合、HSTSが効かない。 HTTP ヘッダインジェクションでHSTSを無効化する悪用方法も考えられる Nishimura
  29. 図に表すとこんなかんじ CSP sandbox iframe srcdoc HSTS 重複した値 POST feed: Mixed

    Content Blocker CVE-2015-4483 CVE-2017-7788 CVE-2017-7789 × × × ➡ ➡ ➡ × × × 考慮されていない組み合わせからおかしな動作が起き、脆弱性が引き起こされる Kinugawa