零时科技 | Pickle Finance合约被盗复盘分析
零时科技 | Pickle Finance合约被盗复盘分析
事件概述
北京时间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今年确实备受关注,随之而来的黑客攻击也不断发生,在最近的几周内,类似PickleFinance这样的项目,包括Harvest Finance,Value DeFi,Akropolis,Cheese Bank和Origin Dollar等均受到不同程度的黑客攻击。针对频频发生的黑客攻击事件,标准的 安全建议 就是:
• 在项目上线之前,找专业的第三方安全企业进行全面的安全审计,而且可以找多家进行交叉审计;
• 可以发布漏洞赏金计划,发送社区白帽子帮助找问题,先于黑客找到漏洞;
• 加强对项目的安全监测和预警,尽量做到在黑客发动攻击之前发布预警从而保护项目安全。