我们跟进 getHypotheticalAccountLiquidityInternal 函数,可以发现对于抵押物的价值获取来自 886 行的 oracle.getUnderlyingPrice。 我们跟进预言机的 getUnderlyingPrice 函数,可以容易的发现其将通过代币 150 行的 getYvTokenPrice 函数进行价格获取。 继续跟进 getYvTokenPrice 函数,由于 yvTokenInfo.version 为 V2,因此将通过 yVault 的 pricePerSHARE 函数进行价格获取。 跟进 pricePerShare 可以发现其直接返回了 _shareValue 作为价格,而 _shareValue 是通过 _totalAssets 除合约的总 share 数量 (self.totalSupply) 来计算单个 share 的价格的。因此攻击者只需要操控 _totalAssets 将其拉高就可以提高单个 share 的价格从而使得攻击者的抵押物价值变高以借出更多的其他代币。 我们可以查看下 _totalAssets 是如何获取的,从 772 行我们可以很清晰的看到,_totalAssets 是直接取的当前合约的 yDAI/yUSDC/yUSDT/yTUSD 代币数量,以及抵押在策略池中的资产数额相加获得的。因此攻击者通过直接往 yUSD 合约中转入 yDAI/yUSDC/yUSDT/yTUSD 代币就可以拉高 share 价格从而完成获利。 通过 Ethtx.info 可以清晰的看到 pricePerShare 前后变化: 最后攻击者在借空其他池子后归还了闪电贷获利离场。 总结本次攻击是典型的利用闪电贷进行价格操控,由于 Cream 的借贷池在获取 yUSD 池子 share 价格时直接使用了其 pricePerShare 接口,而此接口是通过合约的抵押物余额与策略池抵押资产数额相加除总 share 数来计算单个 share 的价格的。因此用户直接往 yUSD 转入抵押物就可以很容易的拉高单个 share 价格,最终使得 Cream 借贷池中抵押物可以借出更多的资金。 附:前两次 Cream Finance 被黑分析回顾 慢雾:Cream Finance 被黑简要分析 王者开局偶遇猪队友——简析 ALPHA Finance & Cream 被黑 (责任编辑:admin) |