星球前线|DeFi协议Pickle Finance因漏洞损失近2000万美元
余YU
2020-11-22 00:34
本文约2273字,阅读全文需要约9分钟
官方称鼓励LP从Jar中提取资金,直到问题解决。

本文来自 The BlockCointelegraph

Odaily星球日报译者 | 余顺遂

据 The Block 报道,DeFi 协议 Pickle Finance 在周六的一个漏洞中损失近 2000 万美元的 DAI。

据悉,该漏洞利用涉及 Pickle Finance 的 DAI pJar 策略,该策略利用 Compound 协议通过 DAI 存款来获得收益。

来自该漏洞的资金已被转移到地址 0x70178102AA04C5f0E54315aA958601eC9B7a4E08

根据 Cointelegraph 报道,就 Pickle Finance 因漏洞损失近 2000 万美元一事,白帽黑客、DeFi Italy 联合创始人 Emiliano Bonassi 表示,攻击者部署了“邪恶 Jar ”,这是一种具有传统 Jar 的相同界面、但是却作恶的智能合约。随后,攻击者在他的“邪恶 Jar ”和真正的 cDAI Jar 之间交换了资金,偷走价值 2000 万美元的存款。

官方回应:鼓励LP从Jar中提取资金,直到问题解决

11 月 22 日,Pickle Finance 发推称,有报道说我们的 DAI PickleJar 策略已被利用。我们正在积极调查此事,并将提供进一步的更新。我们鼓励所有 LP 从 Jar 中提取资金,直到问题得到解决。具体操作如下

1)从农场解押:

访问 https://vfat.tools/pickle/,连接您的钱包。向下滚动找到您的农场,然后单击  UNSTAKE(解押)。这也将申领您的 Pickle 奖励。您现在必须从您的 Jar 里解押。

2)从 Jar 取款:

访问 https://github.com/pickle-finance/contracts#pickle-jars-pjars,找到您的  Jar,然后单击“PickleJar”列表下的蓝色链接。

3)在代表 Jar 的 Etherscan 页面上,单击 CONTRACT(连接)->WRITE CONTRACT(读取连接)->CONNECT TO WEB3(连接到WEB3)。您会看到一个弹出框。点击“OK”。如果它不能连接,再次点击“CONNECT TO WEB3”,然后就会连接。

4)进入 Option 15,点击蓝色按钮“WRITE”。然后像平常一样完成您的 Metamask 交易(使用快速 Gas)。

5)对所有需要提取资金的 Jar 重复这个过程。

后续更新

22 日下午,慢雾安全团队表示第一时间跟进了相关事件并进行分析,以下为分析简略过程:

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,完成了一次攻击的过程。

此外,针对 Pickle Finance 攻击事件,审计公司 Haechi 澄清称我们 10 月进行了一次审计,但是攻击者利用的漏洞发生在新创建的智能合约中,而不是接受安全审计的智能合约中。与此次漏洞攻击相关的代码是“controller-v4.sol”中的“swapExactJarForJar”;而此前的安全审计是针对“controller-v3.sol”,不包含“swapExactJarForJar”。在不久的将来,Haechi 将发表关于 Pickle Finance 攻击事件的分析文章。

余YU
作者文库
推荐文章
Test105
2025-09-25 07:32
Test105
Test104
2025-09-25 07:32
Test104
Test103
2025-09-25 07:31
Test103
Test102
2025-09-25 07:30
Test102
Test 101
2025-09-25 07:21
Test 101