注意安全防範!

封面:Radiant Capital

2024 年 1 月 3 日,據 Beosin 旗下 EagleEye 安全風險監控、預警與阻斷平臺監測顯示,Radiant Capital 專案遭受攻擊者閃電貸攻擊。 攻擊者通過 3 筆交易,盜取了超 1900 枚 ETH,價值超 450 萬美元,目前被盜資金還保存在攻擊者位址,Beosin 安全團隊第一時間對本次事件進行了分析。

漏洞分析

該事件發生的根本是由於 Radiant Capital 專案在計算代幣數量的過程中,使用了精度擴展,並且採用了四捨五入的方式進行計算,導致攻擊者可以通過控制精度大小,並結合四捨五入擴大利潤點來進行攻擊。

觀察上述代碼,rayDiv 函數傳入兩個 uint256 數據 a 和 b,整個過程可以簡寫為(a*RAY+b/2)/b,其中 RAY 是精度擴展數據,為 10^27,那麼該結果相當於 a*RAY/b+0.5,實現四捨五入的功能,而該計算方式誤差主要來源於 b,如果 b 相

對於 a 來說極小,那麼誤差將可忽略不計,但如果 b 於 a 擁有相同數量級,那麼誤差可能達到 a 本身。
舉個例子:如果 a*RAY=10000,b=3,那麼計算出來結果為 3333,比實際值小了 1/10000; 而如果 a*RAY=10000,b=3000,計算出來的結果為 3,比實際值小了 1/10。

此次事件便是攻擊者操控 b 的值,讓 b 值與 a 值擁有相同數量級,使得計算等價於 3/2.0001=1,計算值比實際值減小 1/3。

攻擊流程

讓我們來看看駭客的攻擊流程:

1. 攻擊者首先通過 AAVE 閃電貸借貸了 300 萬枚 USDC,用於攻擊啟動資金

2. 攻擊者將 200 萬枚 USDC 質押到 Radiant 合約,並獲得了 200 萬枚 rUSDCn 憑證代幣。

3. 攻擊者通過 Radiant 合約進行閃電貸,借貸 200 萬 USDC,並在回調函數中將 200 萬 USDC 歸還,同時將第二步質押的 USDC 提取出來,最後閃電貸函數會調用 transferfrom 函數連本帶利的將攻擊者的 USDC 轉入合約。  此時會收取 9/10000 的手續費,而收取的手續費便成為了池子的流動性。

4. 攻擊者通過多次重複步驟 3 的操作,將 liquidityIndex 控制得很大,liquidityIndex=271800000000999999999999998631966035920。

5. 接下來,攻擊者新建了一個合約,並向其中打入 54.36 萬 USDC,因為 5436(USDC 數值)正好是步驟 4 中 2718(liquidityIndex 數值)的兩倍,可方便進行四捨五入控制。

6. 攻擊者將 54.36 萬 USDC 全部抵押進 Radiant 合約,並獲得相同數量的 rUSDCn。

7. 攻擊者提取 40.77 萬 USDC,本應該銷毀 40.77 萬 rUSDCn,但如上所述,burn 函數進行了精度擴展與四捨五入計算。

40770000000000000000000000000000000000/271800000000999999999999998631966035920=1.499999999,而四捨五入結果為 1,導致結果偏小了 1/3。

如下圖,本該銷毀 40.77 萬,但還剩 27.18 萬,說明只銷毀了 27.18 萬,攻擊者便提取了 40.77 萬 USDC。

8. 攻擊者利用第七步的漏洞,重複質押提取操作,並且提取始終比質押數量多 1/3,最終將池子里的 USDC 全部兌換出來。

資金追蹤

截止發稿,被盜的 1902 枚 ETH 一直存在駭客位址未移動,Beosin Trace 將對資金進行持續監控。

隨著 2024 年的開啟,我們已目睹了兩起大金額的被盜案件的發生。(昨日安全事件回顧:開年第一案,被盜 8000 萬美元的 Orbit Chain 事件是怎麼一回事? )這一系列的事件再次提醒了我們,在 Web3 生態系統中,安全防範仍然是至關重要!

免責聲明:作為區塊鏈資訊平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。 文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。