零时科技|PickleFinance合约被盗复盘分析

转载
1492 天前
7662
零时科技

事件概述

北京时间2020年11月22日凌晨2点33分左右,零时科技区块链安全情报系统检测到DeFi项目Pickle Finance存在异常情况,疑似被攻击,零时科技安全团队通过Pickle Finance官网得知此项目确实存在异常,如下图,cDAI策略池一度被转移清空。

 

随后收到消息称,此项目受到黑客攻击,损失近2000万美金,被盗资金被转移到该地址 :0x70178102AA04C5f0E54315aA958601eC9B7a4E08

交易哈希:https://etherscan.io/tx/0xe72d4e7ba9b5af0cf2a8cfb1e30fd9f388df0ab3da79790be842bfbed11087b0

 

通过对事件的跟踪分析得知,此次攻击事件是由于Pickle Finance项目新上线的ControllerV4合约中的swapExactJarForJar函数方法设计缺陷引起,零时科技给出的分析如下。

漏洞分析

调用过程,如下图:

https://ethtx.info/mainnet/0xe72d4e7ba9b5af0cf2a8cfb1e30fd9f388df0ab3da79790be842bfbed11087b0

 

漏洞攻击分析:

通过追踪分析,得到最终发生漏洞的合约地址为:

https://etherscan.io/address/0x6847259b2b3a4c17e7c43c54409810af48ba5210#code

分析该地址的合约文件,定位存在漏洞的合约文件为: controller-v4.sol

跟进ControllerV4合约,发现swapExactJarForJar函数存在漏洞问题,如下图,这里传入的六个参数中,其中四个参数可控:address _fromJar(从哪里获取jar), address _toJar(将jar发送到哪里去),uint256 _fromJarAmount(要兑换的jar数量),uint256 _toJarMinAmount(至少想要兑换的数量)

 

攻击者进行攻击时,对前三个可控参数进行定量赋值。可将传入的fromJar,toJar两个参数赋值为自己的合约地址,将_fromJarAmount参数的数值设置为一个较大值(目前攻击者兑换并取出约1976万DAI)。

继续分析,265行和266行代码会将fromJar,toJar传入的token分别赋值给fromJarToken,toJarToken。接下来fromJar合约利用safeTransferFrom函数给ControllerV4合约转入fromJarAmount数量的pToken。

 

继续分析下图代码,fromJarAmount经过运算后的值会赋值给fromJarUnderlyingAmount变量;fromJarToken数值会赋值给fromJarAvailUnderlying变量;之后判断fromJarAvailUnderlying是否小于fromJarUnderlyingAmount变量,如果小于,就给_fromJarAvailUnderlying变量加上缺少的部分,最总使得两个变量值相等。

 

继续分析代码逻辑,下图中,通过withdraw函数对假的token进行转移

 

将已经兑换的的所有DAI通过deposit函数转移到_toJar中。最终盗取大量DAI代币

 

综上,在此次攻击事件中,攻击者通过swapExactJarForJar函数方法的设计缺陷传入可控参数盗取大量cDAI,最终兑换出巨额DAI。

总结

DeFi今年确实备受关注,随之而来的黑客攻击也不断发生,在最近的几周内,类似Pickle Finance这样的项目,包括Harvest Finance,Value DeFi,Akropolis,Cheese Bank和Origin Dollar等均受到不同程度的黑客攻击。针对频频发生的黑客攻击事件,标准的安全建议就是:

• 在项目上线之前,找专业的第三方安全企业进行全面的安全审计,而且可以找多家进行交叉审计;

• 可以发布漏洞赏金计划,发送社区白帽子帮助找问题,先于黑客找到漏洞;

• 加强对项目的安全监测和预警,尽量做到在黑客发动攻击之前发布预警从而保护项目安全。