hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md

13 KiB
Raw Blame History

BrowExt - 权限 & host_permissions

从零到英雄学习AWS黑客技术通过 htARTE (HackTricks AWS Red Team Expert)!

支持HackTricks的其他方式

基本信息

permissions

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

上述manifest声明扩展需要storage权限。这意味着它可以使用存储API来持久存储其数据。与提供给用户某种程度控制的cookies或localStorage APIs不同通常只有卸载扩展才能清除扩展存储

扩展将请求其**manifest.json文件中指示的权限,安装扩展后,您可以始终在浏览器中检查其权限**,如下图所示:

您可以在这里找到Chromium浏览器扩展可以请求的权限的完整列表以及Firefox扩展的完整列表

host_permissions

可选但功能强大的设置**host_permissions**指示扩展将能够通过诸如cookieswebRequesttabs等api与哪些主机进行交互。

以下host_permissions基本上允许所有web

"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不允许在此API中使用 `data:` URIChrome却没有这样的保护。**在顶级使用这些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),根本不需要显式授予权限。**扩展只需在其清单的** [**权限条目**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **中添加 `geolocation` 或 `clipboard`**。这些访问权限在安装扩展时隐含地被授予。因此,拥有这些权限的恶意或受损扩展可以创建你的移动轮廓或监视你的剪贴板以复制密码,而你却没有察觉到任何事情。

将 **`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>

谷歌的开发者政策[明确禁止](https://developer.chrome.com/docs/webstore/program_policies/#permissions)请求比扩展功能所需更多的权限。根据我的经验,这条规则实际上是有效的。我只能想到一个案例,其中一个浏览器扩展[请求了过多的权限](https://palant.info/2020/01/13/pwning-avast-secure-browser-for-fun-and-profit/#selecting-a-target),而这个特定的扩展是与浏览器一起分发的,而不是通过某个插件商店。

在某些情况下,浏览器可以做得更好,以**限制扩展权限的滥用潜力**。例如Chrome允许通过 [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) 或 [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API进行屏幕录制。滥用潜力很低因为前者只能作为**对用户操作的响应**(通常是点击扩展图标)启动,而后者会弹出一个提示来选择要录制的应用程序窗口。这两者都足以防止扩展在后台悄悄开始录制。

然而,这样的安全改进往往会使扩展**变得不那么灵活和用户友好**。这里的一个很好的例子是 [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://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)

<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中看到你的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](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) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享你的黑客技巧。

</details>