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

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

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

2017/08/15 セキュリティ・キャンプ全国大会2017での、西村の講演資料になります

Recruit Technologies

August 24, 2017
Tweet

More Decks by Recruit Technologies

Other Decks in Technology

Transcript

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

    マルチメディアサポート • 内包しているミドルウェア • 各種API • UI部品 • ブラウズを便利にするための機能 • セキュリティ機能 • 他 Nishimura
  2. 演習1. ブラウザのモジュールを洗い出す(15分) • 以下の観点でブラウザのモジュールを列挙してみよう(何を調べても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フィルターの反応原因を探る(15分) • 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