事件介绍
6月28日晚,某安全机构发布了针对USDT的预警和漏洞分析,同时提醒各大交易所尽快暂停USDT的充值功能,并检查自己的代码是否存在逻辑缺陷。“假充值”是指用户向交易所充值USDT时不会丢失USDT,这些充值的usdt可以正常使用。
同时,今年6月11日,有用户发现门罗币存在虚假充值漏洞,在门罗币GitHub仓库上提交了相关问题。
引入漏洞
USDT
攻击者利用交易所判断充值USDT交易的逻辑缺陷,恶意进行虚假转账,从交易所获取代币。USDT本身没有问题。
我们以Omniexplorer提供的素材为例。
这个过程由一个无效的事务来说明。
地址:1 b5 c 80 f 487 D2 BF 8 b 69 e 1 bbba 2 b 1979 accb 1 aca7a 094 c 00 BC 9 b 9 ad 85 f 9 af 738 ea
(https://omni explorer . info/search/1b 5 c 80 f 487 D2 BF 8 b 69 E1 bbba 2 b 1979 aacb 1 ACA 7 a 094 c 00 BCB 9 Abd 85 f 9 af 738 ea)
这个无效的事务发生在Omniexplorer中。Omin的数字资产转移方法是简单发送。
他的会计模型是基于地址的。通过地址查询交易者的余额,并与交易发送的地址进行比较。如果余额少于发送的金额,交易将被标记为无效。
同时通过Omni客户端查看余额,但Omni没有UTXO机制,导致无效交易被广播。
使用场景
1.用户发起恶意USDT充值行为;
2.黑客绕过检查系统生成恶意交易并广播;
3.交易由比特币区块链(Omni core wallet基于比特币)确认;
4.交易所检查交易数量(绕过余额检查);
5.交易完成;
6.账户发起取款。
门罗硬币
首先,我们来看看官方发布的修复代码。
判断交易的公钥是否已经存在,如果已经存在,则拒绝交易。
在添加这段代码之前,门罗币客户端的show_transfers命令是不会跳过重复交易的,重复交易金额也会被计算。
也就是说,当攻击者的交易所充值地址发送多次重复交易时,如果交易所验证不严谨,没有检测到真实的钱包余额,仅通过show_transfers确认用户充值,就会出现虚假充值漏洞,导致交易所给用户的充值余额与交易所实际收款余额不符,攻击者可以在虚假充值成功后进行消费或提现。
使用场景
将利用代码插入门罗币的开源代码中,然后编译运行。
攻击者在门罗币cryptonote_tx_utils.cpp文件的第354行插入了大量重复代码。客户端每发起一次交易,就会向目标多发送三次重复交易,从而达到利用该漏洞的目的。
总结:
黑客只需要几行代码就能完成假转账。造成此漏洞的原因是exchange没有正确处理逻辑漏洞。开发者应该在代码上线前仔细检查。安全无小事。