專案上線前,需要由第三方專業的審計公司進行智慧合約審計。

作者:SharkTeam

封面: Photo by Markus Spiske on Unsplash

2024 年 4 月 19 日,Hedgey Finance 遭受多筆攻擊交易,損失超過 200 萬美元。

SharkTeam 對此事件第一時間進行了技術分析,並總結了安全防範手段,希望後續項目可以引以為戒,共築區塊鏈產業的安全防線

一、攻擊交易分析

Hedgey Finance 被過個攻擊者發動了多次攻擊,利用代幣批准漏洞,盜取了 ClaimCampaigns 合約中的大量代幣。

以其中涉及金額最大的一筆交易為例,涉及金額約 130 萬美元:

攻擊交易:0x2606d459a50ca4920722a111745c2eeced1d8a01ff25ee762e22d5d4b1595739

攻擊者:0xded2b1a426e1b7d415a40bcad44e98f47181dda2

攻擊合約:0xc793113f1548b97e37c409f39244ee44241bf2b3

目標合約:0xbc452fdc8f851d7c5b72e1fe74dfb63bb793d511(ClaimCampaigns)

該交易直接從 ClaimCampaigns 合約中轉移走了 1,303,910.12 USDC。交易詳情如下:

實際發動攻擊的交易是

0xa17fdb804728f226fcd10e78eae5247abd984e0f03301312315b89cae25aa517(簡記為 0xa17f)

攻擊過程如下:

1 從 Balancer 中閃電貸 1.305M USDC。

2 呼叫 ClaimCampaigns 合約中的 createLockedCampaign 函數。在該函數中,攻擊合約會將 1.305M USDC 存入 ClaimCampaigns 合約中,然後 laimCampaigns 合約將轉入的 1.305M USDC 批准給攻擊合約使用。

3 呼叫 ClaimCampaigns 合約中的 cancelCampaign 函數。在該函數中,攻擊合約將存入的 1.305M USDC 提取出來,但在 createLockedCampaign 函數中批准給攻擊合約的 USDC 並沒有取消。

4 攻擊合約償還 Balancer 的閃電貸。

在該交易中,攻擊合約將保存在 ClaimCampaigns 合約中的 1.305M USDC 提取走後,ClaimCampaigns 合約批准給攻擊合約的 1.305M USDC 並沒有取消,因此攻擊合約可以直接調用 USDC 的 transferFrom 函數再次從 ClaimCampaigns 合約中轉移走 1.305M USDC。這也是交易 0xa17fdb804728f226fcd10e78eae5247abd984e0f03301312315b89cae25aa517 實現的功能。

透過以上兩筆交易,攻擊者從 ClaimCampaigns 合約中盜取了 1.305M USDC。

除了 USDC 外,該攻擊者利用此漏洞還從 ClaimCampaigns 合約中盜取了大量的 NOBL Token,加上 USDC,總價值超過 200 萬美元。

二、漏洞分析

本次事件的根本原因是專案方智能合約在實現邏輯上存在代幣批准漏洞,使得攻擊者可以利重複轉移目標合約批准給 msg.sender 中的 Token。

智能合約 ClaimCampaigns 的 createLockedCamaign 函數會將 msg.sender 的 Token 存入到目標合約中,並將這些 Token 批准給 msg.sender。

cancelCampaign 函數會將存入的 Token 提取出來,但並沒有取消代幣的批准。

攻擊者利用此漏洞,直接呼叫 Token 的 transferFrom 函數從目標合約中再次轉移走核准的代幣。

三、安全建議

針對本次攻擊事件,我們在開發過程中應遵循以下注意事項:

(1)專案在設計和開發過程中,要保持邏輯的完整性和嚴謹性,尤其是涉及到資產的轉移過程中,在轉移 Token 時保證同步代幣批准的數量,避免上面轉移走了 Token 但沒有取消批准的情況。

(2)專案上線前,需要由第三方專業的審計公司進行智慧合約審計。

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