著名DeFi项目Furucombo被黑,损失超1500万美元。慢雾安全团队第一时间介入分析,并将攻击细节分享给大家。
攻击细节分析
本次发生问题的合约在Furucombo本身的代理合约当中。整个攻击流程很简单。攻击者通过设置了Furucombo的AaveV2Proxy的逻辑地址导致后续通过Furucombo代理合约调用的逻辑全部转发到攻击者自己的恶意合约上,导致任意资金被盗。
但是如果事情那么简单,那么本次分析不值一提。问题远比想象的复杂得多。
如上图所示攻击者的入口在Furucombo的batchExec函数,我们先对batchExec函数进行分析:
随着RLB的价格上涨,2个钱包的收入超过200万美元:金色财经报道,据Lookonchain监测数据显示,随着RLB的价格今天上涨62%,2个钱包的收入超过200万美元。0xb3A1从6月28日到7月5日花了77万枚USDC购买了2550万个RLB(427万美元),赚取了350万美元(+456%)。7月5日至7月27日,0xcbE1花费139万枚USDC购买2137万枚RLB(358万美元),赚取219万美元(+158%)。[2023/8/9 21:33:48]
以上是FurucomboProxy合约的batchExec函数的具体实现,其中_preProcess和_postProcess合约分别是对调用前后做一些数据上的处理,不涉及具体的调用逻辑,这边可以先忽略。我们主要观察核心的_execs函数:
韩国检方扣押并搜查与WeMade相关的数字资产管理公司Hyperithm:7月1日消息,昨日,韩国检方在全面调查WEMIX发行商、该国上市游戏公司WeMade的同时,也扣押并搜查该国数字资产管理公司Hyperithm,因该公司是WEMIX代币的做市商。
此前报道,韩国检方对WeMade及其WEMIX代币的做市商进行扣押和搜查。[2023/7/1 22:12:26]
通过对execs代码的分析不难发现,函数的主要逻辑是对configs数组的数据做检查,并根据configs数组的数据对data进行一些处理。但是回顾上文中攻击者的调用数据,不难发现攻击者的调用数据中,configs的数据是一个0地址:
报告:未来18个月内质押ETH的比率可能会翻一番:金色财经报道,根据Kraken子公司Staked的一份新报告,在未来18个月内,质押ETH的比率可能会翻一番。截至5月2日的一周内,ETH存款总额是Shapella升级前一周增加金额的四倍。Staked是一家非托管质押服务提供商,也是加密货币交易所Kraken的子公司。Staked表示,“基于质押需求的增加,我们预计ETH质押率将从今天的15%左右增加到未来12-18个月的20-35%范围,目前平均每日存款是4月份的6.5倍”。该公司表示,在Shapella升级后的六天内,已抵押750,000ETH。这比3月份整个月质押的600,000ETH还多。Staked在报告中表示,以太坊目前每年产生约18亿美元的质押奖励。[2023/5/12 14:58:18]
这里有一个trick,由于?0地址是一个EOA地址,所有对EOA地址的函数调用都会成功,但是不会返回任何结果。结合这个trick,execs函数中的关于configs数据的部分可以先暂时忽略。直接看到最后的核心_exec函数:
美国参议员称希望在未来几周内推出稳定币监管法案:11月17日消息,美国参议员Sen.KirstenGillibrand表示,希望在未来几周内推出Stablecoin监管法案,该法案由其与参议员Patrick Toomey和Cynthia Lummis共同推出。Sen.Kirsten称,会要求至少在Senate Banking Committee举行听证会,并可能会在国会进行投票。
Tether的USDT和Circle的USDC等Stablecoin通常与美元等稳定资产挂钩,它们在加密货币行业中占据核心地位。美国立法者普遍认为,该部门可能是他们可以初步处理的部门,同时仍在致力于更广泛的行业监督。(Coindesk)[2022/11/17 13:15:39]
_exec函数的逻辑也很简单,在校验了_to地址后,直接就将data转发到指定的_to地址上了。而通过对攻击交易的分析,我们能发现这个_to地址确实是官方指定的合法地址。
最后一步,便是调用_to地址,也就是官方指定的AaveV2Proxy合约的initialize函数,将攻击者自己的恶意地址设置成AaveV2Proxy合约的逻辑地址。通过对Furucombo合约的分析,可以发现整个调用流程上没有出现严重的安全点,对调用的地址也进行了白名单的检查。那么问题只能是出在了对应要调用的代理逻辑上,也就是AaveV2Proxy合约。
我们直接分析AaveV2Proxy合约的initialize函数的逻辑:
可以看到initialize函数是一个public函数,并在开头就检查了_implementation是否是0地址,如果是0地址,则抛出错误。这个检查的目的其实就是检查了_implementation是否被设置了,如果被设置了,就无法再次设置。根据这个设置,不难想出initialize这个函数只能调用一次。除非AaveV2Proxy从来没有设置过_implementation,否则这个调用是不会成功的。难道Furucombo真的没有设置过对应的_implementation吗?带着这样的疑问,我们检查了交易内的状态变化。如下:
可以看到,交易中改变了存储位置为0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc的内容,而写入的内容正是攻击者自己的恶意合约地址?0x86765dde9304bea32f65330d266155c4fa0c4f04。
而?0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc这个位置,正是_implementation数据的存储地址。
也就是说,官方从来没有设置过?AaveV2Proxy合约的_implementation地址,导致攻击者钻了这个空子,造成了Furucombo资产损失。
总结
通过对整个事件的分析来看,Furucombo此次事故并不在安全漏洞的范畴内,主要的原因在于官方将未启用的?AaveV2Proxy合约添加进了自己的白名单中,并且未对AaveV2Proxy合约进行初始化,导致攻击者有机可乘。
建议
目前,由于Furucombo遭受攻击,导致任何将代币授权过给Furucombo合约(0x17e8ca1b4798b97602895f63206afcd1fc90ca5f)的用户都将面临资金损失的风险。
慢雾安全团队建议与Furucombo交互过的用户检查是否有将相关代币授权给Furucombo合约。如有授权,应及时撤销相关授权,避免进一步损失。
来源:金色财经
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。