突破限制—一份安全编写和审计Chrome扩展程序的指南(下)
字数 1790 2025-08-27 12:33:23
Chrome扩展程序安全开发与审计指南(下)
内容脚本的安全隐患
内容脚本不受CSP限制
- 内容脚本不遵守扩展程序的CSP策略,也不遵守网页的CSP策略(除非将
<script>注入到网页DOM中) - 即使网页有严格的CSP(如
script-src 'self'; object-src 'self'),内容脚本仍可使用eval()等危险函数 - 典型案例:Reddit Enhancement Suite (RES)扩展通过内容脚本引入XSS漏洞
安全建议:
- 避免在内容脚本中使用
innerHTML、html()或设置href(javascript:URIs)等不安全的DOM操作 - 对用户控制的输入进行严格过滤和转义
不可信的网页DOM
- 扩展程序不应信任外部网页提供的DOM内容
- 攻击者可以修改DOM布局或通过XSS在DOM中植入恶意内容
- 典型案例:Grammarly扩展将敏感认证令牌放入所有网页的DOM中,导致信息泄露
安全建议:
- 不要在DOM中存储敏感信息
- 对从DOM中获取的数据进行严格验证
JavaScript事件的安全处理
事件欺骗风险
- 攻击者可以创建合成事件并伪造事件属性
- 即使文档声明某些属性为"只读",合成事件仍可修改这些属性
- 示例:伪造
keydown事件的code属性导致XSS
// 不安全的代码示例
document.body.addEventListener("keydown", function(keyevent) {
document.getElementById("last_keypress_div").innerHTML = keyevent.code;
});
安全建议:
- 使用
isTrusted属性验证事件是否由用户真实触发 - 对事件属性值进行严格验证
// 安全的代码示例
document.body.addEventListener("keydown", function(keyevent) {
if(keyevent.isTrusted) {
document.getElementById("last_keypress_div").innerHTML = keyevent.code;
}
});
消息传递的安全问题
消息来源验证
- 常见的错误验证方式容易被绕过:
indexOf(".trusteddomain.com")可被https://a.trusteddomain.com.attacker.com绕过- 不严谨的正则表达式容易被特殊构造的域名绕过
安全建议:
- 使用静态白名单验证消息来源
- 精确匹配可信来源,避免使用通配符
var trusted_origins = [
"https://trusteddomain.com",
"https://www.trusteddomain.com",
"https://extension.trusteddomain.com"
];
if(trusted_origins.includes(received_message.origin)) {
// 处理消息
}
消息发送者验证
- 验证消息的
source属性是否与预期窗口匹配 - 防止恶意页面通过内容脚本执行不安全的DOM操作
if(received_message.source !== window) {
return;
}
外围区域最小化原则
子域信任风险
- 允许任意子域访问扩展API会显著增加攻击面
- 子域可能存在XSS漏洞、文件上传漏洞或被接管风险
- 典型案例:ZenMate VPN扩展允许数十个域的子域访问特权API,其中一个过期域名被攻击者注册导致漏洞
安全建议:
- 最小化可访问扩展API的域列表
- 避免使用
externally_connectable指令开放过多权限
"externally_connectable": {
"matches": ["https://trusteddomain.com"]
}
URL解析的安全实践
安全解析URL
- 避免使用正则表达式手动解析URL
- 使用浏览器内置的
URL()构造函数确保解析一致性
function check_origin_match(input_url, target_origin) {
var parsed_url = new URL(input_url);
return (parsed_url.origin === target_origin);
}
web_accessible_resources风险
点击劫持风险
web_accessible_resources指令定义哪些扩展资源可被外部网站嵌入- 过度开放资源可能导致点击劫持漏洞
- 典型案例:Steam Inventory Helper扩展因点击劫持导致UXSS漏洞
安全建议:
- 最小化
web_accessible_resources的范围 - 对特权操作页面实施额外的防护措施
"web_accessible_resources": [
"images/*.png",
"script/analytics.js"
]
自动化审计工具tarnish
功能概述
- 扩展程序提取:从Chrome应用商店下载扩展程序
- manifest分析:查看美化后的manifest.json
- 指纹识别:检测
web_accessible_resources并生成指纹识别脚本 - 点击劫持分析:识别可能受点击劫持影响的页面
- 权限分析:显示安装时向用户展示的权限警告
- 危险功能检测:识别
innerHTML、chrome.tabs.executeScript等危险用法 - 入口点分析:识别用户/外部输入点
- CSP分析:检测CSP薄弱点和可能的绕过方式
- 已知漏洞检测:使用Retire.js检查已知漏洞的库
- 下载选项:提供原始和美化后的扩展程序下载
使用价值
- 自动化重复性审计任务
- 提供可链接的详细报告
- 缓存扫描结果提高效率
总结
开发安全的Chrome扩展程序需要:
- 严格验证所有外部输入(DOM、事件、消息)
- 最小化外围区域和权限
- 使用浏览器内置的安全API(如
URL()构造函数) - 实施严格的CSP策略
- 定期使用自动化工具进行安全审计
- 遵循最小特权原则设计扩展功能
通过遵循这些准则,可以显著降低扩展程序的安全风险,保护用户免受攻击。