mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
112 lines
13 KiB
Markdown
112 lines
13 KiB
Markdown
# BrowExt - permissions & host_permissions
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## 基本情報
|
|
|
|
### **`permissions`**
|
|
|
|
Permissionsは拡張機能の**`manifest.json`**ファイルで**`permissions`**プロパティを使用して定義され、ブラウザがアクセスできるほぼすべてのもの(クッキーや物理ストレージ)へのアクセスを許可します:
|
|
|
|
前のマニフェストは、拡張機能が`storage`権限を必要とすることを宣言しています。これは、[ストレージAPI](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)を使用してデータを永続的に保存できることを意味します。ユーザーにある程度の制御を与えるクッキーや`localStorage` APIとは異なり、**拡張機能のストレージは通常、拡張機能をアンインストールすることでのみクリアできます**。
|
|
|
|
拡張機能は、**`manifest.json`**ファイルに示された権限を要求し、拡張機能をインストールした後は、**常にブラウザでその権限を確認できます**。以下の画像のように:
|
|
|
|
<figure><img src="../../images/image (18).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
[**Chromiumブラウザ拡張機能が要求できる権限の完全なリストはこちら**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions)で見つけることができ、[**Firefox拡張機能の完全なリストはこちら**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**です。**
|
|
|
|
### `host_permissions`
|
|
|
|
オプションですが強力な設定である**`host_permissions`**は、拡張機能が[`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies)、[`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest)、および[`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs)などのAPIを介してどのホストと対話できるかを示します。
|
|
|
|
以下の`host_permissions`は基本的にすべてのウェブを許可します:
|
|
```json
|
|
"host_permissions": [
|
|
"*://*/*"
|
|
]
|
|
|
|
// Or:
|
|
"host_permissions": [
|
|
"http://*/*",
|
|
"https://*/*"
|
|
]
|
|
|
|
// Or:
|
|
"host_permissions": [
|
|
"<all_urls>"
|
|
]
|
|
```
|
|
これらは、ブラウザ拡張が自由にアクセスできるホストです。これは、ブラウザ拡張が **`fetch("https://gmail.com/")`** を呼び出すとき、CORSによって制限されないためです。
|
|
|
|
## `permissions` と `host_permissions` の悪用
|
|
|
|
### タブ
|
|
|
|
さらに、**`host_permissions`** は「高度な」 [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **機能を解放します。** これにより、拡張は [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) を呼び出し、**ユーザーのブラウザタブのリスト**を取得するだけでなく、どの**ウェブページ(アドレスとタイトルを意味する)が読み込まれているかを知ることができます。**
|
|
|
|
> [!CAUTION]
|
|
> それだけでなく、[**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **のようなリスナーもはるかに便利になります。** これらは、新しいページがタブに読み込まれるたびに通知されます。
|
|
|
|
### コンテンツスクリプトの実行 <a href="#running-content-scripts" id="running-content-scripts"></a>
|
|
|
|
コンテンツスクリプトは、必ずしも拡張マニフェストに静的に記述されるわけではありません。十分な**`host_permissions`**があれば、**拡張は** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **または** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript) **を呼び出すことで動的に読み込むこともできます。**
|
|
|
|
両方のAPIは、拡張に含まれるファイルだけでなく、**任意のコード**をコンテンツスクリプトとして実行することを許可します。前者はJavaScriptコードを文字列として渡すことを許可し、後者は注入脆弱性に対してより耐性のあるJavaScript関数を期待します。それでも、両方のAPIは誤用されると混乱を引き起こします。
|
|
|
|
> [!CAUTION]
|
|
> 上記の機能に加えて、コンテンツスクリプトは例えば**資格情報を傍受する**ことができます。これらがウェブページに入力されるときに。これらを悪用するもう一つの古典的な方法は、**すべてのウェブサイトに広告を注入することです。** ニュースウェブサイトの信頼性を悪用するために**詐欺メッセージ**を追加することも可能です。最後に、**銀行**ウェブサイトを操作して送金を再ルーティングすることもできます。
|
|
|
|
### 暗黙の特権 <a href="#implicit-privileges" id="implicit-privileges"></a>
|
|
|
|
一部の拡張特権は**明示的に宣言する必要がありません。** 一例は [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) です:その基本機能は、特権なしでアクセス可能です。どの拡張も、タブを開閉するときに通知を受け取ることができますが、これらのタブがどのウェブサイトに対応しているかは知りません。
|
|
|
|
無害すぎると思いますか? [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) はそれほど無害ではありません。これは**新しいタブを作成する**ために使用でき、基本的には [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) と同じで、どのウェブサイトでも呼び出すことができます。しかし、`window.open()` は**ポップアップブロッカーの影響を受けますが、`tabs.create()` は影響を受けません。**
|
|
|
|
> [!CAUTION]
|
|
> 拡張は、いつでも任意の数のタブを作成できます。
|
|
|
|
`tabs.create()` の可能なパラメータを確認すると、その機能が `window.open()` が制御できる範囲をはるかに超えていることに気付くでしょう。そして、FirefoxはこのAPIで `data:` URI の使用を許可していませんが、Chromeにはそのような保護がありません。**このようなURIのトップレベルでの使用は、** [**フィッシングに悪用されたため禁止されています**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**。**
|
|
|
|
[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update) は `tabs.create()` に非常に似ていますが、**既存のタブを修正します。** したがって、悪意のある拡張は、例えば任意の広告ページをあなたのタブの1つに読み込むことができ、対応するタブをアクティブにすることもできます。
|
|
|
|
### ウェブカメラ、位置情報など <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
|
|
|
|
ウェブサイトが特別な権限を要求できることはご存知でしょう。例えば、ウェブカメラ(ビデオ会議ツール)や地理的位置(地図)にアクセスするためです。これは悪用の可能性が大きい機能であり、ユーザーは毎回これを確認する必要があります。
|
|
|
|
> [!CAUTION]
|
|
> ブラウザ拡張ではそうではありません。**ブラウザ拡張が** [**ウェブカメラやマイクへのアクセスを要求する場合**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**、一度だけ権限を求める必要があります。**
|
|
|
|
通常、拡張はインストール直後にこれを行います。このプロンプトが受け入れられると、**ウェブカメラへのアクセスはいつでも可能になります。** ユーザーがこの時点で拡張と対話していなくてもです。はい、ユーザーは拡張が本当にウェブカメラへのアクセスを必要とする場合にのみこのプロンプトを受け入れます。しかし、その後は拡張が何かを秘密裏に録画しないことを信頼しなければなりません。
|
|
|
|
[あなたの正確な地理的位置](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) や [クリップボードの内容](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API) へのアクセスについては、明示的に権限を付与する必要はまったくありません。**拡張は単に `geolocation` または `clipboard` を** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **に追加します。** これらのアクセス権は、拡張がインストールされるときに暗黙的に付与されます。したがって、これらの特権を持つ悪意のあるまたは侵害された拡張は、あなたが何も気づかないうちにあなたの移動プロファイルを作成したり、コピーされたパスワードのためにクリップボードを監視したりすることができます。
|
|
|
|
**`history`** キーワードを拡張マニフェストの [permissions entry](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) に追加すると、**[history API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history)** へのアクセスが付与されます。これにより、ユーザーの全ブラウジング履歴を一度に取得でき、ユーザーがこれらのウェブサイトを再度訪れるのを待つ必要がありません。
|
|
|
|
**`bookmarks`** **権限** も同様の悪用の可能性があり、これにより**すべてのブックマークを** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks) **を介して読み取ることができます。**
|
|
|
|
### ストレージ権限 <a href="#the-storage-permission" id="the-storage-permission"></a>
|
|
|
|
拡張のストレージは、非常に似たキーと値のコレクションであり、[localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) を使用できる任意のウェブサイトと非常に似ています。したがって、ここに機密情報を保存すべきではありません。
|
|
|
|
しかし、広告会社もこのストレージを悪用する可能性があります。
|
|
|
|
### さらなる権限
|
|
|
|
[**Chromiumブラウザ拡張が要求できる権限の完全なリストはここにあります**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) および [**Firefox拡張の完全なリストはここにあります**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**。**
|
|
|
|
## 予防 <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
|
|
|
|
Googleの開発者のポリシーは、拡張が機能に必要な以上の特権を要求することを明示的に禁止しており、過剰な権限要求を効果的に軽減しています。ブラウザ拡張がこの境界を越えた例は、アドオンストアではなくブラウザ自体に付属して配布されたことです。
|
|
|
|
ブラウザは、拡張特権の悪用をさらに抑制できます。例えば、Chromeの [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) および [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) APIは、画面録画に使用され、悪用を最小限に抑えるように設計されています。tabCapture APIは、拡張アイコンをクリックするなどの直接的なユーザーの操作を通じてのみアクティブ化でき、desktopCaptureは録画するウィンドウのユーザー確認を必要とし、秘密裏の録画活動を防ぎます。
|
|
|
|
しかし、セキュリティ対策を強化すると、拡張の柔軟性とユーザーフレンドリーさが低下することがよくあります。[activeTab permission](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) はこのトレードオフを示しています。これは、拡張がインターネット全体にわたってホスト特権を要求する必要を排除するために導入され、ユーザーによって明示的にアクティブ化された場合にのみ、拡張が現在のタブにアクセスできるようにします。このモデルは、ユーザーが開始するアクションを必要とする拡張には効果的ですが、自動または事前のアクションを必要とする拡張には不十分であり、便利さと即時の応答性を損ないます。
|
|
|
|
## **参考文献**
|
|
|
|
- [https://palant.info/2022/08/17/impact-of-extension-privileges/](https://palant.info/2022/08/17/impact-of-extension-privileges/)
|
|
- [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|