挖洞经验 | 由Google Voice插件触发的DOM-XSS漏洞
字数 1355 2025-08-15 21:31:03
Google Voice插件DOM-XSS漏洞分析与教学文档
漏洞概述
本漏洞是一个存在于Google Voice浏览器插件中的DOM型跨站脚本(XSS)漏洞,允许攻击者在安装了该插件的用户环境中执行任意JavaScript代码。该漏洞获得了Google漏洞奖励计划$3,133.7的奖励。
漏洞发现过程
- 研究人员在Gmail收件箱中测试XSS Payload
oneerror=alert(1)时意外触发了弹窗 - 初始误以为是Google Ads规则触发的存储型XSS
- 进一步分析发现需要同时满足两个条件:
- 系统中安装了Google Voice插件
- 收件箱中显示特定格式的XSS Payload
漏洞影响范围
该漏洞具有全局性影响,可在以下环境中触发:
- 谷歌用户相关网站(accounts.google.com)
- 第三方注册网站(如facebook.com)
- 任何安装了Google Voice插件的浏览器环境
漏洞技术分析
漏洞根源
漏洞位于Google Voice插件的contentscript.js文件中的Wg()函数,该函数负责从页面内容中识别电话号码并创建可点击的呼叫链接。
关键漏洞代码
function Wg(a) {
for (var b = /(^|\s)((\+1\d{10})|((\+1[d{3}1,3}\d{3}1,2}\d{4}))(\s|$)/m,
c = document.evaluate('.//text()[normalize-space(a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null),
d = 0; d < c.snapshotLength; d++) {
a = c.snapshotItem(d);
var f = b.exec(a.textContent);
if (f && f.length) {
f = f[2];
var g = "gc-number-" + Ug,
h = '<span id="' + g + '" class="gc-cs-link"title="Call with Google Voice">' + f + "</span>",
k;
// ...省略部分代码...
w = a.parentNode.innerHTML,
y = w.replace(f, h);
a.parentNode.innerHTML = y
// ...省略部分代码...
}
}
}
漏洞触发流程
- 使用
document.evaluate方法遍历页面中的所有文本节点 - 通过正则表达式匹配美国电话号码格式
- 将匹配到的电话号码(
f)插入到新创建的span元素(h)中 - 使用
innerHTML将原始内容(w)中的电话号码替换为可点击的span元素(y) - 通过
innerHTML或insertBefore将修改后的内容写回DOM
漏洞成因
- 不安全的HTML操作:直接使用
innerHTML属性插入未经过滤的用户输入 - 错误的变量引用:开发者本意是处理电话号码(
f),但实际上处理了包含XSS Payload的原始文本节点(a) - 缺乏输入过滤:对文本节点内容没有进行适当的XSS过滤
漏洞利用方式
攻击者可构造如下格式的Payload触发XSS:
444-555-4455
当Google Voice插件处理包含此内容的页面时,会错误地将整个字符串(包括XSS部分)作为HTML插入到DOM中,导致JavaScript代码执行。
漏洞修复建议
- 避免使用innerHTML:改用更安全的DOM操作方法如
textContent或createElement - 严格过滤输入:对电话号码进行严格验证,确保只包含数字和合法符号
- 使用CSP策略:实施内容安全策略限制内联脚本执行
- 正确引用变量:确保只处理预期的电话号码部分,而非整个文本节点
防御措施
对于开发者:
- 避免直接使用
innerHTML插入用户可控内容 - 对动态内容进行严格的输入验证和输出编码
- 使用安全的DOM操作方法
对于用户:
- 保持浏览器插件更新
- 谨慎处理不明来源的邮件和网页内容
- 考虑使用内容安全策略扩展
漏洞价值
该漏洞获得了Google漏洞奖励计划$3,133.7的奖励,反映了其潜在危害程度和影响范围。
总结
本案例展示了浏览器插件如何引入额外的安全风险,即使是Google这样的技术巨头也可能在代码中犯下基本的XSS防护错误。开发者应特别注意DOM操作的安全性,特别是在处理用户可控内容时。