技术讨论 | 如何在Chrome中使用即时支付功能
字数 2046 2025-08-18 11:37:38
Chrome即时支付功能(JIT)安全漏洞分析与技术教学
1. 背景介绍
Chrome浏览器的支付处理API(PaymentHandler API)允许支付服务提供商处理支付请求。其中包含一个非标准功能"及时安装功能"(Just-In-Time Installation, JIT),该功能在实现过程中被发现存在多个安全漏洞。
2. 漏洞原理分析
2.1 初始漏洞发现
触发条件:
- 客户端使用服务器不支持的方法调用支付请求:
new PaymentRequest([{ supportedMethods: 'https://example.com/pay/' }], ...)
攻击流程:
- Chrome会从服务器支持的方法中获取特定URL
- 服务器响应需包含指向Payment Method Manifest的Header:
Link:<https://example.com/pay/payment-manifest.json>;rel="payment-method-manifest" - Chrome获取Payment Method Manifest文件
- Chrome获取Web App Manifest文件
- Chrome使用"src"和"scope"值注册Service Worker
漏洞利用:
- 支付按钮默认聚焦,可通过让用户按住回车键3秒触发JIT安装
- Service Worker脚本可指定任意"scope"参数值,导致源地址混淆
- 虽然无法拦截导航/支付请求,但可使用Console API记录用户数据
修复:
- Chrome 68禁用JIT安装功能
- 检测Web App Manifest、Service Worker脚本和Scope URL是否同源
2.2 第二个漏洞:无需脚本执行的Service Worker安装
攻击流程:
- 攻击者站点托管恶意脚本:
new PaymentRequest([{ supportedMethods: 'https://attacker.tld/' }], ...) - 服务器响应包含:
Link:<https://attacker.tld/payment-manifest.json>;rel="payment-method-manifest" - Chrome获取Payment Method Manifest
- Chrome从目标站点获取Web App Manifest(可任意Content-Type/Content-Disposition)
关键点:
- 无需在目标站点执行脚本即可安装Service Worker(持久型XSS)
- Service Worker脚本的Content-Type必须为JavaScript,但可使用Content-Disposition绕过
修复:
- 检测Payment Method Manifest和支付App是否在同一网站
2.3 第三个漏洞:开放重定向绕过
攻击流程:
- 攻击者网站调用:
new PaymentRequest([{ supportedMethods:'https://redirect.victim.tld/open-redirect?url=//attacker.tld/' }], ...) - Chrome获取不支持的方法并重定向至攻击者网站
- 服务器响应包含:
Link:<https://victim.tld/user-upload/payment-manifest.json>;rel="payment-method-manifest" - 攻击者只需向目标站点上传Payment Method Manifest文件
利用条件:
- 目标站点开启开放重定向功能
- 可绕过所有安全检测,无需在目标站点执行脚本
修复:
- 两天内修复,增加了额外的安全检查
3. 技术细节
3.1 Payment Method Manifest结构
示例Payment Method Manifest文件内容:
{
"default_applications": ["https://example.com/pay/app/web-app-manifest.json"],
"supported_origins": ["https://example.com"]
}
3.2 Web App Manifest结构
示例Web App Manifest文件内容:
{
"name": "Payment App",
"icons": [...],
"serviceworker": {
"src": "sw.js",
"scope": "/pay/"
}
}
3.3 Service Worker注册机制
- Chrome使用Web App Manifest中的"src"和"scope"值注册Service Worker
- "scope"参数可被恶意修改,导致源地址混淆
4. 漏洞影响
- UXSS类漏洞:类似于通用跨站脚本攻击,可窃取用户数据
- 持久型XSS:无需脚本执行即可安装恶意Service Worker
- 数据泄露:通过Console API记录用户敏感信息
- 支付安全:可能干扰正常支付流程或窃取支付信息
5. 防护措施
-
同源策略加强:
- 确保Web App Manifest、Service Worker脚本和Scope URL同源
- 验证Payment Method Manifest和支付App在同一网站
-
内容类型验证:
- 严格验证Service Worker脚本的Content-Type
- 限制Content-Disposition的使用
-
重定向防护:
- 禁止开放重定向功能
- 验证重定向目标的可信度
-
用户交互要求:
- 增加明确的用户确认步骤
- 取消支付按钮的默认聚焦
6. 研究价值
-
漏洞奖励:三个漏洞共获得约11,133.7美元奖励
-
时间线:
- Chrome 68:禁用JIT安装功能
- Chrome 69:完整修复后重新上线
-
安全启示:
- 新功能实现需全面考虑安全边界
- 跨域交互和Service Worker注册是安全关键点
- 即使复杂功能也可能存在简单绕过方式
7. 技术验证
PoC验证方法:
- 同网站Service Worker安装PoC(参见原文链接)
- 测试环境要求:
- Chrome 67或更早版本
- 可控的支付服务端点
- 文件上传能力(针对第二个漏洞)
8. 总结
Chrome的JIT支付功能实现过程中暴露了Web平台多个安全边界问题,特别是:
- Service Worker注册机制的可滥用性
- 跨域资源获取的安全检查不足
- 用户交互最小化带来的安全隐患
这些漏洞的发现和修复过程展示了现代Web安全研究的典型模式,也为支付相关Web API的安全设计提供了重要参考。