据慢雾区情报,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,完结了一次攻击的过程。
视野开拓
对拉美一无所知的美国银行发放大量的(比索)美元贷款给当地的公共部门借款人(262页) 原文:U.S. baks that udestood little about Lati Ameica let billios ofpeto) dollas to public-secto boowes theep.253)-《大衰退年代》