1月28日,QBridge遭到攻击,约8000万美元的资产被盗。经过分析,我们发现代码的根本原因是safeTransfer(和safeTransferFrom)函数的实现。
根本原因
首先,该项目没有使用流行的OpenZeppelin SafeERC20库进行代币转移。取而代之的是,他们实现了一个名为SafeToken的库。
其次,该实现没有检查目标是否为有效合约(或者是否为零地址)。
第三,**EVM的低级调用在目标合约为零时不会返回false。**这与开发者的常识相悖。

当然,此次事件还有其他原因,例如,零地址被加入白名单。然而,如果代码能够正确处理这种情况,那么它就不会存在漏洞。
顺便说一句:其他项目也使用了类似的.代码,它们可能也容易受到类似问题的影响。
实验
为了确认VM在目标合约为零时不返回false的第三个原因,我们开发了一个测试合约,如下所示。

TestSafeTransfer.test()的执行不会回滚。

教训和如何规避风险
我们建议:
- 使用流行的库,而不是自己重新发明轮子,除非有非常非常充分的理由。
- 在资产转移前后检查余额,以确保转移资产的数量符合预期。这也可以避免通缩和通胀代币的问题。
关于BlockSec
BlockSec是一家开创性的区块链安全公司,由一群全球杰出的安全专家于2021年创立。公司致力于提升新兴Web3世界的安全性和可用性,以促进其大规模采用。为此,BlockSec提供智能合约和EVM链安全审计服务,Phalcon平台用于安全开发和主动阻止威胁,MetaSleuth平台用于资金追踪和调查,以及MetaDock扩展,帮助Web3开发者高效地在加密世界中冲浪。
迄今为止,公司已为MetaMask、Uniswap Foundation、Compound、Forta和PancakeSwap等300多家知名客户提供服务,并在两轮融资中从Matrix Partners、Vitalbridge Capital和Fenbushi Capital等知名投资者那里获得了数千万美元的投资。
官方Twitter账号:https://twitter.com/BlockSecTeam



