加密货币钱包、系统与基础设施审计经验分享

本文分享了在审计加密货币钱包、交易所和基础设施过程中发现的四类高危漏洞,包括CORS配置错误、编译器优化引发的断言失效、算术运算漏洞以及密码重置令牌通过Referer泄漏等问题。

在过去的三年中,Doyensec为全球知名加密货币项目提供安全测试服务。我们审计了桌面/移动钱包、交易所Web界面、托管系统和核心基础设施组件,发现许多设计实现缺陷。本文精选四类典型漏洞进行技术剖析。

1) CORS配置错误

跨域资源共享(CORS)机制放松了同源策略限制,错误配置可能导致敏感数据泄露。例如以下响应头:

1
2
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true

攻击者可构造特殊页面窃取用户密钥:

1
2
3
4
5
6
7
<iframe sandbox="allow-scripts" src="https://attacker.com/corsbug"/>
<script>
var req = new XMLHttpRequest();
req.open('GET', 'https://bitcoinbank/keys', true);
req.withCredentials = true;
req.send();
</script>

防御建议

  • 禁止使用null作为允许源
  • 避免动态反射Origin头值
  • 严格校验跨域请求源

2) 断言与编译器优化

某些语言的编译器优化会导致安全断言失效。例如Python的assert语句在生产环境(.pyo)会被完全移除:

1
2
# 生产环境将跳过此安全检查
assert all([x.deposit_address == address for x in deposits])

Swift中类似问题:

1
2
3
if (password != "mysecretpw") {
   assertionFailure("Password not correct!") // -O优化下会被移除
}

防御建议

  • 避免使用断言进行安全检查
  • 了解所用语言的编译器优化特性

3) 算术运算漏洞

金融系统需特别注意数值处理:

1
2
3
4
if data["wallet"].balance < data["amount"]:
    error_dict["wallet_balance"] = ("Withdrawal exceeds available balance")
    
data["wallet"].balance -= data["amount"] # 未校验负数导致可凭空造币

C/C++等语言还需注意整型溢出:

1
2
signed short int bank_account = -30000;
bank_account -= 2769; // 溢出后变为32767

防御建议

  • 强制校验交易金额为正数
  • 严格定义数值类型(signed/unsigned)

4) Referer头泄漏密码重置令牌

密码重置链接中的令牌可能通过Referer泄漏给第三方域名:

1
2
3
GET /libs/jquery.js HTTP/1.1
Host: 3rdparty.com
Referer: https://example.com/passwordreset/2a8c5d7e-5c2c-4ea6-9894-b18436ea5320

防御方案

  • 使用中间跳转页
  • 设置<meta name="referrer" content="no-referrer">
  • 配置Referrer-Policy响应头

如需安全咨询服务,请联系info@doyensec.com。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计