你可能聽(tīng)說(shuō)過(guò)區(qū)塊鏈初創(chuàng)企業(yè)Compound。他們基于以太坊創(chuàng)造了compound.finance,個(gè)人可以在該市場(chǎng)中出借所持有的 ETH,DAI,USDC 及一些其他ERC20數(shù)字資產(chǎn)并以此賺取利息。
Today, the interest rate offered to DAI lenders is 10%, which is high enough to turn EthHeads’ heads (see cover photo)。
如今,DAI出借方的利率是10%,足以讓 ETH 持有者側(cè)目。
作為SpankChain的CEO,管理包括近50萬(wàn)DAI的公司儲(chǔ)備是我的職責(zé)。如果不把我們的DAI放到Compound平臺(tái)上,按照10%的年利率,那么我們將每個(gè)月?lián)p失近 4000 美元。這是相當(dāng)大的一筆機(jī)會(huì)成本。但是投資需要牢記的是:天下沒(méi)有免費(fèi)的午餐。所有的投資都有風(fēng)險(xiǎn),在 Compound 平臺(tái)上放貸也不例外。
上個(gè)月,我花了一些時(shí)間對(duì)通過(guò) Compound 平臺(tái)放貸存在的幾類風(fēng)險(xiǎn)進(jìn)行了評(píng)估:
1. 智能合約安全風(fēng)險(xiǎn)
2. 中心化單點(diǎn)故障
3. 銀行擠兌風(fēng)險(xiǎn)
我將調(diào)查研究分成了以下幾類,但是在此之前首先需了解的最重要的事情是:
1. 智能合約安全近乎完全沒(méi)問(wèn)題。
2. Compound 是一個(gè)托管系統(tǒng),如果借貸池管理員的私鑰泄漏,則所有借貸池中的資產(chǎn)將都可能被盜走。
3. 在 Compound 上放貸不保證能隨時(shí)提取資產(chǎn)。如果您嘗試提取您的資產(chǎn),但是當(dāng)時(shí)所有資產(chǎn)都鎖定在未償還的貸款中,那么您的提款交易將失敗。
合約安全
已有多家知名的智能合約安全公司對(duì) Compound 進(jìn)行了審計(jì)。
OpenZeppelin 審計(jì)報(bào)告
Trail of Bits 審計(jì)報(bào)告
Certora 審計(jì)報(bào)告
此外,Compound 還為嚴(yán)重漏洞專門提供了上限為 25 萬(wàn)美元的懸賞(賞金為被盜資金的 1% 或者是凍結(jié)資金的10%),據(jù)我所知,目前還沒(méi)有獨(dú)立安全研究人員獲得這筆賞金。
該合約保存的資產(chǎn)至少有六個(gè)月超過(guò) 2000萬(wàn)美元,至少有兩個(gè)月超過(guò) 5000萬(wàn)美元,當(dāng)前該合約里保存的資產(chǎn)超過(guò) 1億美元。對(duì)我個(gè)人而言,合約安全最重要的指標(biāo)是 合約持有總資產(chǎn)×合約保存資產(chǎn)時(shí)間,到目前為止,Compound 的安全性已經(jīng)得到了大量公共資產(chǎn)的證明。
基于以上因素,我目前認(rèn)為 Compound 智能合約是安全的。
中心化單點(diǎn)故障
由于我自己并不是一名智能合約安全專家,因此我向 samczsun 尋求幫助——samczsun 以發(fā)現(xiàn)了 0x 合約中一個(gè)關(guān)鍵 bug 而出名(當(dāng)時(shí) 0x 合約已經(jīng)接受過(guò)頂級(jí)公司的多次審核) ,他也因此獲得了 10萬(wàn)美元的報(bào)酬。關(guān)于 Compound 的中心化單點(diǎn)故障(我關(guān)注的重點(diǎn)),他提供的報(bào)告如下:
Compound v2 有四種不同的管理職能,由三個(gè)地址分別承擔(dān):
· 每種 cToken 都有一個(gè)管理員。目前,所有 cToken 的管理員都被設(shè)置為 0x8B8592E9570E96166336603a1b4bd1E8Db20fa20
· 每種 cToken 都有一個(gè)監(jiān)察員(comptroller),目前都被設(shè)置為 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B。Unitroller 也有一個(gè)管理員,目前被設(shè)置為 0x8B8592E9570E96166336603a1b4bd1E8Db20fa20
· 當(dāng)前的價(jià)格預(yù)言機(jī)都有一個(gè)錨點(diǎn)管理員和一個(gè) poster,分別為設(shè)置為0xF06e41aDD8A7E7A8aD81a07C0ACA291E4573ca50 和 0x3c6809319201b978D821190Ba03fA19A3523BD96。
只要能獲得一種 cToken 的管理員資格,攻擊者就可以替換監(jiān)察員實(shí)現(xiàn),然后執(zhí)行以下一項(xiàng)或者多項(xiàng)操作:
· 通過(guò) transferAllowed 函數(shù)返回 false 防止轉(zhuǎn)移現(xiàn)有 cTokens
· 通過(guò) transferAllowed 函數(shù)返回 true 轉(zhuǎn)移作為抵押品的 cTokens
· 通過(guò) mintAllowed 函數(shù)返回 false 防止生成新的 cTokens
· 通過(guò) redeemAllowed 函數(shù)返回 false 防止贖回已有 cTokens
· 通過(guò) repayBorrowAllowed 函數(shù)返回 false 防止償還現(xiàn)有貸款
· 通過(guò) liquidateBorrowAllowed 函數(shù)返回 false 防止清算貸款
· 通過(guò) seizeAllowed 函數(shù)返回 true 竊取用戶 cTokens
· 通過(guò) borrowAllowed 函數(shù)返回 false 防止借入底層資產(chǎn)
· 通過(guò) borrowAllowed 函數(shù)返回 true 來(lái)吸干所有底層資產(chǎn)
通過(guò) cToken 的管理員資格,攻擊者還可以替換利率模型,從而實(shí)現(xiàn):
· 將借貸成本(即:塊利率)提升至 0.0005% /區(qū)塊
若能獲得 Unitroller 代理的管理員資格,攻擊者可以:
· 對(duì)于所有使用 Unitroller 的 cTokens (當(dāng)前是 100% 占比),通過(guò)替換 Unitroller 實(shí)現(xiàn)與替換 cToken 監(jiān)察員一樣的攻擊
· 通過(guò)更改清算激勵(lì)機(jī)制,在清算時(shí)獲得更多的代幣
· 通過(guò)更改價(jià)格預(yù)言機(jī),以低于實(shí)際的價(jià)格進(jìn)行 cTokens 借貸(例如:ETH、WBTC 等)
· 通過(guò)更改某種 cToken 的質(zhì)押信息,結(jié)合新增 cToken 以及更改價(jià)格預(yù)言機(jī)的能力,攻擊者可以通過(guò)他們創(chuàng)造的代幣進(jìn)行抵押借款,實(shí)現(xiàn)竊取系統(tǒng)全部資產(chǎn)。
若能獲得價(jià)格預(yù)言機(jī)的錨點(diǎn)管理員資格,攻擊者可以:
· 使得某一資產(chǎn)的價(jià)格偏離其真實(shí)價(jià)格的 10%
若能獲得價(jià)格預(yù)言機(jī)的 poster 資格,攻擊者可以:
· 每個(gè)小時(shí)都讓資產(chǎn)價(jià)格偏離其存儲(chǔ)價(jià)值的 10%
若能同時(shí)取得對(duì)價(jià)格預(yù)言機(jī)的管理員資格和 poster 資格,攻擊者就可以:
· 將資產(chǎn)價(jià)格設(shè)為任意值
總結(jié)一下 samczsun 的報(bào)告:Compound 合約被設(shè)計(jì)為可以通過(guò)中央管理員進(jìn)行適當(dāng)?shù)纳?jí)。最重要的合約是代理合約,其指向包含了邏輯實(shí)現(xiàn)的邏輯合約地址,管理員擁有隨意修改地址指針的權(quán)利。由于所有的 cTokens 使用相同的管理員 ,如果管理員私鑰泄露了,那么所有質(zhì)押在 Compound 中的資產(chǎn)都可以被輕松竊取。
sam 的報(bào)告中也提到了一些更為狡猾的攻擊,如果攻擊者有這樣的機(jī)會(huì)——比起實(shí)施更為復(fù)雜的攻擊,這樣可以更快的卷走所有錢。
OpenZeppelin 在他們的 Compound 審計(jì)概要中進(jìn)行了有效總結(jié)。
然而,惡意管理員或者被竊取私鑰的管理員手中擁有凍結(jié)市場(chǎng)、審查交易甚至從系統(tǒng)中竊取全部資產(chǎn)的能力。類似地,控制資產(chǎn)價(jià)格預(yù)言機(jī)即便不能竊取系統(tǒng)的全部資產(chǎn),也可以竊取大部分。當(dāng)前,所有實(shí)時(shí)市場(chǎng)的管理員都是同一個(gè)外部賬戶。
但是有趣的是, Trail of Bits 團(tuán)隊(duì)沒(méi)有在任何相關(guān)材料中提及這一點(diǎn)。此外,Compound 的 FAQ 還低估了管理員特權(quán),并沒(méi)有提供任何關(guān)于管理員有可能竊取所有資產(chǎn)的警告:
協(xié)議的開(kāi)發(fā)者 Compound Lab,Inc,目前控制著以太坊地址:0x8b8592e9570e96166336603a1b4bd1e8db20fa20 ,即管理員地址。管理員地址擁有新增資產(chǎn)、更新價(jià)格預(yù)言機(jī)、更新利率模型以及更新協(xié)議風(fēng)險(xiǎn)模型的權(quán)利。
另一件需要注意的事情是, Compound 當(dāng)前的托管設(shè)置本身并不會(huì)導(dǎo)致系統(tǒng)的不安全。他們會(huì)極力維護(hù)管理員密鑰安全,并且很有可能(希望如此)他們正在與 820 萬(wàn)美元種子輪融資可以買到的最好的托管供應(yīng)商合作。不過(guò)毫無(wú)疑問(wèn),在決定存入 50 萬(wàn) DAI 時(shí),我會(huì)將這一點(diǎn)放在心上。
銀行擠兌風(fēng)險(xiǎn)
Dharma 首席運(yùn)營(yíng)官之前的的這條關(guān)于競(jìng)爭(zhēng)性貸款平臺(tái)的推特,帶我打開(kāi)了新世界的大門,讓我明白了 Compound 這類平臺(tái)的銀行擠兌風(fēng)險(xiǎn)。
上述推特中顯示的利用率高達(dá) 98.62%,這意味著在當(dāng)時(shí),出借方存儲(chǔ)的 98.62% 的 DAI 都已經(jīng)借出。只有 1.38% 的 DAI 還可取出,所以,在當(dāng)時(shí),只有相當(dāng)小一部分出借方可以隨自己心愿收回其存入的 DAI。
如果有足夠多的 DAI 債權(quán)方(cDAI 持有者)在同一時(shí)刻想要收回他們存入的 DAI,他們的提款操作將耗盡所有可用 DAI,并使得 DAI 利用率提升至 100%,從而阻止進(jìn)一步的提款操作。試圖提款的出借方將只能看到交易失敗,并且不得不等到更多的借款方歸還貸款后才能進(jìn)行提款。
由于存在 cDAI 提款卡殼的可能性,人們將會(huì)對(duì)此有所顧慮,并且他們的擔(dān)憂可能會(huì)自我實(shí)現(xiàn)。就是說(shuō),當(dāng)一部分 cDAI 持有者試圖一次取出其存入的全部 DAI 時(shí),銀行擠兌將有可能發(fā)生,因?yàn)橛泻芏?cDAI 持有者都擔(dān)心這種情況的發(fā)生。
陷入 cDAI 銀行擠兌的出借方可以選擇等之后再取出其 DAI,也可以通過(guò)出售 cDAI 以獲得 DAI,但是這樣會(huì)產(chǎn)生手續(xù)費(fèi),而且,如果有許多其他出借方也在出售 cDAI ,那么價(jià)格可能會(huì)更差。 如果出借方選擇等待危機(jī)結(jié)束并繼續(xù)持有 cDAI,在此期間他們?nèi)钥梢韵硎艿匠鼋栀Y金所得的利息。
Compound 是如何解決這個(gè)問(wèn)題的?
Compound 團(tuán)隊(duì)對(duì)這種流動(dòng)風(fēng)險(xiǎn)的處理都很直接,他們?cè)诎灼?shū)中進(jìn)行了相關(guān)介紹:
該協(xié)議不保證流動(dòng)性;相反,它依靠利率模型進(jìn)行激勵(lì)。在資產(chǎn)需求極度旺盛的的時(shí)期,協(xié)議的流動(dòng)性(可用于提款或出借的代幣)將減少;在這種情況下,利率會(huì)上升,從而刺激供應(yīng)并抑制借貸。
Compound 基于 cToken 特定的 “利率合約” 為每種 cToken 確定借款人的利率。該合約目前實(shí)現(xiàn)了 cDAI 的利率模型。公式為:
借款人年利率 = 基本利率 +(乘數(shù) * 利用率)
對(duì)于 cDAI 而言,基本利率 = 5%, 乘數(shù) = 15%(這些值都被硬編碼到了合約中)。利用率 為 100% 時(shí),借款人支付的利息為20%。這意味著當(dāng) DAI 利用率最大時(shí),借款人的資金成本也只是 20%——因此,如果他們相信 ETH(貸款抵押品)這一年的漲幅會(huì)超過(guò) 20% 的話,他們就沒(méi)有動(dòng)力償還貸款。 這可能會(huì)導(dǎo)致很多 cDAI 持有者在很長(zhǎng)一段時(shí)間內(nèi)還將繼續(xù)持有 cDA。
Compound 唯一能處理這一問(wèn)題的工具就是使用中心化管理員升級(jí)利率模型,這就是 6 周前,利用率升到 99% 時(shí)他們所采用的方案(與上面引用的推文屬同一時(shí)期)。
綜上所述,利用率達(dá)到最大時(shí)存在流動(dòng)性危機(jī)以及迫在眉睫的銀行擠兌風(fēng)險(xiǎn),而出借方唯一能做的事就是希望 Compound 使用管理員特權(quán)更新并且增加利率,從而激勵(lì)借款方償還貸款進(jìn)一步提高想要退出的出借方所需的流動(dòng)性。
結(jié)論
像 Compound 這樣的協(xié)議在中心化和去中心化中保持著微妙的平衡,它需要權(quán)衡快速升級(jí)的能力和由此必然引入的中心化單點(diǎn)故障。
我不覺(jué)得 Compound 選擇中心化的方式引導(dǎo)其產(chǎn)品是錯(cuò)的(因?yàn)檫@種方式顯然是有效的,要不然我也不會(huì)寫(xiě)這篇文章),但是我確實(shí)希望智能合約中包含 1000 萬(wàn)~1 億美元的項(xiàng)目能夠按照最高標(biāo)準(zhǔn)進(jìn)行,尤其是在向用戶傳達(dá)風(fēng)險(xiǎn)和提供警告方面。
基本上,我們應(yīng)該支持、鼓勵(lì)項(xiàng)目做與 Robert Leshner(Compound 的首席執(zhí)行官)相反的事情:
中心化在技術(shù)上可能是正確的,但是我們都知道攻陷管理員的辦法有很多。..
現(xiàn)在我依舊沒(méi)有想好是否要將我管理的 DAI 存儲(chǔ)到 Compound 中。可能我會(huì)先用 10 萬(wàn)個(gè) DAI 試試水?會(huì)出什么問(wèn)題呢。..In Compound We Trust!
來(lái)源: 以太坊愛(ài)好者?
評(píng)論
查看更多