BrowExt - permissions & host_permissions
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
permissions
Permissionsは拡張機能の**manifest.json
ファイルでpermissions
**プロパティを使用して定義され、ブラウザがアクセスできるほぼすべてのもの(クッキーや物理ストレージ)へのアクセスを許可します。
前のマニフェストは、拡張機能がstorage
権限を必要とすることを宣言しています。これは、ストレージAPIを使用してデータを永続的に保存できることを意味します。ユーザーにある程度の制御を与えるクッキーやlocalStorage
APIとは異なり、拡張機能のストレージは通常、拡張機能をアンインストールすることでのみクリアできます。
拡張機能は、**manifest.json
**ファイルに示された権限を要求し、拡張機能をインストールした後は、常にブラウザでその権限を確認できます。以下の画像のように:
Chromiumブラウザ拡張機能が要求できる権限の完全なリストはこちらで見つけることができ、Firefox拡張機能の完全なリストはこちらです。
host_permissions
オプションですが強力な設定である**host_permissions
**は、拡張機能がcookies
、webRequest
、およびtabs
などのAPIを介してどのホストと対話できるかを示します。
以下のhost_permissions
は基本的にすべてのウェブを許可します:
これらは、ブラウザ拡張が自由にアクセスできるホストです。これは、ブラウザ拡張が fetch("https://gmail.com/")
を呼び出すとき、CORSによって制限されないためです。
permissions
と host_permissions
の悪用さらに、host_permissions
は「高度な」tabs API 機能を解放します。 これにより、拡張は tabs.query() を呼び出し、ユーザーのブラウザタブのリストを取得するだけでなく、どのウェブページ(アドレスとタイトルを意味する)が読み込まれているかを知ることができます。
それだけでなく、tabs.onUpdated のようなリスナーもはるかに便利になります。 これらは、新しいページがタブに読み込まれるたびに通知されます。
コンテンツスクリプトは、必ずしも拡張のマニフェストに静的に記述されるわけではありません。十分な host_permissions
があれば、拡張は tabs.executeScript() または scripting.executeScript() を呼び出すことで動的に読み込むこともできます。
両方のAPIは、拡張に含まれるファイルだけでなく、任意のコードをコンテンツスクリプトとして実行することを許可します。前者はJavaScriptコードを文字列として渡すことを許可し、後者は注入脆弱性に対してより少ないリスクを持つJavaScript関数を期待します。それでも、両方のAPIは誤用されると大混乱を引き起こします。
上記の機能に加えて、コンテンツスクリプトは例えば資格情報を傍受することができます。これらがウェブページに入力されるときです。これらを悪用するもう一つの古典的な方法は、すべてのウェブサイトに広告を注入することです。ニュースウェブサイトの信頼性を悪用するために詐欺メッセージを追加することも可能です。最後に、銀行のウェブサイトを操作して送金を再ルーティングすることもできます。
一部の拡張特権は明示的に宣言する必要がありません。一例は tabs API です:その基本機能は、特権なしでアクセス可能です。どの拡張も、タブを開閉するときに通知を受け取ることができますが、これらのタブがどのウェブサイトに対応しているかは知りません。
無害すぎると思いますか? tabs.create() API はそれほど無害ではありません。これは新しいタブを作成するために使用でき、基本的には window.open() と同じで、どのウェブサイトでも呼び出すことができます。しかし、window.open()
はポップアップブロッカーの影響を受けますが、tabs.create()
は影響を受けません。
拡張は、いつでも任意の数のタブを作成できます。
tabs.create()
の可能なパラメータを見てみると、その機能が window.open()
が制御できる範囲をはるかに超えていることに気付くでしょう。そして、FirefoxはこのAPIで data:
URI の使用を許可していませんが、Chromeにはそのような保護がありません。このようなURIのトップレベルでの使用は フィッシングの悪用のために禁止されています。
tabs.update() は tabs.create()
と非常に似ていますが、既存のタブを修正します。したがって、悪意のある拡張は、例えば任意の広告ページをあなたのタブの1つに読み込むことができ、対応するタブをアクティブにすることもできます。
ウェブサイトが特別な権限を要求できることはご存知でしょう。例えば、ウェブカメラ(ビデオ会議ツール)や地理的位置(地図)にアクセスするためです。これは悪用の可能性が大きい機能であり、ユーザーは毎回これを確認する必要があります。
ブラウザ拡張ではそうではありません。ブラウザ拡張が ウェブカメラやマイクへのアクセスを要求する場合、一度だけ権限を求める必要があります
通常、拡張はインストール直後にこれを行います。このプロンプトが受け入れられると、ウェブカメラへのアクセスはいつでも可能であり、ユーザーがこの時点で拡張と対話していなくても可能です。はい、ユーザーは拡張が本当にウェブカメラへのアクセスを必要とする場合にのみこのプロンプトを受け入れます。しかし、その後は拡張が何かを秘密裏に録画しないことを信頼しなければなりません。
あなたの正確な地理的位置 や クリップボードの内容 へのアクセスについては、明示的に権限を付与する必要はまったくありません。拡張は単に geolocation
または clipboard
を permissions entry に追加します。 これらのアクセス権は、拡張がインストールされるときに暗黙的に付与されます。したがって、これらの特権を持つ悪意のあるまたは侵害された拡張は、あなたの動きのプロファイルを作成したり、コピーされたパスワードのためにクリップボードを監視したりすることができますが、あなたは何も気づかないでしょう。
history
キーワードを拡張マニフェストの permissions entry に追加すると、history API へのアクセスが付与されます。これにより、ユーザーの全ブラウジング履歴を一度に取得でき、ユーザーがこれらのウェブサイトを再度訪れるのを待つ必要がありません。
bookmarks
権限 も同様の悪用の可能性があり、これによりすべてのブックマークを bookmarks API を介して読み取ることができます。
拡張のストレージは、非常に似たキーと値のコレクションであり、localStorage を使用できる任意のウェブサイトと非常に似ています。したがって、ここに機密情報を保存すべきではありません。
しかし、広告会社もこのストレージを悪用する可能性があります。
Chromiumブラウザ拡張が要求できる権限の完全なリストはここにあります および Firefox拡張の完全なリストはここにあります。
Googleの開発者ポリシーは、拡張がその機能に必要な以上の特権を要求することを明示的に禁止しており、過剰な権限要求を効果的に軽減しています。ブラウザ拡張がこの境界を越えた例は、アドオンストアではなくブラウザ自体に付属して配布されたことです。
ブラウザは、拡張特権の悪用をさらに抑制することができます。例えば、Chromeの tabCapture および desktopCapture APIは、画面録画に使用され、悪用を最小限に抑えるように設計されています。tabCapture APIは、拡張アイコンをクリックするなどの直接的なユーザー操作を通じてのみアクティブ化でき、desktopCaptureは録画するウィンドウのユーザー確認を必要とし、秘密裏の録画活動を防ぎます。
しかし、セキュリティ対策を強化すると、拡張の柔軟性とユーザーフレンドリーさが低下することがよくあります。activeTab permission はこのトレードオフを示しています。これは、拡張がインターネット全体にわたってホスト権限を要求する必要を排除するために導入され、ユーザーによって明示的にアクティブ化された場合にのみ、拡張が現在のタブにアクセスできるようにします。このモデルは、ユーザーが開始するアクションを必要とする拡張には効果的ですが、自動または事前のアクションを必要とする拡張には不十分であり、便利さと即時の応答性を損ないます。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)