2021年10⽉27⽇晚,DeFi借贷协议Cream Finance再次遭受⿊客闪电贷攻击,被盗取CreamLP代币和其他多种ERC-20代币,攻击者在两个⼩时内共计盗⾛价值1.15亿美元的资⾦。
0x1 事件背景
Cream Finance是一种去中心化的借贷协议,供个人和协议访问金融服务。该协议是无需许可的、透明的和非监管的。
零时科技区块链安全情报平台监控到消息,2021年10⽉27⽇晚,DeFi借贷协议Cream Finance再次遭受⿊客闪电贷攻击,被盗取CreamLP代币和其他多种ERC-20代币,攻击者在两个⼩时内共计盗⾛价值1.15亿美元的资⾦。
0x2 攻击者信息
以下是关于本次攻击事件的攻击者钱包地址,攻击者部署的攻击合约地址,攻击发⽣的交易。
https://etherscan.io/address/0x24354d31bc9d90f62fe5f2454709c32049cf866b
https://etherscan.io/address/0x961d2b694d9097f35cfffa363ef98823928a330d%23code
https://etherscan.io/address/0x961d2b694d9097f35cfffa363ef98823928a330d%23code
0x3 攻击分析
这里我们将拆解攻击者交易,方便读者更清晰的了解攻击过程。
第一步:通过DssFlash闪电贷借款5亿枚DAI,之后将该资产兑换为4.5亿yDAI。
第二步:将获取4.5亿yDAI转至Curve.fi池,获取到4.47亿(yDAI+yUSDC+yUSDT+yTUSD)。
第三步:将获取的4.46亿yUSD转至Cream.Finance获取223亿crYUSD,同时4.47亿(yDAI+yUSDC+yUSDT+yTUSD)进入策略池。
第四步:通过Aave闪电贷借款52.4万WETH至攻击者合约2,并向攻击者合约1转0.6万WETH(剩余51.8万)。
第五步:通过剩余的51.8枚万WETH获取到2495万枚crETH。
第六步:攻击者2向Cream.Finance借款4.46亿yUSD。
第七步:攻击者2在Cream.Finance将4.46亿yUSD兑换为223亿crYUSD,随后将223亿crYUSD转至攻击者1。
第八步:攻击者2向Cream.Finance借款4.46亿yUSD。
第九步:攻击者2在Cream.Finance将4.46亿yUSD兑换为223亿crYUSD,随后将223亿crYUSD转至攻击者1。
第十步:攻击者2向Cream.Finance借款4.46亿枚yUSD,并将资金转至攻击者1。
第十一步:攻击者1通过UniswapV3将745万枚USDC兑换为1873枚WETH。
第十二步:将1873枚WETH兑换为372万枚USDC,并最终将372万枚USDC转换为302万枚yUSD。
第十三步:攻击者将4.49亿枚yUSD(第十步获取4.46亿枚yUSD和第十二步中的302万枚yUSD)兑换为(yDAI+yUSDC+yUSDT+yTUSD)。
第十四步:将843万枚(yDAI+yUSDC+yUSDT+yTUSD)转入Curve Y Pool yVault池中(由于巨额资金已造成价格差异)。
第十五步:攻击者归还Aave 52万枚WETH。
第十六步:攻击者通过操控价格差,借取大量资金。
第十七步:攻击者归还闪电贷
至此,攻击者通过闪电贷获取的巨额资金,操控价格预言机,从而获取大量资金,⽬前资⾦被转移到不同的钱包中,零时科技安全团队会持续保持跟踪资⾦动向。
0x4 漏洞细节
零时科技安全团队分析攻击交易发现CREAM价格预⾔机中的价格可以被操纵,导致套利攻击的发⽣。通过分析源代码,borrowAllowed 函数中会执⾏借贷检查。
跟进到 borrowAllowed 函数中,发现返回主要根据getHypotheticalAccountLiquidityInternal函数,继续跟进。
继续跟进预⾔机的 getUnderlyingPrice 函数。
最后跟进至getYvTokenPrice函数,发现pricePerShare其直接返回了_shareValue 作为价格。⽽_shareValue 是通过_totalAssets 除合约的总share数量(self.totalSupply) 来计算单个 share 的价格的。
在攻击过程中借款时 yUSD 的价格。
⿊客通过将 yDAI+yUSDC+yUSDT+yTUSD 直接转账的⽅式显著提⾼ yUSD 的价格
⼏乎将 yUSD 的价格实现了翻倍,最终获利离场。
0x5 总结
本次攻击的漏洞根本原因是由于不安全的外部引⽤/依赖,是利⽤闪电贷进⾏价格操控的攻击。Cream Finance 的借贷池直接使⽤的是价格预⾔机的接⼝,但是该接⼝的价格计算规则是合约的抵押物余额与策略池抵押资产数额相加除以总 share 数。⽽攻击者可以通过直接转⼊抵押物,从⽽⼤幅度抬⾼单个share的价格,导致了攻击者可以借取更多的资⾦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!