WF曲速未來:Solidity安全之默認(rèn)可見性(Visibility)區(qū)塊鏈
WF曲速區(qū):Soildity作為編寫智能合約的語言,已經(jīng)被廣泛的應(yīng)用。但同時(shí),開發(fā)者和用戶也得到了慘痛的教訓(xùn),智能合約的安全問題層出不窮。因此,我們總結(jié)了一些常見的Solidity安全問題。前車之鑒,后車之師,希望后來者能有所警惕。
Soildity作為編寫智能合約的語言,已經(jīng)被廣泛的應(yīng)用。但同時(shí),開發(fā)者和用戶也得到了慘痛的教訓(xùn),智能合約的安全問題層出不窮。因此,我們總結(jié)了一些常見的Solidity安全問題。前車之鑒,后車之師,希望后來者能有所警惕。
默認(rèn)可見性(Visibility)
Solidity有兩種函數(shù)調(diào)用方式,一種是內(nèi)部調(diào)用,不會創(chuàng)建一個(gè)EVM調(diào)用(也叫做消息調(diào)用),另一種則是外部調(diào)用,會創(chuàng)建EVM調(diào)用(會發(fā)起消息調(diào)用)。其中的函數(shù)具有可見性說明符,它們會指定我們可以如何調(diào)用函數(shù)??梢娦詻Q定一個(gè)函數(shù)是否可以由用戶或其他派生契約在外部調(diào)用、只允許內(nèi)部調(diào)用或只允許外部調(diào)用。Solidity對函數(shù)和狀態(tài)變量提供了四種可見性。分別是external,public,internal,private。為允許用戶從外部調(diào)用函數(shù),其中函數(shù)默認(rèn)可見性默認(rèn)為public。而本文將介紹的是可見性說明符的不正確使用會導(dǎo)致智能合約中的一些資金流失的問題。
代碼分析
函數(shù)的可見性默認(rèn)是 public。因此,不指定任何可見性的函數(shù)就可以由用戶在外部調(diào)用。當(dāng)開發(fā)人員錯(cuò)誤地忽略應(yīng)該是私有的功能(或只能在合約本身內(nèi)調(diào)用)的可見性說明符時(shí),問題就出現(xiàn)了。
讓我們看一個(gè)簡單的例子。
這個(gè)簡單的合約被設(shè)計(jì)為充當(dāng)賞金猜測游戲的地址。要贏得該合約的余額,用戶必須生成一個(gè)以太坊地址,其最后 8 個(gè)十六進(jìn)制字符為0。一旦獲得,他們可以調(diào)用 WithdrawWinnings() 函數(shù)來獲得賞金。不幸的是,這些功能的可見性沒有得到指定。特別是,因?yàn)開sendWinnings() 函數(shù)的可見性是 public,任何地址都可以調(diào)用該函數(shù)來竊取賞金。
相關(guān)事件
我們昨天在前一篇介紹Delegatecall函數(shù)濫用問題中引用了Parity錢包被黑事件,默認(rèn)可見性也是攻擊者在這次事件中利用的漏洞之一。接下來我們詳細(xì)的分析攻擊者的利用過程:
先看看Parity錢包的合約,有兩個(gè),其一是庫合約,第二是錢包合約。
庫合約包含初始化錢包的代碼,如以下代碼片段所示
在合約中,initWallet() 與initMultiowned()兩個(gè)函數(shù)的可見性都默認(rèn)為 public 。錢包構(gòu)造函數(shù)會調(diào)用 initWallet() 函數(shù),并設(shè)置多簽名錢包的所有者,如 initMultiowned() 函數(shù)中所示。由于這些函數(shù)意外地設(shè)置為 public,攻擊者可以在部署的合約上調(diào)用這些功能,并將所有權(quán)重置為攻擊者地址。作為主人,襲擊者隨后取走錢包中所有的 Ether,損失高達(dá) 3100 萬美元。
區(qū)塊鏈安全公司W(wǎng)F曲速未來 觀點(diǎn):
指定合約中所有功能的可見性、即便這些函數(shù)的可見性本就有意設(shè)計(jì)成 public,這是一種很好的做法。最近版本的 Solidity 將在編譯過程中為沒有明確設(shè)置可見性的函數(shù)顯示警告,以鼓勵這種做法。所以人們在編寫智能合約時(shí)應(yīng)注意函數(shù)可見性說明符的正確使用。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。