CertiK:Keep3r專案中心化風險漏洞分析

北京時間2020年11月20日, telegram社群出現某些截圖聲稱keep3rlink接受了certik的審計服務。

在此,certik鄭重宣告:certik團隊從未對 "keep3rlink" 專案進行過任何審計。

同日,certik安全研究團隊發現keep3r專案存在中心化安全風險。

專案擁有者擁有過大許可權,可將允許獎勵的限制提高,從而可以向任意參與者傳送任意數額的獎勵且可向任意地址鑄造任意數目代幣。 


專案風險及相關細節

keep3rv1:

● 程式碼地址:

https://github.com/keep3r-network/keep3r.network/blob/master/contracts/keep3r.sol

● 部署地址:

https://etherscan.io/address/0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44


keep3rv1helper:

● 程式碼地址:

https://github.com/keep3r-network/keep3r.network/blob/master/contracts/keep3rv1helper.sol

● 部署地址:

https://etherscan.io/address/0x93747c4260e64507a213b4016e1d435c9928617f


如下圖圖一所示,keep3r專案的keep3rv1智慧合約中定義了兩個角色:governance與pendinggovernance。
1178行setgovernance()函式允許當前governance角色將pendinggovernance角色設定為任意給定地址_governance。
同時在1186行acceptgovernance()函式中,當前pendinggovernance可以將自己授權為governance角色。
因此從邏輯上governance角色與pendinggovernance角色可以迴圈授權,且沒有任何event事件可以提醒投資者governance角色與pendinggovernance角色的變更。
此時,專案擁有者可以隨意設定擁有兩個角色的地址。

圖一:governance、pendinggovernance角色以及kprh設定函式setkeep3rhelper()

一旦擁有governance角色,擁有角色的地址可以利用圖一中1169行setkeep3rhelper()函式對當前kprh指向的keep3rhelper智慧合約進行修改。
修改之後圖二中1076行kprh.getquotelimit()的具體實現就也極有可能被修改,接下來會返回給呼叫該函式的keep3rv1合約不同的返回值。

圖二:對某個使用者keeper進行獎勵的函式workreceipt()

專案擁有者如果考慮發動攻擊,由於擁有governance角色,因此可以首先呼叫圖三中addkprcredit()函式。
在916行對某一個job(假設job的地址為addr_a, 被專案擁有者掌握)的地址給與任意數目的信用數目credit(假設給與的credit數目為credit_a, 關聯於addr_a)。
之後可以部署一個新的keep3rhelper智慧合約,然後在該智慧合約中的將getquotelimit方法定義為返回uint型別變數的最大值。
然後專案擁有者可以使用addr_a的地址來呼叫圖1中setkeep3rhelper()函式,將kprh值指向給定的keep3rhelper智慧合約。
最終呼叫圖二中workreceipt()函式,由於1076行程式碼由於kprh.getquotelimit()函式被指定返回最大值的緣故必定透過。
在1077行中由於專案擁有者使用addr_a的地址來進行的呼叫,其在該智慧合約中擁有的信用數目為credit_a,因此amount的數目可以為略小於credit_a的任意值。
當透過1077行之後,amount的獎勵數目被給與keeper的地址。
最終該keeper可以呼叫合同內部的erc20的轉移函式,將獲得的獎勵轉移到自己給定的地址中,完成攻擊行為。

圖三:對某個job增加信用數目credit的函式addkprcredit()

除了上文講述的中心化風險漏洞之外,圖四中的mint()允許為governance角色的地址鑄造任意數目的代幣。
由於governance角色的地址可以透過圖一中的setgovernance()函式以及acceptgovernance()進行設定。
也就代表著專案管理者只要擁有governanvce角色,即可以透過重設governance角色地址的方式,向任意地址鑄造任意數目的代幣。

圖四:允許governance角色隨意鑄造代幣的函式mint()

透過查詢etherscan上keep3rv1智慧合約的資料,圖五顯示keep3rv1擁有者地址為0x2d407ddb06311396fe14d4b49da5f0471447d45c。
同時,如圖六顯示,北京時間11月20日早11點governance角色的地址也為0x2d407ddb06311396fe14d4b49da5f0471447d45c。
可以得知專案擁有者擁有governance角色許可權,因此有許可權可以透過上述中心化漏洞進行攻擊並獲利。
圖五:keep3rv1智慧合約擁有者等相關資訊
圖六:governance角色地址


總結


區塊鏈作為時代顛覆性的核心技術,也已在各個領域得到了廣泛的應用,隱藏在收益和利好之下的安全隱患也不應被忽視。
安全審計現在已經是高質量專案的標配。
若專案沒有被審計,對於使用者來說,投資行為則要格外慎重;對於專案方來說,則需要準備好相關資料並尋找專業並且聲譽好的審計公司進行審計。
若專案被審計過,則需儘量瞭解審計公司背景以及其審計報告中的各項指標。
certik採用形式化驗證工具來證明智慧合約可靠性,公司內部審計專家將利用包括形式化驗證在內的多種軟體測試方法,結合一流的白帽駭客團隊提供專業滲透測試,從而確保專案從前端到智慧合約整體的安全性。
近期,有部分專案方假借certik的名義釋出不實審計報告。
首先,certik很感謝專案方對我們的認可。但專案方應對專案的發展負責,一份完整且符合安全標準的安全審計報告不可或缺,如您有審計需求,歡迎點選certik公眾號底部對話方塊,留言免費獲取諮詢及報價!
certik在此提示:任何與certik審計相關的訊息,請仔細甄別。切勿輕信相關不實內容,並請以certik官方或權威媒體釋出的訊息為準。


免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读