By :yudan@慢雾安详团队
据慢雾区情报,2020 年 11 月 22 日,以太坊 DeFi 项目 Pickle Finance 蒙受进攻,损失约 2000 万 DAI。慢雾安详团队第一时间跟进相关事件并举办阐明,以下为阐明大略进程。
进攻流程简析
1、项目标Controller合约中的 swapExactJarForJar 函数答允传入两个任意的 jar 合约地点举办代币的兑换,个中的 _fromJar, _toJar, _fromJarAmount, _toJarMinAmount 都是用户可以节制的变量,进攻者操作这个特性,将 _fromJar 和 _toJar 都填上本身的地点,_fromJarAmount 是进攻者设定的要抽取合约的 DAI 的数量,约 2000 万 DAI。
2、利用 swapExactJarForJar 函数举办兑换进程中,合约会通过传入的 _fromJar 合约和 _toJar 合约的 token() 函数获取对应的 token 是什么,用于指定兑换的资产。而由于 _fromJar 合约和 _toJar 合约都是进攻者传入的,导致利用 token() 函数获取的值也是可控的,这里从 _fromJar 合约和 _toJar 合约获取到的 token 是 DAI。
3. 此时产生兑换,Controller合约利用 transferFrom 函数从_fromJar 转入必然量的 ptoken,可是由于 fromJar 合约是进攻者节制的地点,所以这里转入的 ptoken 是进攻者的假币。同时,因为合约从 _fromJar 合约中获取的 token 是 DAI,然后合约会判定合约里的资金是否足够用于兑换,假如不足,会从计策池中赎回必然量的代币,然后转到Controller合约中。在本次的进攻中,合约中的 DAI 不敷以用于兑换,此时合约会从计策池中提出不敷的份额,凑够进攻者设定的 2000 万 DAI。
4. 兑换继承,Controller合约在从计策池里提出 DAI 凑够进攻者设定的 2000 万 DAI 后,会挪用 _fromJar 的 withdraw 函数,将进攻者在第三步转入的假 ptoken burn 掉,然后合约判定当前合约中 _toJar 合约指定的 token 的余额是几多,由于 _toJar 合约指定的 token 是 DAI,Controller合约会判定合约中剩余 DAI 的数量,此时由于 第三步Controller合约已凑齐 2000 万 DAI,所以 DAI 的余额是 2000 万。这时Controller合约挪用 _toJar 合约的 deposit 函数将 2000 万 DAI 转入进攻者节制的 _toJar 合约中。到此,进攻者完成赢利。
总结
此次进攻中,进攻者通过挪用Controller合约中的 swapExactJarForJar 函数时,伪造_fromJar 和 _toJar 的合约地点,通过转入假币而调换合约中的真 DAI,,完成了一次进攻的进程。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。