時間:2023-08-25|瀏覽:237
在此,CertiK鄭重聲明:CertiK團隊從未對"Keep3rLink"項目進行過任何審計。
同日,CertiK安全研究團隊發(fā)現(xiàn)Keep3r項目存在中心化安全風(fēng)險。項目擁有者擁有過大權(quán)限,可將允許獎勵的限制提高,從而可以向任意參與者發(fā)送任意數(shù)額的獎勵且可向任意地址鑄造任意數(shù)目代幣。
項目風(fēng)險及相關(guān)細(xì)節(jié):
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函數(shù)允許當(dāng)前governance角色將pendingGovernance角色設(shè)定為任意給定地址_governance。同時在1186行acceptGovernance函數(shù)中,當(dāng)前pendingGovernance可以將自己授權(quán)為governance角色。因此從邏輯上governance角色與pendingGovernance角色可以循環(huán)授權(quán),且沒有任何event事件可以提醒投資者governance角色與pendingGovernance角色的變更。此時,項目擁有者可以隨意設(shè)置擁有兩個角色的地址。
圖一:governance、pendingGovernance角色以及KPRH設(shè)置函數(shù)setKeep3rHelper
一旦擁有g(shù)overnance角色,擁有角色的地址可以利用圖一中1169行setKeep3rHelper函數(shù)對當(dāng)前KPRH指向的Keep3rHelper智能合約進行修改。修改之后圖二中1076行KPRH.getQuoteLimit的具體實現(xiàn)就也極有可能被修改,接下來會返回給調(diào)用該函數(shù)的Keep3rV1合約不同的返回值。
圖二:對某個用戶keeper進行獎勵的函數(shù)workReceipt
項目擁有者如果考慮發(fā)動攻擊,由于擁有g(shù)overnance角色,因此可以首先調(diào)用圖三中addKPRCredit函數(shù)。在916行對某一個job(假設(shè)job的地址為ADDR_A,被項目擁有者掌握)的地址給與任意數(shù)目的信用數(shù)目credit(假設(shè)給與的credit數(shù)目為CREDIT_A,關(guān)聯(lián)于ADDR_A)。之后可以部署一個新的Keep3rHelper智能合約,然后在該智能合約中的將getQuoteLimit方法定義為返回uint類型變量的最大值。然后項目擁有者可以使用ADDR_A的地址來調(diào)用圖1中setKeep3rHelper函數(shù),將KPRH值指向給定的Keep3rHelper智能合約。最終調(diào)用圖二中workReceipt函數(shù),由于1076行代碼由于KPRH.getQuoteLimit函數(shù)被指定返回最大值的緣故必定通過。在1077行中由于項目擁有者使用ADDR_A的地址來進行的調(diào)用,其在該智能合約中擁有的信用數(shù)目為CREDIT_A,因此amount的數(shù)目可以為略小于CREDIT_A的任意值。當(dāng)通過1077行之后,amount的獎勵數(shù)目被給與keeper的地址。最終該keeper可以調(diào)用合同內(nèi)部的ERC20的轉(zhuǎn)移函數(shù),將獲得的獎勵轉(zhuǎn)移到自己給定的地址中,完成攻擊行為。
圖三:對某個job增加信用數(shù)目credit的函數(shù)addKPRCredit
除了上文講述的中心化風(fēng)險漏洞之外,圖四中的mint允許為governance角色的地址鑄造任意數(shù)目的代幣。由于governance角色的地址可以通過圖一中的setGovernance函數(shù)以及acceptGovernance進行設(shè)置。也就代表著項目管理者只要擁有g(shù)overnance角色,即可以通過重設(shè)governance角色地址的方式,向任意地址鑄造任意數(shù)目的代幣。
圖四:允許governance角色隨意鑄造代幣的函數(shù)mint
通過查詢etherscan上Keep3rV1智能合約的數(shù)據(jù),圖五顯示Keep3rV1擁有者地址為0x2d407ddb06311396fe14d4b49da5f0471447d45c。同時,如圖六顯示,北京時間11月20日早11點governance角色的地址也為0x2d407ddb06311396fe14d4b49da5f0471447d45c??梢缘弥椖繐碛姓邠碛術(shù)overnance角色權(quán)限,因此有權(quán)限可以通過上述中心化漏洞進行攻擊并獲利。
圖五:Keep3rV1智能合約擁有者等相關(guān)信息
圖六:governance角色地址
總結(jié) 區(qū)塊鏈也已在各個領(lǐng)域得到了廣泛的應(yīng)用,隱藏在收益和利好之下的安全隱患也不應(yīng)被忽視。安全審計現(xiàn)在已經(jīng)是高質(zhì)量項目的標(biāo)配。若項目沒有被審計,對于用戶來說,投資行為則要格外慎重;對于項目方來說,則需要準(zhǔn)備好相關(guān)資料并尋找專業(yè)并且聲譽好的審計公司進行審計。若項目被審計過,則需盡量了解審計公司背景以及其審計報告中的各項指標(biāo)。
CertiK采用形式化驗證工具來證明智能合約可靠性,公司內(nèi)部審計專家將利用包括形式化驗證在內(nèi)的多種軟件測試方法,結(jié)合一流的白帽黑客團隊提供專業(yè)滲透測試,從而確保項目從前端到智能合約整體的安全性。
近期,有部分項目方假借CertiK的名義發(fā)布不實審計報告。CertiK在此提示:任何與CertiK審計相關(guān)的消息,請仔細(xì)甄別。切勿輕信相關(guān)不實內(nèi)容,并請以CertiK官方或權(quán)威媒體發(fā)布的消息為準(zhǔn)。