2024 年 4 月 19 日,Hedgey Token Claim 合約在以太坊、Arbitrum 等多條鏈上被攻擊,損失高達數千萬美元。Hedgey 項目方隨即發出安全告警,提醒創建代幣認領活動的用戶通過官方渠道取消代幣認領活動。(https://twitter.com/hedgeyfinance/status/1781257581488418862)
Hedgey 幫助 DAOs 和鏈上組織通過鏈上、程序化的代幣發放,將代幣分配給他們的團隊、貢獻者、投資者和社區。本次出現漏洞的工具是其 Token Claims 產品,該產品可以讓用戶創建一個代幣認領頁面,通過 CSV 文件添加多達十萬多名接收者到白名單中,並控制如何通過流、時間鎖、回收等方式釋放已認領的代幣。
而本次攻擊事件所利用的合約漏洞在於:Token Claims 產品中的 ClaimCampaigns 合約在創建一個代幣認領活動時,將自身的 token 授權給了創建者指定的地址。在該創建者取消認領活動時,將活動創建階段創建者轉入的 token 返還給創建者指定的另一個地址,但並未撤銷 token 授權,導致活動創建者的地址依然可以使用 ClaimCampaigns 合約所授權的 token。
本次攻擊涉及到多筆交易,我們僅以下面這筆盜取 NOBL 代幣的交易爲例來對攻擊原理進行分析。
攻擊交易:
https://etherscan.io/tx/0x017ce9593350cba65d506e1a87e52d2c20079fdfa80a350a89fe6fc875f2d9f9
攻擊 EOA:
0xded2b1a426e1b7d415a40bcad44e98f47181dda2
攻擊者(合約):
0xd818ff3d5cfc938014b270d0c8029ba04629b549
漏洞合約(ClaimCampaigns):
0xbc452fdc8f851d7c5b72e1fe74dfb63bb793d511
被盜代幣(NobleBlocks: NOBL Token):
0x88b9f5c66342ebaf661b3e2836b807c8cb1b3195
在攻擊實施階段,攻擊者多次調用漏洞合約的 「 createLockedCampaign 」 函數創建 campaign,再調用「 cancelCampaign 」函數刪除 campaign。創建 campaign 時,攻擊者向漏洞合約轉入指定數量的 NOBL 代幣,並獲得漏洞合約給其授權的 NOBL 代幣使用額度。刪除 campaign 時,漏洞合約退還攻擊者創建 campaign 時轉入的 NOBL 代幣,然而此時漏洞合約並未撤銷給攻擊者授權的 NOBL 代幣使用額度。因此攻擊者通過創建 campaign 再刪除 campaign,可以憑空獲取花費漏洞合約持有的 NOBL 代幣的權力。
具體攻擊步驟如下:
攻擊者調用漏洞合約的「 createLockedCampaign 」函數創建 campaign,在參數中將 「 campaign.manager 」和「 claimLockup.tokenLocker 」均設置爲攻擊者自己,將「 campaign.token 」設置爲 NOBL 代幣,「 campaign.amount 」設置爲「 680000000000000000000000 」(NOBL 代幣的 decimal 爲 18,因此此處代表 680000 個 NOBL 代幣),「 donation.amount 」設置爲 0。從「 createLockedCampaign 」函數代碼可以看出,攻擊者首先將 NOBL 代幣轉給漏洞合約,然後再通過「 safeIncreaseAllowance 」函數,使漏洞合約給「 claimLockup.tokenLocker 」(攻擊者)授權花費漏洞合約持有的 NOBL 代幣的權力,此處授權了「 campaign.amount 」這么多的額度給攻擊者。
攻擊者調用「 cancelCampaign 」函數刪除第 1 步中創建的 campaign,從函數代碼可以看出,漏洞合約將該 campaign 的數據刪除,並調用 TransferHelper 庫的 「 withdrawTokens 」函數將第 1 步中攻擊者轉入的 NOBL 代幣還給「 campaign.manager 」(攻擊者)。至此 campaign 成功被取消,然而第 1 步中漏洞合約授權給攻擊者的 NOBL 代幣使用額度並沒有同步刪除。因此攻擊者此時還具備花費漏洞合約 NOBL 代幣的權力。
攻擊者重復 25 次第 1 步和第 2 步的操作,最終從漏洞合約獲取到了 680000 * 25 = 17000000 個 NOBL 代幣的使用額度。
在收割贓款階段,攻擊者直接調用 NOBL 代幣的「 transferFrom 」函數,將 NOBL 代幣從漏洞合約轉到攻擊者 EOA 地址上,由於在攻擊實施階段攻擊者已經拿到了花費漏洞合約持有的 NOBL 代幣的權力,因此在「 transferFrom 」函數中的額度校驗可以順利通過,最終攻擊者成功盜取了漏洞合約中的 NOBL 代幣。
具體細節請查看交易:
https://etherscan.io/tx/0x47da1ac72d488f746865891c9196c1632ae04f018b285b762b2b564ad1d3a9e5
通過 ZAN KYT 數據分析,攻擊者在從漏洞合約中取走 NOBL token 之前,利用合約漏洞讓漏洞合約給攻擊者 approve token 的交易 hash 如下(僅羅列了以太坊上的交易):
目前,攻擊者已將部分非法所得轉移到了另外一個地址 0xd84f48b7D1AaFA7bd5905c95c5d1ffB2625AdA46 上,目前暫時沒有其他動作。而 claims 合約的开發者(0x5a4bC2bdA1f6B9929b6efdCef4728246bEc4C635)通過 Blockscan chat 與攻擊者聯系,承認了合約中的漏洞並假定了他們的行爲爲白帽行動,希望攻擊者在 24 小時內與他們取得聯系。
通過分析本次攻擊事件,我們有如下建議:
嚴格審查項目中代幣授權的操作。項目开發者和合約審計者應該明確哪些業務場景需要代幣授權,哪些業務場景需要回收代幣授權,避免未回收的代幣授權或預期之外多余的授權被攻擊者利用。
項目應設置緊急暫停機制。建議涉及到資金流轉的項目都建立完善的暫停機制,當攻擊發生時,能及時止損。
本文由 ZAN Team 的 Cara(X 账號 @Cara6289)和 XiG(X 账號 @SHXiGi)共同撰寫。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
標題:Hedgey 攻擊事件分析 - 損失上千萬美元的代幣授權
地址:https://www.100economy.com/article/119397.html