Furucombo此次事故并不在安全漏洞的范畴内,主要的原因在于官方将未启用的AaveV2Proxy合约添加进了自己的白名单中,并且未对AaveV2Proxy合约进行初始化,导致攻击者有机可乘。与Furucombo交互过的用户应及时撤销相关授权,避免进一步损失。
据链闻消息,著名DeFi项目Furucombo被黑,损失约1500万美元。慢雾安全团队第一时间介入分析,并将攻击细节分享给大家。
攻击细节分析
本次发生问题的合约在Furucombo本身的代理合约当中。整个攻击流程很简单。攻击者通过设置了Furucombo的AaveV2Proxy的逻辑地址导致后续通过Furucombo代理合约调用的逻辑全部转发到攻击者自己的恶意合约上,导致任意资金被盗。
以太坊开发平台Infura与NEAR达成合作,将扩展标记为多链连接器:5月24日消息,ConsenSys宣布,其区块链开发平台Infura与NEAR协议建立合作伙伴关系,该集成已经进行了两个月的内测,现已广泛使用。这标志着Infura的扩展超出了与以太坊虚拟机 (EVM) 兼容的链,向成为多链生态系统中的连接器转变,同时改善了整体开发人员体验。[2022/5/24 3:38:50]
但是如果事情那么简单,那么本次分析不值一提。问题远比想象的复杂得多。
如上图所示攻击者的入口在Furucombo的batchExec函数,我们先对batchExec函数进行分析:
拳击冠军Tyson Fury主题系列NFT在HoDooi公开发售:据官方消息,NFT发行交易平台HoDooi与世界重量级拳击冠军Tyson Fury合作,在7月12日推出NFT系列藏品。
该NFT藏品以拍卖和抢购两种方式进行。竞拍成功者可获得1/1NFT;5*5英尺Tyson Fury签名的实物绘画;Tyson Fury签名的拳击手套;Tyson Fury 提供的视频。销售的系列主题NFT,按照稀有度分为钻石、白金、黄金、白银和青铜五个等级。[2021/7/9 0:39:57]
以上是FurucomboProxy合约的batchExec函数的具体实现,其中_preProcess和_postProcess合约分别是对调用前后做一些数据上的处理,不涉及具体的调用逻辑,这边可以先忽略。我们主要观察核心的_execs函数:
Infura发布以太坊API服务中断事件的报告:金色财经报道,11月12日,以太坊和IPFS的API服务供应商Infura已完成对此次服务中断事件的剖析并发布报告。报告指出,Ethereum Mainnet API服务暂时中断事件的根本原因是,某些内部系统的影响Geth(v.1.9.9)和(v1.9.13)版本的共识错误导致一些子系统的区块同步中断。为预防此类事件再次发生,Infura提出三个主要操作:1.共识错误可能会在新版本中修复,Infura将调整流程以更接近最新的客户端版本,同时仍然平衡维护稳定性和保持向后兼容的责任;2.将增加对OpenEthereum等其他客户端的使用,并将Besu客户端重新引入其基础构架中,以增加客户端的多样性。还将继续跟踪、测试和评估其他客户端;3.回顾事件响应程序,并确定是否可以进行任何改进以缩短恢复时间。此前报道,Infura已于昨晚宣布所有服务子系统已恢复并正常运行。[2020/11/12 12:23:13]
声音 | 以太坊开发人员:以太坊网络无法依靠Infura每天处理100亿个请求:据CCN消息,Parity Technologies的以太坊开发人员Afri Schoedon表示,以太坊网络无法依靠Infura每天处理100亿个请求。Infura是ConsenSys和NYC Ethereum创始人Michael Wuehler创建的一种基础设施,允许dApps在没有运行完整节点的情况下处理以太坊网络上的信息。[2018/10/29]
通过对execs代码的分析不难发现,函数的主要逻辑是对configs数组的数据做检查,并根据configs数组的数据对data进行一些处理。但是回顾上文中攻击者的调用数据,不难发现攻击者的调用数据中,configs的数据是一个0地址:
Bitfury帮团队成员在比特币区块链上完成婚姻登记:2018年6月18日,Bitfury集团在阿姆斯特丹宣布团队成员亚历克斯·舍甫琴科在比特币区块链上完成了婚姻登记。为了纪念他的婚礼,Bitfury将在本月通过比特币区块链认证另外20对夫妇的婚姻。
通过使用比特币区块链来确保他们的婚姻登记,亚历克斯和他的妻子Daria可以确保他们结婚证存储在一个不可变的数据库中,这个数据库可以从世界任何地方访问。
BitFury Group 2011年创立于俄罗斯,在旧金山和阿姆斯特丹设有管理部门,在冰岛和格鲁吉亚共和国设有数据中心。BitFury早期是一个ASIC比特币矿机芯片研发团队,现在转型做区块链基础数据服务和交易处理服务。[2018/6/19]
这里有一个trick,由于0地址是一个EOA地址,所有对EOA地址的函数调用都会成功,但是不会返回任何结果。结合这个trick,execs函数中的关于configs数据的部分可以先暂时忽略。直接看到最后的核心_exec函数:
_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合约。如有授权,应及时撤销相关授权,避免进一步损失。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。