2021 年 5 月 8 日,据链闻消息,以太坊收益聚合协议 Rari Capital 因集成了 Alpha Finance 产生了漏洞,损失近 1500 万美元。事后,Rari Capital 官方发布了事故分析报告,分析了此次事故的主要原因。慢雾安全团队在官方分析的基础上,结合慢雾安全团队对此次事件的深入分析,进一步解读本次安全事故的原因。
本次攻击发生在 Rari Capital 的 RariManger 合约中,整个过程下来就是攻击者首先通过闪电贷从 dYdX 中借出巨量资金,然后不停的重复调用 RariManger 合约中的 deposit 和 withdraw 函数,完成获利。如下图:
LooksRare更新挂单奖励规则,提升合规用户获得奖励的价值:10月20日消息,NFT交易所LooksRare平台对挂单奖励规则进行更新:1.更新后,每个钱包地址只有5个NFT系列合集的挂单可以获得奖励;更新前,每个钱包地址有资格同时获得奖励的有15个NFT系列合集。
2.更新后,每个钱包地址的每个合集最多200个符合条件的挂单获得奖励,这将由挂单价格按升序确定;更新前,在1.4 倍以内的所有挂单都可以获得奖励。
以上规则从2022年10月20日上午9:00 (UTC) 开始的挂单奖励期开始生效。本次更新(连同上一次更新)旨在为合规用户增加挂单奖励的价值,同时更有效地为热门NFT系列创造有意义的流动性。[2022/10/20 16:32:28]
Rarible首席执行官:感觉苹果并不真正希望App Store用户能够购买或出售 NFT:金色财经报道,NFT创业市场 Rarible 首席执行官 Alexei Falin 针对苹果对通过iOS应用内进行的NFT交易收取高达30%的佣金表示:感觉苹果并不真正希望App Store用户能够购买或出售 NFT。这几乎是不可能的,因为它是固定订阅或固定价格。据报道,苹果公司推迟为 App Store 批准 NFT 和加密应用程序的方式或许支持了这一观点。根据 Falin 说法,Rarible 应用程序需要几个月的时间才能进入 App Store,而 Google Play Store 只需几天时间。
这确实意味着此类应用程序正在进入商店,但似乎它们通常只是充当服务的宣传展示。实际销售或交易将需要浏览器站点,而不是在应用程序中完成。
据悉,苹果并未专门针对解决 NFT 应用程序延迟的问题,而是表示其 500 名审查员会在 24 小时内检查 90% 的应用程序。苹果也拒绝就其他 NFT 批评发表评论,而是用 App Store 通用规则来解释。[2022/9/26 7:20:21]
那么用户是如何通过 deposit 和 withdraw 这两个操作获利的呢?我们需要分析对应的函数:
Rari Capital遭攻击事件更新:已发现Fuse Arbitrum上的一个漏洞:金色财经消息,Rari Capital推特发文称,发现了Fuse Arbitrum上的一个漏洞,已经暂停借贷功能,团队还将继续调查。据此前消息,Rari Capital在Fuse上的资金池遭到攻击,黑客获利近8000万美元。[2022/5/1 2:44:01]
以上是 deposit 函数的部分逻辑,首先 deposit 函数本身会调用内部的 _depositTo 函数,然后会再次调用 getFundBalance 函数来获取合约的余额。getFundBalance 函数最终是会调用到 Rari Controller 合约的 getBalance 函数去获取余额。最后是通过 Rari Controller 合约中的 AlphaPoolController 库的 getBalance 函数获取余额。如下图:
LooksRare过去24小时交易额超7亿美元,是OpenSea五倍:1月20日,据DappRadar数据显示,过去24小时内,新兴的NFT交易平台LooksRare交易额达7.0亿美元,而排名第二的OpenSea为1.4亿美元。LooksRare 24小时交易额是OpenSea五倍。
此前报道,1月10日,NFT市场LooksRare宣布正式上线并向用户发放LOOKS代币空投,2021年6月16日至2021年12月16日期间,在OpenSea交易额超3枚(含)ETH用户挂单一枚NFT即可领取。[2022/1/20 9:00:24]
流程上略微复杂,用图来展示大概就是下面这样:
Rari Capital发起购买RGT存储在金库并部署到Rari Stable Pool的提案投票:DeFi智能投顾Rari Capital发推称,Rari金库目前拥有超过5.3万美元,很快它就会变成智能金库(Smart Treasury)。RIP-6提案从Uniswap慢慢购买价值2万美元的RGT,将RGT积累并储存在Treasury中。剩余的资金应该投入到Rari Stable Pool中,以赚取收益。一旦RIP-5生效,智能金库将负责维护。这项提议的前提是保留RGT,并为即将进行的审计节省必要的资金。目前针对该提案的投票已经开启。[2021/1/3 16:19:19]
从上面的分析不难发现,Rari 合约最终是用到了 Alpha Finance 项目的 ibETH 合约的 totalETH 函数获取合约的余额,目的是为了根据 totalETH 和 totalSupply 的比值计算出 Rari 合约真正的 ETH 余额。deposit 函数是根据用户的充值 ETH 的数量和比值计算要发放给用户的 REPT 数量,而 withdraw 函数的公式也大同小异,同样需要通过 getBalance 函数获取合约的 ETH 余额并计算比值,然后根据用户的 REPT 代币的余额和比值计算需要返还给用户的 ETH 的数量。但是问题恰恰出在这个获取 ETH 余额的公式上。
根据官方描述,从 ibETH 合约获取的 totalETH 函数获取的值是可以被用户操控的。以下是官方原文:
根据官方的描述,用户可通过 ibETH 合约的 work 函数操控 totalETH 函数返回的值,导致 Rari 整个价值计算公式崩溃。我们分别分析 ibETH 的 work 函数和 totalETH 函数:
totalETH 函数:
work 函数:
以上分别是 ibETH 合约中的 totalETH 函数和 work 函数的部分实现。不难发现 totalETH 函数其实就是获取合约的总的 ETH 的数量。而 work 函数,本身是一个 payable 函数,也就是说,用户是可以通过 work 函数来控制 ibETH 合约中的 ETH 数量从而来改变 totalETH 返回的值的。更糟糕的是,work 函数同时还支持调用其他的任意合约。那么整个思路就很清晰了。
1、从 dYdX 中进行闪电贷,借出大量的 ETH;
2、使用一部分的 ETH 充值到 Rari Capital 合约中,此时从 ibETH 获取的比值还是正常的;
3、使用剩余的 ETH 充值到 ibETH 合约中,调用 ibETH 合约的 work 函数,为后续推高 ibETH 合约的 totalETH 的返回值做准备;
4、在 work 函数中同时对 Rari Capital 合约发起提现,由于上一步已经推高 totalETH 值,但是计算的 totalETH()/totalSupply() 的值相对于充值时被拉高,从而使攻击者能从 Rari Capital 中使用等量的 REPT 获取到更多的 ETH。
本次分析下来,主要的原因是协议的不兼容问题,攻击者通过闪电贷和重入的方式,攻击了 Rari Capital,造成了巨大的损失。慢雾安全团队建议在 DeFi 逐渐趋于复杂的情况下,各 DeFi 项目在进行协议间交互时,需要做好协议之间的兼容性,避免因协议兼容问题导致的损失。
【参考链接】
Rari Capital 官方分析:
https://medium.com/rari-capital/5-8-2021-rari-ethereum-pool-post-mortem-60aab6a6f8f9
攻击交易(其中一笔):
https://etherscan.io/tx/0x171072422efb5cd461546bfe986017d9b5aa427ff1c07ebe8acc064b13a7b7be
By:yudan@慢雾安全团队
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。