慢霧:Rari 被黑事故分析

買賣虛擬貨幣

By:yudan@慢霧安全團隊

2021 年 5 月 8 日,據鏈聞訊息,以太坊收益聚合協議 Rari Capital 因整合了 Alpha Finance 產生了漏洞,損失近 1500 萬美元。事後,Rari Capital 官方釋出了事故分析報告,分析了此次事故的主要原因。慢霧安全團隊在官方分析的基礎上,結合慢霧安全團隊對此次事件的深入分析,進一步解讀本次安全事故的原因。

攻擊細節分析

本次攻擊發生在 Rari Capital 的 RariManger 合約中,整個過程下來就是攻擊者首先透過閃電貸從 dYdX 中借出巨量資金,然後不停的重複呼叫 RariManger 合約中的 deposit 和 withdraw 函式,完成獲利。如下圖:

那麼使用者是如何透過 deposit 和 withdraw 這兩個操作獲利的呢?我們需要分析對應的函式:

以上是 deposit 函式的部分邏輯,首先 deposit 函式本身會呼叫內部的 _depositTo 函式,然後會再次呼叫 getFundBalance 函式來獲取合約的餘額。getFundBalance 函式最終是會呼叫到 Rari Controller 合約的 getBalance 函式去獲取餘額。最後是透過 Rari Controller 合約中的 AlphaPoolController 庫的 getBalance 函式獲取餘額。如下圖:

流程上略微複雜,用圖來展示大概就是下面這樣:

從上面的分析不難發現,Rari 合約最終是用到了 Alpha Finance 專案的 ibETH 合約的 totalETH 函式獲取合約的餘額,目的是為了根據 totalETH 和 totalSupply 的比值計算出 Rari 合約真正的 ETH 餘額。deposit 函式是根據使用者的充值 ETH 的數量和比值計算要發放給使用者的 REPT 數量,而 withdraw 函式的公式也大同小異,同樣需要透過 getBalance 函式獲取合約的 ETH 餘額並計算比值,然後根據使用者的 REPT 代幣的餘額和比值計算需要返還給使用者的 ETH 的數量。但是問題恰恰出在這個獲取 ETH 餘額的公式上。

根據官方描述,從 ibETH 合約獲取的 totalETH 函式獲取的值是可以被使用者操控的。以下是官方原文:

根據官方的描述,使用者可透過 ibETH 合約的 work 函式操控 totalETH 函式返回的值,導致 Rari 整個價值計算公式崩潰。我們分別分析 ibETH 的 work 函式和 totalETH 函式:

totalETH 函式:

work 函式:

以上分別是 ibETH 合約中的 totalETH 函式和 work 函式的部分實現。不難發現 totalETH 函式其實就是獲取合約的總的 ETH 的數量。而 work 函式,本身是一個 payable 函式,也就是說,使用者是可以透過 work 函式來控制 ibETH 合約中的 ETH 數量從而來改變 totalETH 返回的值的。更糟糕的是,work 函式同時還支援呼叫其他的任意合約。那麼整個思路就很清晰了。

攻擊流程

1、從 dYdX 中進行閃電貸,借出大量的 ETH;

2、使用一部分的 ETH 充值到 Rari Capital 合約中,此時從 ibETH 獲取的比值還是正常的;

3、使用剩餘的 ETH 充值到 ibETH 合約中,呼叫 ibETH 合約的 work 函式,為後續推高 ibETH 合約的 totalETH 的返回值做準備;

4、在 work 函式中同時對 Rari Capital 合約發起提現,由於上一步已經推高 totalETH 值,但是計算的 totalETH()/totalSupply() 的值相對於充值時被拉高,從而使攻擊者能從 Rari Capital 中使用等量的 REPT 獲取到更多的 ETH。

總結

本次分析下來,主要的原因是協議的不相容問題,攻擊者透過閃電貸和重入的方式,攻擊了 Rari Capital,造成了巨大的損失。慢霧安全團隊建議在 DeFi 逐漸趨於複雜的情況下,各 DeFi 專案在進行協議間互動時,需要做好協議之間的相容性,避免因協議相容問題導致的損失。

【參考連結】

Rari Capital 官方分析:

https://medium.com/rari-capital/5-8-2021-rari-ethereum-pool-post-mortem-60aab6a6f8f9

攻擊交易(其中一筆):

https://etherscan.io/tx/0x171072422efb5cd461546bfe986017d9b5aa427ff1c07ebe8acc064b13a7b7be

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;