zkLend Finance事件分析

本文為機器翻譯
展示原文

於2025年2月12日,zkLend Finance協議遭到攻擊,導致損失約950萬美元。

zkLend是一個建立在Starknet區塊鏈上的去中心化借貸協議。它允許使用者借貸資產,類似於Aave或Compound等協議。

該攻擊針對的是zkLend Market合約(特別是wstETH市場),這是允許使用者借貸資產的主要合約。

關鍵資訊

漏洞分析

從攻擊者地址來看,在攻擊期間發生了多筆交易。

要理解這次攻擊,我們需要首先檢查呼叫runwithfirstdep的交易,因為它似乎是最重要的一個。

runwithfirstdep交易中,我們可以看到對zkLend Market合約進行了多次連續的depositwithdraw呼叫。讓我們先檢查一個deposit呼叫的細節。

很明顯,depositwithdraw呼叫中的金額不相同,這表明這不是一個簡單的存取交易。這裡我們看到,攻擊者只存入了4.069個wstETH,但提取了6.103個wstETH。因此,我們需要檢查depositwithdraw函式的程式碼,以理解這次攻擊。

透過檢查deposit函式的程式碼,我們可以看到它接受輸入代幣的amount,並鑄造相應數量的zTokenwithdraw函式也是如此。但是,為什麼攻擊者能夠銷燬比他們應該的更多的zToken呢?這讓我們不得不檢查zToken合約中burn函式的實現。

burn函式的實現中,我們可以看到實際銷燬的金額是scaledDownAmount。此外,透過檢查safe_math::sub()函式,我們可以確定計算scaledDownAmount的公式是amount * SCALE / accumulator

所以,檢查這個值最簡單的方法是從攻擊交易中檢查這些值。我們有以下值:

  • amount: 6103946859077466029(提取呼叫)

  • accumulator: 4069297906051644020000000000000000000000000000

  • SCALE: 1000000000000000000000000000

從這些值中,我們可以計算出scaledDownAmount如下:

scaledDownAmount = amount * SCALE / accumulator

= 6103946859077466029 * 1000000000000000000000000000 / 4069297906051644020000000000000000000000000000

= 1

所以現在很明顯,這個值是攻擊者精心選擇的,以繞過scaled_down_amount.is_non_zero()的檢查。在runwithfirstdep交易之前的deposit交易用於操縱get_lending_accumulator()函式的結果,使這個值大得多,從而使scaled_down_amount變為1

事後分析

攻擊後,被盜資金從Starknet橋接到以太坊區塊鏈。攻擊者隨後試圖透過將資金存入Railgun隱私池來洗錢,但被該協議的政策阻止。這次失敗的洗錢嘗試突出了在DeFi領域平衡隱私和透明度的重要性。

經驗教訓

這一事件突出了在處理複雜和敏感的金融操作時,仔細驗證輸入值的重要性。透過吸取這樣的事件教訓,DeFi社群可以構建更加穩健的系統,更好地保護使用者資金。

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論