入不敷出-Rari被黑事件分析
北京时间2021年5月8日晚 Rari 项目组发推文称「Rari Capital ETH池中存在与AlphaFinanceLab相关的漏洞」。因为这个漏洞,黑客窃取了2600ETH,近1500万美元。随后不久,Rari Capital官方发布了这一事件产生的主要原因,详见 https://medium.com/rari-capital/5-8-2021-rari-ethereum-pool-post-mortem-60aab6a6f8f9
SharkTeam第一时间进行了跟进和分析,并总结了安全防范手段,希望后续的区块链项目可以引以为戒,共筑区块链行业的安全防线
一、事件分析
Rari Capital官方发布的内容中,核心内容如上,具体如下:
“攻击者在 ibETH.work 函数内部反复执行以下步骤:
1.利用闪电贷从 dYdX 借出大量 ETH。
2.将 ETH 投资到 Rari Capital 的 ETH 资金池中。
3.将ibETH.totalETH()的返回值人为篡改,改为更大值。
4.因为ibETH.totalETH()的值被篡改,Rari Capital ETH资金池的余额也被篡改,导致攻击者可以从 Rari Capital ETH 资金池中提取比存入时更多的 ETH。
不幸的是,Rari Capital的开发者并未发现 ibETH.work 是一个外部调用,并且通过此函数操纵 ibETH.totalETH 的返回值,以及 ibETH.work 甚至还能调用其他任意合约。
项目之前已由Quantstamp进行审计,但是不幸的是,他们也没有发现这个问题。”
具体攻击分析如下,我们找到了攻击事件中的其中一笔交易的地址:
0x38b70ee51a859e3ff45a20e81b9e9f4d32f59f8820601fa0f47d3005bc325452并对这笔交易进行详细的分析,从交易中可以得知,黑客是先通过闪电贷从dYdX中借出一大笔资金(58,903ETH),然后反复调用deposit和withdraw两个函数来进行获利。
继续追踪,我们找到了这两个函数所在的合约地址:
0xce346ad7046222fd119f6b715b6f60c0fdbfe796(RariFundManager.sol),deposit和withdraw 的具体函数实现如下。
我们从deposit中进行分析,可以看到deposit函数中调用了_depositTo函数,而这个函数中又去调用了getFundBalance函数。
继续追踪getFundBalance函数,会发现去调用了RariFundController.sol合约的_getPoolBalance函数。
而这个函数又去调用了其它Controller合约的getBanlance函数
注:目前此合约已通过合约代理技术进行了更新并进行了问题修复,已移除AlphaPool
这次出问题的就是这个AlphaPoolController,我们去这个合约中查看getBalance函数。
可以看到,这里最终调用的是ibETH合约中的totalETH 和 totalSupply 来计算Rari合约的真正余额。
但由于totalETH的值也可以被此合约中另外一个函数work更新,且这个work函数是external payable的,攻击者可以通过work函数将totalETH的返回值篡改为一个虚假的高位数字,导致攻击者可以提取更多的ETH。
二、 Shark区块链安全知识课堂
此次事件是又一次与闪电贷攻击有关的区块链安全事件,DeFi项目的业务逻辑设计复杂,涉及的经济学计算和参数较多,却不同项目和协议之间可组合性极其丰富,很难预测,非常容易出现安全漏洞。如下表,利用闪电贷这种新型产品进行攻击的DeFi事件在过去的一年里层出不穷,已增加到14起。
此次Rari被黑,是典型的重入漏洞攻击,下面我们对“重入攻击”做一个系统分分析和防范建议。
以太坊允许一个合约采用外部调用的方式调用另外一个合约中的函数。如果合约在本该属于原子性事务的“修改storage变量并转账”的操作中,采用了先转账再修改storage变量的顺序,而转账的目标是一个带有恶意fallback函数的合约,该恶意fallback函数会调用转账的函数,因为合约是先转账后修改storage变量,因此恶意合约通过恶意的fallback函数对受害合约发起递归调用,从而破坏操作的原子性,绕过检查以重复获得转账收益。下面以ERCToken中的一个典型重入漏洞为例,其代码如下:
构造如下攻击合约:
攻击者调用攻击合约中的hack函数,即可发起攻击,攻击过程如下图所示:
攻击者调用Attack合约中的hack函数发起攻击,步骤如下:
(1)攻击者通过hack函数发起攻击,调用ERCToken合约中的withdraw函数进行转账;
(2)withdraw函数检查是否符合转账条件;
(3)符合条件,调用call函数与合约进行交互,执行转账功能;
(4)call函数执行后,调用Attack合约的回调函数fallback;
(5)通过fallback函数中调用withdraw函数,因为没有“生效”,即credit[msg.sender]一直没有变,所以每次调用withdraw函数进行检查时,都返回True,于是可以循环调用withdraw函数知道Gas耗尽,最终重复多次获取转账收益,甚至会盗取大笔资金,构成重入攻击。
重入漏洞一般发生在外部调用以及“先转账后修改storage变量”的情况下,因此转账的时候,为了避免重入,建议使用“检查-生效-交互”(Checks-Effects-Interactions)模式,先检查状态变量是否符合转账条件,然后修改状态变量,最后进行在通过外部调用进行转账,即完成交互。另外,也可以增加重入锁来限制函数的调用,或者,在编写智能合约时尽量避免外部合约的调用,这样也可以有效地降低发生重入的风险。
三、 安全建议
1.DeFi类似“乐高游戏”,是各种协议的自由组合,项目方在集成其他项目的协议前应充分了解协议内容和安全性。
2.防范利用闪电贷的攻击手段,禁止在同一区块中进行存款和提款(或最多一小时锁定时间),以降低潜在攻击。
3.设置更多安全机制。例如:可以设置损失阈值,资金池会在该阈值处暂停以免造成进一步的损失;也可以检查每股价值未跌至其最近的已知值以下,如有可设置一些必要措施。
4.当然,招募更多顶级审计公司,对项目进行审计。
四、 SharkTeam智能合约审计服务
智能合约安全关系用户的财产安全,至关重要!区块链项目开发者应与专业的安全审计公司合作,为用户的数字资产安全和项目本身安全提供保障。
SharkTeam作为领先的区块链安全服务团队,为开发者提供智能合约审计服务。智能合约审计服务由人工审计和自动化审计构成,满足不同客户需求,独家实现覆盖高级语言层、虚拟机层、区块链层、业务逻辑层四个方面111项审计内容,全面保障智能合约安全。
SharkTeam为客户提供高级别的区块链安全服务,区块链安全专家团队7*24小时为智能合约提供全生命周期的安全保障,服务包括:VIP安全审计服务、VIP合规审计服务、安全事故应急响应等。
SharkTeam也提供自动化审计工具,自动化审计以云服务的方式为用户提供服务。运用符号执行、形式化验证等智能合约分析技术,满足开发者智能合约日常审计需求。
来源:SharkTeam
==
和11万人同时接收最新行情资讯
搜“鸵鸟区块链”下载
和2万人一起加入鸵鸟社群
添加微信ID:Blockchain0018