BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

CertiK:賣意外險的保險公司也遭受了意外? Cover Protocol漏洞分析

CertiK
特邀专栏作者
本文約2552字,閱讀全文需要約4分鐘
北京時間12月28日晚, CertiK安全驗證團隊發現Cover Protocol發生代幣無限增發漏洞攻擊。本文為你分析事件詳情始末。
AI總結
展開
北京時間12月28日晚, CertiK安全驗證團隊發現Cover Protocol發生代幣無限增發漏洞攻擊。本文為你分析事件詳情始末。

最近小區出現了一些流浪狗,聽說鄰居家有孩子看到狗嚇得就跑,結果反而被狗狂追咬了一口。

還好父母機智,給孩子上了個意外險,幾針狂犬病疫苗下來沒怎麼花錢。

作為幣民如果加密資產不幸被盜,但項目方或者你個人購買了保險,那麼也大可放心讓保險公司償還損失的資產。

技術分析

技術分析

技術分析

技術分析

主要攻擊分為以下步驟:

1. 攻擊者設置攻擊必要的NOCLAIM代幣。
2. 攻擊者使用NOCLAIM代幣,為Balancer Pool提供流動性:

①總計向Balancer Pool提供了2,573個DAI的流動性

②攻擊者通過向Balancer Pool提供流動性,獲得了約132,688個Balancer流動性證明代幣BPT

3. 攻擊者向Cover Protocal中的Blacksmith.sol智能合約質押(stake)前一步中所得的所有Balancer流動性證明代幣。
質押時,攻擊者調用位於0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5的Blacksmith.sol智能合約中的deposit函數,如圖一所示:

圖一:The deposit() function in blacksmith.sol

通過調用deposit函數,攻擊者將得到的BPT流動性證明質押到cover protocol中。

首先通過圖一中118行將當前流動性證明代幣的pool數據讀取到memory,然後調用121行代碼對當前pool的數據進行更新。

圖二:blacksmith.sol中的updatePool()函數
如圖二第75行所示,在updatePool()函數中修改的當前流動性證明代幣的pool數據是一份存儲在storage中的數據,與在deposit()中存儲在memory中當前流動性證明代幣的pool數據是兩份數據。
在圖二第84行lpTotal的值代表當前合同中總共存入的流動性證明代幣數目,由於該變量數值較小,因此通過84行公式pool.accRewardsPerToken的數值將會增大,更新過的accRewardsPerToken值存儲在storage中。

圖三:blacksmith.sol中的_claimCoverRewards()函數

接下來如圖三中318行所示,deposit()通過調用_claimCoverRewards()函數,向函數調用者(msg.sender)鑄造一定數目的cover代幣。

鑄造cover代幣的數目與pool.accRewardsPerToken, CAL_MULTIPLIER以及miner.rewardWriteoff三個變量相關。

請注意這裡pool.accRewardsPerToken的數值是使用了存放在memory中的pool數據,並非使用圖二中update()函數更新之後的數值。

同時,通過圖1中deposit函數得知,miner.rewardWriteoff的數值更新是在_claimCoverRewards()函數執行完成之後發生。

因此原本設計上應使用更新過的miner.rewardWriteoff的數值計算需要鑄造cover代幣的數目,這裡錯誤的使用了未更新過的miner.rewardWriteoff的數據,導致實際鑄造cover代幣數目比應鑄造代幣數目增多,最終導致了代幣增發。

質押成功之後,攻擊者通過調用blacksmith.sol智能合約中的withdraw()函數,將質押的BPT取回,同時取得額外鑄造的cover代幣,完成攻擊。

通過對比執行deposit()函數和執行withdraw()函數之後的代幣結餘表,我們可以發現通過這一組deposit和withdraw函數調用之後,攻擊者可以獲得約704個COVER代幣。

deposit()之後:

withdraw()之後:

攻擊者通過反复執行deposit和withdraw函數,可以使Blacksmith函數無限鑄造代幣,並將代幣轉到自己的地址中,由此獲利。

有漏洞的blacksmith地址:

有漏洞的blacksmith地址:

0xe0b94a7bb45dd905c79bb1992c9879f40f1caed5

臨時修復後的blacksmith地址:

0x1d5fab8a0e88020309e52b77b9c8edf63c519a26

臨時修復後的blacksmith合同臨時禁止了一切質押和取回操作,以此阻止攻擊者繼續實行攻擊。

本次攻擊最初攻擊者共獲利440萬美金,約合人民幣2900萬人民幣。

安全建議

安全建議

安全建議

為了確保數字資產不因任何非技術原因遭受損失,項目方應及時為項目產品購買保險,增加項目方和投資者的安全保障方案,確保其因受到攻擊所造成的損失可以被及時補償。
作為世界頂尖的審計公司,CertiK目前已經進行了超過369次安全審計,審計了超過198,000行代碼,並保護了價值超過100億美元的加密資產。
近期,CeritK推出了CertiKShield去中心化資金保障計劃。
CertiKShield不僅可以為項目及其社區成員提供保障,同時,CertiK作為主營業務為審計的安全公司,我們確保自己的保險項目擁有更高的安全性。
相比於純粹的保險公司,安全技術的背書及團隊對於安全的重視和一系列的保障,CertiKShield是安全領域內構建的保險,並且有著巨大的成長和發展空間。

歡迎訪問https://www.certik.foundation/

進入CertiK foundation官網訪問更多CertiK安全產品相關信息!

安全
投资
歡迎加入Odaily官方社群