細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

By:Kong@ 慢霧安全團隊

據慢霧區消息,2021 年 10 月 27 日,Cream Finance 再次遭受攻擊,損失約 1.3 億美金,慢霧安全團隊第一時間介入分析,並將簡要分析分享如下。

攻擊核心

本次攻擊的核心在於利用 Cream 借貸池對抵押物價格獲取的缺陷,惡意操控拉高了其抵押物的價格,使得攻擊者可以從 Cream 借貸池借出更多的代幣。

攻擊細節

首先攻擊者從 DssFlash 中閃電貸借出 5 億個 DAI,隨後將借出的 5 億個 DAI 抵押至 yearn 的 yDAI 池中,以獲得約 4.5 億個 yDAI 憑證。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

隨後攻擊者將獲得的 yDAI 代幣在 Curve 的 yDAI/yUSDC/yUSDT/yTUSD 池子中進行單幣流動性添加,以獲得相應的流動性憑證。緊接着攻擊者就將獲得的憑證抵押到 yUSD 池子中以獲得 yUSD 憑證,為後續在 Cream crYUSD 借貸池中抵押做準備。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

之後攻擊者開始向 Cream 的 crYUSD 借貸池中抵押其獲得 yUSD 憑證,為了擴大其抵押規模,攻擊者從 AAVE 閃電貸借出約 52.4 萬個 WETH,並將其抵押到 Cream 的 crETH 池子中。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

攻擊者通過在 crETH 池子中抵押大量 ETH,來使得其有足夠的借貸能力將 crYUSD 池子中的 yUSD 全部借出並重複抵押到 crYUSD 池子中,隨後通過在 crYUSD 池子中進行循環貸以槓桿的形式擴大了本身在 crYUSD 池子中 yUSD 的抵押規模,為後續操控價格獲利做準備。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

隨後為了獲得 yDAI/yUSDC/yUSDT/yTUSD 4Pool 憑證以操控價格,攻擊者用約 1,873 個 ETH 從 Uniswap V3 中兌換出約 745 萬個 USDC,並通過 Curve 3Pool 將其兌換成 DUSD 代幣約 338 萬 個。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

接下來攻擊者通過獲得的 DUSD 代幣從 YVaultPeak 中贖回 yDAI/yUSDC/yUSDT/yTUSD 4Pool 憑證,並利用此憑證從 yUSD 池子中取回 yDAI/yUSDC/yUSDT/yTUSD 代幣。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

隨後攻擊者開始進行此次攻擊的關鍵操作,其將約 843 萬個 yDAI/yUSDC/yUSDT/yTUSD 代幣直接轉回 yUSD 池子中,由於其不是通過正常抵押操作進行抵押的,所以這 843 萬個 yDAI/yUSDC/yUSDT/yTUSD 代幣並沒有被單獨記賬,而是直接分散給了 yDAI/yUSDC/yUSDT/yTUSD 憑證的持有者,這相當於直接拉高了其 share 的價格。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

在 crToken 中由於其抵押物價格被惡意拉高了,因此攻擊者抵押的大量 yUSD 可以使其借出更多的資金,最後攻擊者將 Cream 的其他 15 個池子全部借空。接下來我們跟進 Cream 的 crToken 借貸池中具體借貸邏輯。

從 cToken 合約中我們可以看到,主要借貸檢查在 borrowAllowed 函數中:

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

我們跟進 borrowAllowed 函數,可以看到在 427 行,其會根據 getHypotheticalAccountLiquidityInternal 函數檢查實時狀態下的該賬戶所對應的所有 cToken 的資產價值總和和借貸的資產價值總和,並通過對比 cToken 的資產價值和借貸的 Token 價值和,來判斷用戶是否還可以繼續借貸。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

我們跟進 getHypotheticalAccountLiquidityInternal 函數,可以發現對於抵押物的價值獲取來自 886 行的 oracle.getUnderlyingPrice。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

我們跟進預言機的 getUnderlyingPrice 函數,可以容易的發現其將通過代幣 150 行的 getYvTokenPrice 函數進行價格獲取。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

繼續跟進 getYvTokenPrice 函數,由於 yvTokenInfo.version 為 V2,因此將通過 yVault 的 pricePerShare 函數進行價格獲取。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜
細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜
細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

跟進 pricePerShare 可以發現其直接返回了_shareValue 作為價格,而_shareValue 是通過_totalAssets 除合約的總 share 數量 (self.totalSupply) 來計算單個 share 的價格的。因此攻擊者只需要操控_totalAssets 將其拉高就可以提高單個 share 的價格從而使得攻擊者的抵押物價值變高以借出更多的其他代幣。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜
細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

我們可以查看下_totalAssets 是如何獲取的,從 772 行我們可以很清晰的看到,_totalAssets 是直接取的當前合約的 yDAI/yUSDC/yUSDT/yTUSD 代幣數量,以及抵押在策略池中的資產數額相加獲得的。因此攻擊者通過直接往 yUSD 合約中轉入 yDAI/yUSDC/yUSDT/yTUSD 代幣就可以拉高 share 價格從而完成獲利。

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

通過 Ethtx.info 可以清晰的看到 pricePerShare 前後變化:

細節分析:DeFi 平台Cream Finance 再遭攻擊,1.3 億美金被盜

最後攻擊者在借空其他池子后歸還了閃電貸獲利離場。

總結

本次攻擊是典型的利用閃電貸進行價格操控,由於 Cream 的借貸池在獲取 yUSD 池子 share 價格時直接使用了其 pricePerShare 接口,而此接口是通過合約的抵押物餘額與策略池抵押資產數額相加除總 share 數來計算單個 share 的價格的。因此用戶直接往 yUSD 轉入抵押物就可以很容易的拉高單個 share 價格,最終使得 Cream 借貸池中抵押物可以借出更多的資金。

附:前兩次 Cream Finance 被黑分析回顧

慢霧:Cream Finance 被黑簡要分析

本文鏈接:https://www.8btc.com/article/6702657

轉載請註明文章出處

(0)
上一篇 2021-10-29 07:57
下一篇 2021-10-29 08:51

相关推荐