# BrowExt - permissions & host\_permissions

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS Red Team Expert）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[NFTs收藏](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>

## 基本信息

### **`permissions`**

权限在扩展的\*\*`manifest.json`**文件中使用**`permissions`\*\*属性进行定义，允许访问几乎任何浏览器可以访问的内容（如Cookies或物理存储）：

上述清单声明了扩展需要`storage`权限。这意味着它可以使用[存储API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)来持久存储数据。与给用户一定程度控制权的Cookies或`localStorage` API不同，**扩展存储通常只能通过卸载扩展来清除**。

扩展将在其\*\*`manifest.json`**文件中请求所需的权限，安装扩展后，您可以在浏览器中**随时检查其权限\*\*，如下图所示：

<figure><img src="/files/sZTSqOLNR2kad6pNCh2A" 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`还解锁了“高级”**[**标签 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)**，不仅可以获取用户浏览器标签的列表**，还可以了解加载的**网页（即地址和标题）**。

{% hint style="danger" %}
不仅如此，像[tabs.onUpdated](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated)**这样的监听器也变得更加有用**。每当新页面加载到标签中时，它们将收到通知。
{% endhint %}

### 运行内容脚本 <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 都会造成严重破坏。

{% hint style="danger" %}
除了上述功能，内容脚本还可以例如拦截凭据，因为这些凭据是输入到网页中的。滥用它们的另一个经典方式是在每个网站上**注入广告**。添加**欺诈信息**以滥用新闻网站的信誉也是可能的。最后，它们还可以**操纵银行**网站以重新路由资金转账。
{% endhint %}

### 隐式权限 <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()`则没有**。

{% hint style="danger" %}
扩展可以随时创建任意数量的标签。
{% endhint %}

如果您查看可能的`tabs.create()`参数，您还会注意到它的功能远远超出了`window.open()`被允许控制的范围。而且，虽然 Firefox 不允许使用`data:` URI 与此 API 一起使用，但 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()`非常相似，但会**修改现有标签**。因此，恶意扩展可以任意地将广告页面加载到您的标签中，并且还可以激活相应的标签。

### 摄像头、地理位置和其他权限 <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>

您可能知道网站可以请求特殊权限，例如访问您的摄像头（视频会议工具）或地理位置（地图）。这些功能具有被滥用的潜力，因此用户每次都必须确认他们仍然希望这样做。

{% hint style="danger" %}
但浏览器扩展不是这样。**如果浏览器扩展**[**想要访问您的摄像头或麦克风**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**，它只需要请求一次权限**
{% endhint %}

通常，扩展会在安装后立即这样做。一旦接受了此提示，**在任何时候都可以访问摄像头**，即使用户此时没有与扩展进行交互。是的，用户只有在扩展真正需要摄像头访问时才会接受此提示。但之后，他们必须信任扩展不会秘密记录任何内容。

通过访问[您的精确地理位置](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation)或[剪贴板内容](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API)，无需明确授予权限。**扩展只需将`geolocation`或`clipboard`添加到**[**清单的权限条目**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions)**中**。这些访问权限在安装扩展时隐式授予。因此，具有这些权限的恶意或受损扩展可以创建您的移动轨迹或监视您的剪贴板以复制密码，而您却察觉不到。

将\*\*`history`**关键字添加到扩展清单的**[**权限条目**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions)**中授予对**[**历史 API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history)**的**访问权限\*\*。它允许一次性检索用户的整个浏览历史记录，而无需等待用户再次访问这些网站。

**`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 权限](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://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing>

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS Red Team Expert）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hacktricks.xsx.tw/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
