免责声明:金色财经所有资讯仅代表作者个人观点,不构成任何投资理财建议。 举报

    如何“安全”发送资产?从QBridge被攻击事情说起

    2022 年 01 月 28 日, QBridge 遭受攻击,损失约 8000 万美金。网上有慢雾的分析报告。在这个推文中,我们尝试从代码出发,分析问题出现的最本质原因。

    原因

    我们的分析发现,这一问题主要由于以下原因所造成。

    1. 项目方没有使用常用的OpenZeppelin的库来处理资产的安全转移,而是使用了自己实现的一个库(SafeToken.sol)

    2. 在自己实现的库中,对于safeTransfer函数的实现相比OZ缺少了是否为合约的判断(当然判断是否为0也可以)

    3. EVM在一个low level的函数调用中,如果target为0,返回值是 true。也就是返回值为true并不一定说明函数调用成功,也有可能说明目标合约根本不存在。

    当然,具体是攻击的时候,还需要结合合约本身的逻辑来进行。

    在以上原因汇总,第三个原因是比较出乎意料的,也就是对一个0地址合约的函数调用返回值是true,而不是false。有问题的代码如下图:

    btw: 网上还有其他合约使用了safeToken的实现,可能存在类似问题。

    实验

    为了验证这个想法,我们写了一个测试合约:

    执行TestSafeTransfer.test()函数是完全不会revert的。

    如何应对

    对于合约中涉及资产转移功能的代码,我们建议

    • 使用成熟的库,而不用自己重新设计

    • 可以在资产转移前和后分别检查balance,从而知道资产转移的真正数量。这个建议对于一些通缩和通胀的资产同样有效。


    jinse.com
    好文章,需要你的鼓励
    jinse.com
    好文章,需要你的鼓励
    发表评论
    0/140
    发布评论
    评论
    文章作者: / 责任编辑: 我要纠错

    声明:本文由入驻金色财经的作者撰写,观点仅代表作者本人,绝不代表金色财经赞同其观点或证实其描述。

    提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。

    金色财经 > 区块链 > 如何“安全”发送资产?从QBridge被攻击事情说起
    • 项目申请入驻
    • 寻求报道
    • 金色财经APP
      iOS & Android
    • 加入社群
      Telegram
    • 意见反馈
    • 返回顶部
    • 返回底部