Pickle Finance遭攻击损失近2000万美元DAI 未经严格审计的DeFi路在何方?
这一周,“科学家”们(利用技术实力和知识门槛专薅 DeFi 的羊毛的黑客)很忙。
11月14日,黑客攻击 Value DeFi 的 MultiStablesVault 池子,获得近 740 万美金的 DAI;11月17日,黑客攻击Origin Protocol 凭空铸造 2050万 枚OUSD。
今天凌晨 2 时 37 分,当人们还在熟睡之时,黑客攻击 DeFi 协议 Pickle Finance(酸黄瓜),捞得近 2000 万美元的 DAI。
加密货币再次登上央视 DeFi沦为“科学家”的提款机?
11月18日,比特币冲击 18,000 美元,加密货币再次登上央视,此前,加密货币被誉为去中心化的金融工具首次登上央视。据央视报道,从投资回报率的角度来看,加密货币是今年真正的“头号”投资产品。“彭博银河加密货币指数”上涨约65%,超过金价逾20%的涨幅,也超过全球股市、债市和大宗商品市场的收益率。涨幅较高的一个关键原因是以太坊币价暴涨,涨幅达到169.40%。
央视解释道:“ 以太坊 币价格攀升得益于去中心化金融工具(DeFi)的使用增加,以及疫情肆虐后各国出台的巨额刺激措施,让投资者选择了比特币、以太坊等加密货币进行保值。”
一方面,加密货币市场频频发出利好消息;另一方面,DeFi 项目因未经严格审计频遭攻击。
据悉,今年 9 月 10 日 酸黄瓜 Pickle Finance 启动流动性挖矿,9 月 14 日 V神发推文赞赏该项目,使其代币价格暴涨 10 倍。而遭到此次攻击后,酸黄瓜损失近价值 2000 万的 DAI,同时 24 小时内其代币腰斩。
CoinmarketCap 数据显示, Pickle Finance 代币(Pickle)的价格在24小时内,从 22.7 美元跌到 10.2 美元,它的市值在未销毁的情况下, 24小时内蒸发了 1220 万美元。
发生了什么?
PeckShield 通过追踪和分析发现,攻击者通过StrategyCmpdDaiV2.getSuppliedUnleveraged() 函数查询资产余额 1972万 美元;
随后,攻击者利用输入验证漏洞将 StrategyCmpdDaiV2 中的所有 DAI 提取到 Pickle Jar:这个漏洞位于 ControllerV4.swapExactJarForJar() 函数中,其中包含两个既定的伪 Jar。在未验证既定 Jar 的情况下,此步骤会将存入的所有 DAI 提取到 Pickle Jar,并进行下一轮部署。
接下来,攻击者调用 earn() 函数将提取的 DAI 部署到 StrategyCmpdDaiV2 中。在内部缓冲区管理中,黑客调用了三次 earn() 函数,在 StrategyCmpdDaiV2 中生成共计 950,818,864.8211968 枚 cDAI;
第一次调用 earn() 函数存入 1976万 枚DAI,铸造 903,390,845.43581639 枚 cDAI;
第二次调用 earn() 函数存入 98.8万 枚DAI,铸造 45,169,542.27179081 枚 cDAI;
第3次调用 earn() 函数存入4.9万 枚DAI,铸造 2,258,477.11358954 枚cDAI;
随后,攻击者调用 ControllerV4.swapExactJarForJar() 函数,利用任意代码执行将 StrategyCmpdDaiV2 中的所有 cDAI 提取出来,这一步中,_execute() 函数有两个参数:_target和 _data,_target 指的是目标地址,即图中橘色所示部分;_target 是一个加白的地址,攻击者没办法任意控制此地址,此处他们利用的是 CurveProxyLogic,该加白的合约(能通过 262 行 approvedJarConverter[_targets[i] 的检查。也就是说,能被完全控制的是参数 _data,即图中紫色所示部分,_data 中包含 _execute() 函数可调用的add_liquidity() 函数,以及传给 add_liquidity() 的所有参数。
此时,咱们回到橘色框里的 curve、curveFunctionSig、curvePoolSize、curveUnderlyingIndex、underlying,其中 curve 是一个地址,它表示橘色框里倒数第二行中的 curve.call() 函数可以执行任意一个合约,因此,攻击者把 curve 设置成 StrategyCmpdDaiV2,curveFunctionSig 表示除了刚刚指定合约外,还可以指定要调用此合约的函数,通过此操作攻击者成功调用 StrategyCmpdDaiV2.withdraw() 函数。
接下来就是组织蓝色框中的函数 StrategyCmpdDaiV2.withdraw() 的参数 _asset,蓝色框中的 _asset 实际上是橘色框框里的 liquidity,liquidity 由传入函数 add_liquidity() 的 underlying 得来,underlying 是另一个伪造的合约地址,它的 balanceOf() 函数会返回 cDAI 的地址。攻击者将 cDAI 的地址设置成 liquidity[0] (此处的 0 也是 add_liquidity() 函数的参数 curveUnderlyingIndex),然后,liquidity 被打包到 callData 里再传给 withdraw() 函数,使得 withdraw() 函数取出的 _asset 就是 cDAI 的地址。值得注意的是,如果 want == _asset ,蓝色框里的函数就不执行,此设计的目的在于 want (也就是 DAI)是不允许被取出的,所以攻击者刻意取出对应的 cDAI。
最后,执行回 ControllerV4.swapExactJarForJar() 函数, 所提取的cDAI 被存入恶意的 _toJar . 在 _toJar.deposit() 函数里, 所有 950,818,864.8211968 枚 cDAI 立即转入黑客地址
未经严格审计的DeFi能走多远?
针对此次 Pickle Finance(酸黄瓜)被攻击事件,其审计公司 Haechi 发推文称,今年 10 月对其代码进行了一次审计,但是攻击者利用的漏洞发生在新创建的智能合约中,而不是接受安全审计的智能合约中。与此次漏洞攻击相关的代码存在于 controller-v4.sol 中的 swapExactJarForJar,而非此前审计的 controller-v3.sol 中,该智能合约不包含 swapExactJarForJar。
对此,PeckShield 相关负责人表示:“有一些 DeFi 项目在做过第一次智能合约安全审计后,可能会为了快速上线主网,省略审计新增的智能合约,这种省略或能争取短时的利益,但就像此次攻击一样最终因小失大。DeFi 们在上线之前一定要确保代码进行彻底地审计和研究,防范各种可能发生的风险。”
未经严格审计即上线的 DeFi 项目能走多远?
Ai sẽ là người được lợi trong đợt Bull Run của Bitcoin?
Theo báo cáo của sàn giao dịch OKEx trong thời kỳ Bull Run hiện tại của Bitcoin, những ch...
MCDEX khởi chạy trên mạng thử nghiệm Arbitrum Rollup L2
MCDEX vui mừng thông báo về việc ra mắt testnet của mình trên Arbitrum Rollup, một giải pháp khả năn...
[Tổng kết AMA] Cùng BigcoinVietnam tìm hiểu về Lien.Finance
Vào 11:00 AM - 12:00 PM, thứ tư, ngày 02/12/2020 Lien.Finance và BigcoinVietnam đã tổ chức một ...