北京时间2022年8月2日,CertiK安全团队监测到NomadBridge遭受攻击,导致了价值约1.9亿美元的损失。
合约的问题在于在initialize()函数被调用的时候,“committedRoot”被设成了0x00地址。因此,攻击者可以通过消息的验证,将在桥合约中的代币转移。
攻击步骤
①攻击者调用process()函数开始攻击。
②process()函数中调用了acceptableRoot(messages),这个函数检查了被提交的root以及OptimisticTimeOut是否过期。
Yearn社区关于Wintermute YFI贷款与CRV计划提案已开启投票,8月31日结束:8月26日消息,Yearn 社区关于Wintermute YFI 贷款与 CRV 计划提案已开启投票,北京时间 8 月 31 日 02:14 结束。在该提案中,Wintermute 请求 Yearn 社区批准向 Wintermute Trading 提供 YFI 贷款,并授权从 DAO 财库向 Wintermute Trading 转移 350 枚 YFI(约 198 万美元),贷款期限为 12 个月,利率为 0.1%,并在贷款结束时以实物形式支付。同时,Wintermute 计划使用最多 300 万枚 CRV(约 140 万美元)购买 yCRV,并将其部署到 yCRV-CRV Curve 池中。[2023/8/26 12:58:11]
与AI-X代币关联的EOA地址将200枚ETH转至Tornado Cash:8月20日消息,CertiK在社交平台上表示,与Arbitrum链上AI-X代币关联的EOA地址0x918将200枚ETH转至Tornado Cash。[2023/8/20 18:11:45]
③此时函数acceptableRoot(messages)返回了true,也就是说这条message就被批准了。这是因为0x0000在初始化过程中被设置为了true。
NFT项目rektguy创始人抛售包括BAYC在内大量NFT,利用NFT流动性获利:金色财经报道,NFT项目rektguy创始人发推表示,“经过深思熟虑,今天我们决定利用当前利用当前的NFT流动性在BAYC、MAYC上获利,我们仍拥有大量Yuga资产,以及继续看好其建设的东西”。
此外,据opensea数据显示,其地址(0xC8...36e8)在过去半小时内在Blur以约78 ETH的均价抛售71个BAYC,以16.3 ETH的均价抛售11个MAYC,以15.14 ETH的均价抛售7个Azuki,以及还包括几十个Otherside和Beanz。目前该钱包地址仍持有9个MAYC。[2023/2/22 12:21:39]
④当这条message被批准后,攻击者即可从桥中转移资金。
攻击交易
Mirror:宕机问题已修复:11月28日消息,去中心化内容发布平台 Mirror 官方宣布,其服务已恢复正常。
此前报道,Mirror 今日下午出现宕机问题,无法访问文章。[2022/11/28 21:07:58]
攻击示例:
○在MoonbeamBridge上转移了0.01WBTC:https://moonscan.io/tx/0xcca9299c739a1b538150af007a34aba516b6dade1965e80198be021e3166fe4c
○在EtheremBridge接受了100WBTC代币转移:https://etherscan.io/tx/0xa5fe9d044e4f3e5aa5bc4c0709333cd2190cba0f4e7f16bcf73f49f83e4a5460
漏洞分析
在Replica合约中,“committedRoot”被错误地初始化为0。
合约地址:https://etherscan.io/address/0x88a69b4e698a4b090df6cf5bd7b2d47325ad30a3
函数process通过调用函数acceptableRoot()确保messagehash能通过验证。
函数acceptableRoot()会检查root是否已经被proven,processed或者confirmed。
然而在初始化的交易中0x53fd92771d2084a9bf39a6477015ef53b7f116c79d98a21be723d06d79024cad,owner传入了0x00并且它对应的`confirmAt`也会在初始化中被设为1。
因此0x00可以被当作一个`acceptableRoot`,这也可以在replica合约中查询到https://etherscan.io/address/0xb92336759618f55bd0f8313bd843604592e27bd8。
Prove函数的实现导致了一条unprovenmessage的root是0,而0作为一个有效的confirmedroot可以通过require的检查。攻击者只需调用process函数就能从桥中转移资金。
资金去向
大约价值1.9亿美元的代币从桥合约中转移出去。
https://defillama.com/protocol/nomad?denomination=USD
写在最后
由于该问题是由部署参数中的错误引起的,我们假设所有的部署和配置都是正确的,那么在传统的审计中确实很难发现该问题。然而,在包含验证部署过程等更广泛的审计过程中,是可以有效指出该问题的。
CertiK可提供部署阶段后的附加服务——合约验证,其中包括对智能合约的分析和部署后合约验证的深入分析。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。