在过去的三年中,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。