漏洞原因
近日,據業內人士提供的有關信息(如下圖所示),名為 KingDefi 的項目合約存在漏洞,並提示其他用戶謹慎操作,提取資金並取消授權。知道創宇區塊鏈安全實驗室調研發現,KingDeFi 是一個 DeFi 項目,主要功能包含對 BSC、Solana 鏈上 DeFi 的收益聚合分析、用戶 DeFi 收益追蹤以及項目原生代幣的抵押挖礦。
在查看 BSC 鏈上的 KrownMaster 合約(用於抵押挖礦 staking )源碼後發現,該合約確實存在邏輯漏洞,會導致用戶收益率受到影響,在相應的計算邏輯存在疏漏,以下為詳細解釋。
合約鏈上地址如下:
https://bscscan.com/address/0x56a65a3736e65349e5b0737cb2c5eb7d5ccbbbe3#code
如下圖所示,我們注意到在項目用戶獎勵更新演算法邏輯的處理過程中存在對 investor 數組的一個遍歷,此處 investor 地址存在被重複遍歷並且修改對應獎勵的可能性。
如下圖所示,用戶在通過 deposit 調用進行抵押的時候,判斷當用戶抵押數量為 0 時,可作為 investor 地址加入投資收益列表從而獲得抵押收益,而該判斷可被黑客利用。
如下圖所示,黑客可通過調用 withdraw 或者 withdrawAll 函數將指定 pid 池子中的抵押數量提現,從而使得 user.amount 為 0,進而該地址可以在再次 deposit 抵押的時候通過相應檢查進入 investor 列表,從而在 updatePool 函數中對黑客 investor 地址進行重複遍歷並且增加多次抵押獎勵,使得抵押獎勵分配不均,影響到其他用戶的抵押挖礦收益。
通過查看項目 github 發現,KingDefi 項目方當前已對該問題進行了修改。
漏洞修復
那麼項目方如何修復該漏洞?查看項目的 github 地址(https://github.com/kingdefi/Krown-Contracts/tree/main/Farm),發現其在 18 個小時前曾更新過代碼,對比一下更新代碼。
發現項目方已經刪除了用於存儲用戶地址的數組,改為了 rewardsPerShare 變數,該變數表示單位抵押代幣所對應的獎勵代幣;同時項目方也更改了獎勵的計算方式 (updatePool 函數):由原來循環所有用戶地址來按比例分配獎勵改為更新 rewardsPerShare 變數來計算用戶獎勵代幣。
對比兩種獎勵方式,後者已經不會產生前者因為重複計算獎勵的問題,這種獎勵方式類似於 sushiswap 的獎勵計算方式,同時也避免了前者因為循環次數太多導致的 gas 銷毀過大的問題。
漏洞總結
Kingdefi 這次的漏洞影響到的是用戶的獎勵代幣數量,攻擊者可不斷抵押提取來提高自身獎勵的分配數量,但是用戶的抵押代幣是不受任何影響,可以正確安全提取出來。從項目方的修復結果來看,其換了一種常規獎勵計算方式,該方式符合抵押挖礦邏輯,用戶可正常且正確提取抵押和獎勵代幣。在此提醒廣大項目方,在上線 Defi 挖礦項目前一定要做好代碼審計,不同的計算方式在吸引新用戶的同時也會大大增加犯錯的風險!
冷萃財經原創,作者:Awing,轉載請註明出處:https://www.lccjd.top/2021/06/25/kingdefi%e6%94%b6%e7%9b%8a%e8%ae%a1%e7%ae%97%e9%80%bb%e8%be%91%e6%bc%8f%e6%b4%9e%e5%88%86%e6%9e%90/?variant=zh-tw
文章評論