突破限制—一份安全编写和审计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漏洞

安全建议

  • 避免在内容脚本中使用innerHTMLhtml()或设置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

功能概述

  1. 扩展程序提取:从Chrome应用商店下载扩展程序
  2. manifest分析:查看美化后的manifest.json
  3. 指纹识别:检测web_accessible_resources并生成指纹识别脚本
  4. 点击劫持分析:识别可能受点击劫持影响的页面
  5. 权限分析:显示安装时向用户展示的权限警告
  6. 危险功能检测:识别innerHTMLchrome.tabs.executeScript等危险用法
  7. 入口点分析:识别用户/外部输入点
  8. CSP分析:检测CSP薄弱点和可能的绕过方式
  9. 已知漏洞检测:使用Retire.js检查已知漏洞的库
  10. 下载选项:提供原始和美化后的扩展程序下载

使用价值

  • 自动化重复性审计任务
  • 提供可链接的详细报告
  • 缓存扫描结果提高效率

总结

开发安全的Chrome扩展程序需要:

  1. 严格验证所有外部输入(DOM、事件、消息)
  2. 最小化外围区域和权限
  3. 使用浏览器内置的安全API(如URL()构造函数)
  4. 实施严格的CSP策略
  5. 定期使用自动化工具进行安全审计
  6. 遵循最小特权原则设计扩展功能

通过遵循这些准则,可以显著降低扩展程序的安全风险,保护用户免受攻击。

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 安全建议 : 使用 isTrusted 属性验证事件是否由用户真实触发 对事件属性值进行严格验证 消息传递的安全问题 消息来源验证 常见的错误验证方式容易被绕过: indexOf(".trusteddomain.com") 可被 https://a.trusteddomain.com.attacker.com 绕过 不严谨的正则表达式容易被特殊构造的域名绕过 安全建议 : 使用静态白名单验证消息来源 精确匹配可信来源,避免使用通配符 消息发送者验证 验证消息的 source 属性是否与预期窗口匹配 防止恶意页面通过内容脚本执行不安全的DOM操作 外围区域最小化原则 子域信任风险 允许任意子域访问扩展API会显著增加攻击面 子域可能存在XSS漏洞、文件上传漏洞或被接管风险 典型案例:ZenMate VPN扩展允许数十个域的子域访问特权API,其中一个过期域名被攻击者注册导致漏洞 安全建议 : 最小化可访问扩展API的域列表 避免使用 externally_connectable 指令开放过多权限 URL解析的安全实践 安全解析URL 避免使用正则表达式手动解析URL 使用浏览器内置的 URL() 构造函数确保解析一致性 web_ accessible_ resources风险 点击劫持风险 web_accessible_resources 指令定义哪些扩展资源可被外部网站嵌入 过度开放资源可能导致点击劫持漏洞 典型案例:Steam Inventory Helper扩展因点击劫持导致UXSS漏洞 安全建议 : 最小化 web_accessible_resources 的范围 对特权操作页面实施额外的防护措施 自动化审计工具tarnish 功能概述 扩展程序提取 :从Chrome应用商店下载扩展程序 manifest分析 :查看美化后的manifest.json 指纹识别 :检测 web_accessible_resources 并生成指纹识别脚本 点击劫持分析 :识别可能受点击劫持影响的页面 权限分析 :显示安装时向用户展示的权限警告 危险功能检测 :识别 innerHTML 、 chrome.tabs.executeScript 等危险用法 入口点分析 :识别用户/外部输入点 CSP分析 :检测CSP薄弱点和可能的绕过方式 已知漏洞检测 :使用Retire.js检查已知漏洞的库 下载选项 :提供原始和美化后的扩展程序下载 使用价值 自动化重复性审计任务 提供可链接的详细报告 缓存扫描结果提高效率 总结 开发安全的Chrome扩展程序需要: 严格验证所有外部输入(DOM、事件、消息) 最小化外围区域和权限 使用浏览器内置的安全API(如 URL() 构造函数) 实施严格的CSP策略 定期使用自动化工具进行安全审计 遵循最小特权原则设计扩展功能 通过遵循这些准则,可以显著降低扩展程序的安全风险,保护用户免受攻击。