CertiK:ZEED被盗百万美元资产事件分析

CertiK
企业专栏
热度: 25665

北京时间2022年4月21日下午3时15分,CertiK审计团队监测到ZEED项目被攻击,造成了104万美金(折合人民币约673万)的财产损失。被盗取资金被转移至一合约中,而该合约具有自我销毁功能,因此该操作无法逆转。

分析

北京时间2022年4月21日下午3时15分,CertiK审计团队监测到ZEED项目被攻击,造成了104万美金(折合人民币约673万)的财产损失。被盗取资金被转移至一合约中,而该合约具有自我销毁功能,因此该操作无法逆转,资金无法被追回。


攻击步骤

①攻击者合约从HO-SWAP LP收到662枚YEED代币(ZEED项目的官方代币)。

②这662枚YEED代币被发送到BSC-USD-YEED。由于收费机制的存在,一些收费代币也将被发送到3个LP对,分别是:BSC-HO-YEED 2;BSC-USD-YEED 2,BSC-ZEED-YEED 2。

③由于费用计算出错,一些YEED代币也将被错误地创建/发送到LP。

④从这一刻起,每个LP就处于不平衡状态。在每个LP合约中,都有着与其他代币相较过多的YEED代币。

⑤然后,攻击者将在每个LP上不断循环调用skim(to:LP)函数。该函数是为了重新调整LP内的两种代币的数量,将多余的代币发送到to参数。由于攻击者配置的目的地是LP本身,不平衡将不断增加,更多的奖励代币将被创建。

每一次的转移都会:

  • 从一种LP发送YEED代币到另外一种LP。
  • 向LP发送因错误产生的YEED代币奖励

通过以上方式,攻击者保持了LP内代币的不平衡,并且每次都会增加LP内YEED代币的数量。

比如,我们可以看到在BSC-ZEED-YEED 2 LP中,最初的YEED的数量是96个。

分析

而当攻击者调用skim(to:attacker_contract)以后,LP中的YEED余额为368,560。

最后一次调用,则将368,560枚代币发送给了攻击者。

分析

攻击者对3个不同的货币对进行处理,总数为87,479,473枚YEED代币:

  • 83,127,354 YEED来自BSC-USD-YEED LP对。
  • 3,983,869 YEED来自BSC-HO-YEED LP对。
  • 368,560 YEED来自BSC-ZEED-YEED LP对。

⑥然后,攻击者进行多次互换,将其收益转换为BSC-USD。



漏洞分析

攻击者通过向LP对发送代币,破坏了YEED项目内LP代币的平衡。因此,任何人都可以调用skim()函数,从而把多余的代币发送给用户。

如果正确计算金额,则一切正常。然而,在最重要的发送奖励步骤中,发送给每个接收者的奖励是rewardFee。这意味着在此条件下,并不是奖励获得者理应获取了奖励费用x 1,而是在N次转移过程中获得了奖励费用x N次。


分析

比如,用户A向用户B发送了100个YEED,如果rewardFee是10。

  • 用户B收到90奖励
  • LP BSC-USD-YEED 2收到10奖励
  • LP BSC-ZEED-YEED 2收到10奖励
  • LP BSC-HO-YEED 2收到10奖励

这样以来,就有20枚代币被错误地凭空创建了。

而真正的YEED奖励机制应该运营如下:

  • 50%的奖励费用发送到_balances[swapPair] (LP BSC-USD-YEED 2)
  • 25%的奖励费用发送到_balances[swapPairZeed](LP BSC-ZEED-YEED 2)。
  • 25%的奖励费用发送到_balances[swapPairHo] (LP BSC-HO-YEED 2)。



写在最后

此次事件造成了104万美金(折合人民币约673万)的损失。由于资金在合约中,而合约具有自我销毁功能,所以该操作无法复原,即任何人都无法再取出这笔财产,包括攻击者本身。通过审计,我们可以了解到发送到LP的代币将破坏LP的平衡,并且审计也能发现奖励计算机制的错误。

声明:本文为入驻“MarsBit 专栏”作者作品,不代表MarsBit官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况,及遵守所在国家和地区的相关法律法规。