價格分析

首發| 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很感謝項目方對我們的認可。但項目方應對項目的發展負責,一份完整且符合安全標準的安全審計報告不可或缺,如您有審計需求,歡迎搜索微信【certikchina】關注CertiK官方微信公眾號,點擊公眾號底部對話框,留言免費獲取諮詢及報價!

CertiK在此提示:任何與CertiK審計相關的消息,請仔細甄別。切勿輕信相關不實內容,並請以CertiK官方或權威媒體發布的消息為準。