挖洞经验 | 由Google Voice插件触发的DOM-XSS漏洞
字数 1355 2025-08-15 21:31:03

Google Voice插件DOM-XSS漏洞分析与教学文档

漏洞概述

本漏洞是一个存在于Google Voice浏览器插件中的DOM型跨站脚本(XSS)漏洞,允许攻击者在安装了该插件的用户环境中执行任意JavaScript代码。该漏洞获得了Google漏洞奖励计划$3,133.7的奖励。

漏洞发现过程

  1. 研究人员在Gmail收件箱中测试XSS Payload oneerror=alert(1)时意外触发了弹窗
  2. 初始误以为是Google Ads规则触发的存储型XSS
  3. 进一步分析发现需要同时满足两个条件:
    • 系统中安装了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
            // ...省略部分代码...
        }
    }
}

漏洞触发流程

  1. 使用document.evaluate方法遍历页面中的所有文本节点
  2. 通过正则表达式匹配美国电话号码格式
  3. 将匹配到的电话号码(f)插入到新创建的span元素(h)中
  4. 使用innerHTML将原始内容(w)中的电话号码替换为可点击的span元素(y)
  5. 通过innerHTMLinsertBefore将修改后的内容写回DOM

漏洞成因

  1. 不安全的HTML操作:直接使用innerHTML属性插入未经过滤的用户输入
  2. 错误的变量引用:开发者本意是处理电话号码(f),但实际上处理了包含XSS Payload的原始文本节点(a)
  3. 缺乏输入过滤:对文本节点内容没有进行适当的XSS过滤

漏洞利用方式

攻击者可构造如下格式的Payload触发XSS:

444-555-4455 

当Google Voice插件处理包含此内容的页面时,会错误地将整个字符串(包括XSS部分)作为HTML插入到DOM中,导致JavaScript代码执行。

漏洞修复建议

  1. 避免使用innerHTML:改用更安全的DOM操作方法如textContentcreateElement
  2. 严格过滤输入:对电话号码进行严格验证,确保只包含数字和合法符号
  3. 使用CSP策略:实施内容安全策略限制内联脚本执行
  4. 正确引用变量:确保只处理预期的电话号码部分,而非整个文本节点

防御措施

对于开发者:

  • 避免直接使用innerHTML插入用户可控内容
  • 对动态内容进行严格的输入验证和输出编码
  • 使用安全的DOM操作方法

对于用户:

  • 保持浏览器插件更新
  • 谨慎处理不明来源的邮件和网页内容
  • 考虑使用内容安全策略扩展

漏洞价值

该漏洞获得了Google漏洞奖励计划$3,133.7的奖励,反映了其潜在危害程度和影响范围。

总结

本案例展示了浏览器插件如何引入额外的安全风险,即使是Google这样的技术巨头也可能在代码中犯下基本的XSS防护错误。开发者应特别注意DOM操作的安全性,特别是在处理用户可控内容时。

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() 函数,该函数负责从页面内容中识别电话号码并创建可点击的呼叫链接。 关键漏洞代码 漏洞触发流程 使用 document.evaluate 方法遍历页面中的所有文本节点 通过正则表达式匹配美国电话号码格式 将匹配到的电话号码( f )插入到新创建的span元素( h )中 使用 innerHTML 将原始内容( w )中的电话号码替换为可点击的span元素( y ) 通过 innerHTML 或 insertBefore 将修改后的内容写回DOM 漏洞成因 不安全的HTML操作 :直接使用 innerHTML 属性插入未经过滤的用户输入 错误的变量引用 :开发者本意是处理电话号码( f ),但实际上处理了包含XSS Payload的原始文本节点( a ) 缺乏输入过滤 :对文本节点内容没有进行适当的XSS过滤 漏洞利用方式 攻击者可构造如下格式的Payload触发XSS: 当Google Voice插件处理包含此内容的页面时,会错误地将整个字符串(包括XSS部分)作为HTML插入到DOM中,导致JavaScript代码执行。 漏洞修复建议 避免使用innerHTML :改用更安全的DOM操作方法如 textContent 或 createElement 严格过滤输入 :对电话号码进行严格验证,确保只包含数字和合法符号 使用CSP策略 :实施内容安全策略限制内联脚本执行 正确引用变量 :确保只处理预期的电话号码部分,而非整个文本节点 防御措施 对于开发者: 避免直接使用 innerHTML 插入用户可控内容 对动态内容进行严格的输入验证和输出编码 使用安全的DOM操作方法 对于用户: 保持浏览器插件更新 谨慎处理不明来源的邮件和网页内容 考虑使用内容安全策略扩展 漏洞价值 该漏洞获得了Google漏洞奖励计划$3,133.7的奖励,反映了其潜在危害程度和影响范围。 总结 本案例展示了浏览器插件如何引入额外的安全风险,即使是Google这样的技术巨头也可能在代码中犯下基本的XSS防护错误。开发者应特别注意DOM操作的安全性,特别是在处理用户可控内容时。