04月18日上午08:58开始,?一DeFi平台?被黑客利用重入漏洞实施了攻击。PeckShield安全团队迅速定位到问题,发现黑客利用了Uniswap和ERC777标准的兼容性问题缺陷实施了重入攻击。
糟糕的是,仅仅在24小时后,于04月19日上午08:45,又一知名DeFi平台?Lendf.Me也被黑客以类似的手段实施了攻击。
黑客攻击的原理是:攻击者利用以太坊ERC777标准的transferFrom()回调机制,在内部调用?_callTokensToSend()?回调函数时劫持交易,并在真正更新余额的_move()函数之前进行恶意攻击。
在Uniswap的攻击案例中,攻击者利用此漏洞消耗尽UniswapETH-imBTC池约1,278个ETH。而在Lendf.Me中,攻击者则利用它来任意增加内部imBTC抵押金额,并通过从其他可用的Lendf.Me交易中借入10多种资产。
DEX Algebra试图通过押注集中流动性与Uniswap竞争:4月21日消息,Uniswap在去年5月发布V3版本并转向集中流动性后已经收获了收益,日交易量增加了500%。类似地,另一家名为Algebra的DEX也通过集中流动性整合在DEX中占据了一席之地。
一方面,Uniswap基于以太坊之上,而Algebra选择了Polygon作为它的基础层。Algebra声称其动态定价、内置挖矿和跨链集成支持更高效。
Algebra联合创始人Alexandra Korneva在谈到与Uniswap相比,Algebra的主要优势时表示:“Uniswap没有平台上的挖矿,所以用户必须申请外部智能合约才能挖矿。为了改善这种情况,Algebra引入了内在的挖矿,允许用户将额外的代币放入池中并赚取奖励,而不需要通过外部平台来获取利润。”(Cointelegraph)[2022/4/21 14:39:26]
PeckShield安全团队认为这是自年初bZx遭攻击之后,又两起黑客利用DeFi系统性风控漏洞实施的攻击。一个不容忽视的问题是,DeFi?市场的风险可能不仅仅局限于平台本身,单个平台的模式创新很可能在与其他平台业务接轨时产生漏洞风险。
Uniswap v2和SushiSwap 7天平均交易费均高于比特币:推特用户Whale提供的数据显示,Uniswap v2 7天平均交易费约为591.3万美元,交易费排名第二,SushiSwap 7天平均交易费约为338.3万美元,交易费排名第三。而比特币7天平均交易费为335.5亿美元,交易费排名第四。[2021/5/21 22:28:41]
详细漏洞攻击细节,我们将在文章后面做详细介绍。
Figure1:ERC777transferFrom()
ERC777标准的业务组合兼容性问题
我们首先介绍下ERC777标准,ERC777出现的目的是对ERC20标准进行改进。其不但实现了功能扩展,还有ERC20标准一样良好的兼容性,愿景是成为ERC20?标准的有效继承者。
该标准扩展的功能之一是提供了“hook”机制,可以使普通地址或合约通过注册一个tokensToSend()hook函数来控制或拒绝发送Token。这原本是在ERC20?基础上加强了对Token的风险控制接口,是一次有益的改进。不过由于DeFi项目的可组合特性,一个合约在不同产品之间相互调用时,其业务逻辑复杂度也会大大增加,这就给注入代码攻击提供了可能性。
UNI突破15美元关口 日内涨幅为5.22%:火币全球站数据显示,UNI短线上涨,突破15美元关口,现报15.0159美元,日内涨幅达到5.22%,行情波动较大,请做好风险控制。[2021/1/29 14:18:12]
其中最关键的部分是,攻击者可以通过注册from的tokensToSend()?来实行回调。我们从下面的代码片段可以看到,ERC777标准中可以通过getInterfaceImplementer()获得攻击者的tokensToSend()接口,并在第1,056行调用此函数。而此处正是黑客劫持交易实施攻击的入口。
Figure2:ERC777-CompatibletokensToSend()Hijacking
如2019年4月OpenZeppelin发布的帖子以及2019年7月发布的漏洞利用演示中所述,攻击者可以自己定义函数tokensToSend(),并通过setInterfaceImplementer()来设置合约中的hook函数。
Maskbook发布新版产品,支持推特用户在Uniswap和CMC询价:Web3隐私产品 Maskbook官方宣布推出新版产品,支持Uniswap和CMC询价交易工具,用户将鼠标悬停在「$ + ticker」上时会自动弹出ETH和UNI价格信息,之后可以通过Uniswap直接交易且无需离开社交媒体Twitter。据悉,Maskbook后续还将在Facebook和Twitter等平台上进一步引入一整套去中心化金融应用。[2020/9/25]
Figure3:OpenZeppelin'sExploitDemo(HookSetup)
之后攻击者就可以像传统PC上的hook函数一样,在tokensToSend()?做任何事情。如下图所示,攻击者可以对同一笔交易进行多次交易。
现场 | POC共识大会暨POC Community圆桌辩论:POW、POS、POC共识战乱:金色财经现场报道,7月30日,首届POC共识大会暨POC Community成立仪式于深圳举办,圆桌辩论以《POW、POS、POC共识战乱》为主题,HPool CEO POC生态布道者Alex、币印联合创始人朱砝、Hello EOS创始人梓岑进行辩论,并分享了精彩观点,在争辩中HPool CEO POC生态布道者Alex提到,目前POW的缺点最大最明显的发生在矿业,普通人很难参与底层的共识建设,DPOS最大的问题就在于它本身更像一个叫传统的公司股份制的方式,用这种方式去发行货币其实跟国家发行货币没太大区别,关键是看项目、应用、信用等级适不适用。
币印联合创始人朱砝表示,花200亿人民币的矿机去攻击一个价值万亿的网络是不可能的,一是网络攻击的是一个交易,并不是整个网络生态价值,并且单笔交易金额不可能与比特币生态价值相当;二是很难买到矿机。
Hello EOS创始人梓岑谈到,在2014年、2015年Dpos刚刚诞生的时候,Dpos和POW的冲突是非常激烈的,曾经以为我们要挑战POW,经过多年认知的更新,要挑战的根本就不是POW,当然也更不会是POC,POW和POC做不了DPOS要做的事情,DPOS是为应用而生的,DPOS赛道是非常安全,DPOS要的是最低成本,运行最多的应用,服务最多的用户,可以用任何的货币体系,可以支持任何的货币,并不需要挑战POW或者POC已经构建好的货币体系。[2019/7/30]
Figure4:OpenZeppelin'sExploitDemo(HookFunction)
Uniswap?攻击分析
Uniswap被率先发现利用ERC777的兼容性问题实施了攻击。就如此恶意交易在Bloxy中的截图所示(hash:0x9cb1d93d6859883361e8c2f9941f13d6156a1e8daa0ebe801b5d0b5a612723c1),函数内部进行了一次tokenToEthSwapInput()?调用。
这意味着攻击者可以先通过操纵交易汇率,然后再用另一笔imBTC以较低价格兑换更多的ETH。
Figure5:UniswapHack
Lendf.Me?攻击分析
在Uniswap遭攻击约24小时后,又一DeFi平台Lendf.Me也遭到了黑客攻击。下面是其中一个攻击交易的截图。如图所示,
supply()函数中调用真实转账函数transferFrom()?时,被hook的攻击者合约里嵌入了盗用Lendf.Me的withdraw()的提币操作。
Figure6:Lendf.MeHack
在这个交易例子中,攻击者第一次supply()时确实向Lendf.Me存放了289.99999999个imBTC,而在第二个supply()中,攻击者只存放0.00000001个imBTC,但由于攻击者注册了tokensToSend(),所以在执行doTransferIn()->IMBTC::transferFrom()时,调用了攻击者函数tokensToSend(),攻击者函数通过调用Lendf.Me的withdraw()函数把290个imBTC直接全部提走。
需要注意的是,正常的业务逻辑应该是项目合约中的Balance会减去被攻击者提走的290个imBTC,然而当supply()?执行返回时,余额并未被重置,仍然为290imBTC。攻击者就是通过控制修改Lendf.Me中攻击者的imBTC抵押金额,有了足够大的imBTC抵押,攻击就可以从各种流动交易对中借出所有可用的10多种资产。
Figure7:Lendf.MeHackDetails
资产流向
攻击者0x538359共计从Lendf.Me获利25,236,849.44美元,其中各个Token分布如下:?
如上图,攻击者在获利之后,马上将各个Token转移至其关联账号0xa9bf70之中,之后攻击者数十次通过1inch.exchange,ParaSwap等平台将其中比较抢手的WETH,PAX,BUSD等Token换成ETH,DAI,BAT代币,另外将其中的TUSD,USDT代币存入Aave借贷平台。至此为止,攻击者及其关联账号的余额如上所示。
修复建议
PeckShield安全团队在此建议开发者,可以采用“Checks-Effects-Interactions”方法来防止这类重入攻击。举个例子,Lendf.Me的supply()里如果是先更新token余额,再调用?doTransferIn()。这将会让攻击在withdraw()?之后没有重置余额的可能性。
另一方面,ERC777标准特性会不可避免地启用hook机制,因此我们需要检测并防止所有交易功能产生可以重入的风险。例如,如果supply()?和withdraw()?同时运行时加个互斥锁,那么攻击者就无法在supply()??函数内部执行withdraw()?操作。
最后并不能被忽视的一点是,我们需要认真思考下DeFi业务组合可能存在的系统性风险问题,平台方不仅要确保在产品上线前有过硬的代码审计和漏洞排查,还要在不同产品做业务组合时考虑因各自不同业务逻辑而潜在的系统性风控问题。
可能一个新创新,在原平台一点问题都没有,但组合接入另一个产品后就可能存在业务逻辑缺陷,进而成为黑客攻击整个DeFi市场的入口。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。