背景
區(qū)塊鏈技術(shù)正在改變各行各業(yè)的游戲規(guī)則,而智能合約是這一進(jìn)程的關(guān)鍵部分。智能合約通過(guò)消除第三方中介機(jī)構(gòu)來(lái)確保各方之間的信任,有助于降低成本,同時(shí)也增加透明度。如果你要寫一個(gè)智能合約,關(guān)鍵是你要對(duì)代碼進(jìn)行審計(jì),以確保它能正常工作--而且不會(huì)有任何錯(cuò)誤或安全漏洞。本指南將引導(dǎo)你了解審計(jì)智能合約的基礎(chǔ)知識(shí)和一些常見的智能合約漏洞。
第 1 部分:為什么要審計(jì)你的智能合約?
智能合約之所以重要,有很多原因。它們可以幫助你實(shí)現(xiàn)業(yè)務(wù)流程的自動(dòng)化,使其更有效率,從而節(jié)省時(shí)間和金錢。但它如此受歡迎的最大原因是,通過(guò)移除人為錯(cuò)誤從來(lái)減少欺詐的風(fēng)險(xiǎn)。然而,這些好處是有代價(jià)的:開發(fā)智能合約時(shí)很容易犯錯(cuò)。一個(gè)有缺陷的代碼庫(kù)可能會(huì)導(dǎo)致你的整個(gè)系統(tǒng)崩潰,甚至容易受到黑客的攻擊!你可能聽說(shuō)過(guò)關(guān)于黑客攻擊的事件。你可能聽說(shuō)過(guò)基于以太坊的代幣被黑的事情。這些黑客是由于智能合約中的漏洞導(dǎo)致的,這使得黑客可以竊取存儲(chǔ)在這些合約中價(jià)值數(shù)百萬(wàn)美元的加密貨幣。
第二部分:如何開始審計(jì)
在你開始審計(jì)之前,你應(yīng)該首先進(jìn)行一次安全 review。以便識(shí)別出智能合約中的任何問(wèn)題和漏洞。
下一步是了解合約的商業(yè)邏輯,你應(yīng)該了解為什么要?jiǎng)?chuàng)建它,它為用戶解決了什么問(wèn)題,以及它如何與區(qū)塊鏈上的其他合約一起工作。
之后是技術(shù)架構(gòu)分析:查看所有參與編寫和部署這段代碼的部分,以及了解它們是如何在 Solidity 等編程語(yǔ)言中實(shí)現(xiàn)的。
最后,進(jìn)行威脅建模(threat modelling ),查看一下不同的參與方(用戶/終端用戶)如何與系統(tǒng)交互。
第 3 部分:智能合約審計(jì)的不同階段
智能合約審計(jì)的不同階段包括:
確定審計(jì)的目標(biāo)和目的:
這一步你要設(shè)定智能合約審計(jì)的目標(biāo)和目的。
確定審計(jì)的范圍:
在這一步,你收集包括在審計(jì)范圍內(nèi)的所有資產(chǎn),以確保沒有任何遺漏。
審計(jì)計(jì)劃:
審計(jì)的一個(gè)重要階段是計(jì)劃,這可以使審計(jì)工作有效地完成。
進(jìn)行審計(jì):
真正的工作,試圖在智能合約的代碼中找到漏洞。
撰寫審計(jì)報(bào)告:
現(xiàn)在你所有的辛勤工作都結(jié)束了,是時(shí)候把你在審計(jì)過(guò)程中發(fā)現(xiàn)的情況寫成報(bào)告了。
第 4 部分:測(cè)試的一般情況
有許多不同類型的測(cè)試,但最重要的是要記住,你不應(yīng)該相信你沒有測(cè)試過(guò)的代碼。你可以通過(guò)多種方式測(cè)試你的智能合約代碼,包括:
-
在沙盒環(huán)境中測(cè)試(如 Remix)
-
在測(cè)試網(wǎng)(如 Rinkeby)上進(jìn)行測(cè)試
-
專門為測(cè)試目的設(shè)計(jì)的私有區(qū)塊鏈網(wǎng)絡(luò)(如 Ganache)
第 5 部分:基本安全考慮
作為一個(gè)智能合約的開發(fā)者,你有責(zé)任確保代碼安全。這是你能保證你的用戶的資金安全的唯一方法。
為了確保適當(dāng)?shù)陌踩幸恍┗咀龇ū仨氉裱?。這些包括:
-
使用安全的編碼做法
-
使用安全的開發(fā)環(huán)境
第 6 部分:常見的以太坊漏洞
以太坊智能合約容易受到一些黑客和攻擊。最常見的漏洞是:
-
可重入:這是指惡意合約可以多次調(diào)用另一個(gè)合約,耗盡受害者合約的資源。
-
整數(shù)溢出/下溢:這是一個(gè)算術(shù)運(yùn)算的結(jié)果,其數(shù)值超出了預(yù)期范圍。這可以被利用來(lái)發(fā)送比預(yù)期多或少的 ETH。
-
依賴時(shí)間戳:這是指合約依靠當(dāng)前的時(shí)間戳來(lái)確定某些條件。這可以被利用來(lái)操縱合約的狀態(tài)。
我們將在以下幾點(diǎn)討論一些常見的漏洞。你也可以查看我的其他文章,了解更多關(guān)于可重入和整數(shù)溢出/下溢漏洞的信息。
第 7 部分:存儲(chǔ)變量漏洞
以太坊智能合約中最常見的安全漏洞之一是使用不安全的存儲(chǔ)變量。這些變量可用于存儲(chǔ)敏感信息,如私鑰和密碼,如果沒有得到適當(dāng)?shù)谋Wo(hù),這些信息很容易被泄露。
有幾種不同的方法來(lái)保護(hù)存儲(chǔ)變量,例如使用像 SafeMath 這樣的庫(kù)(0.8 之后 Solidity 內(nèi)置了 SafeMath),它可以確保所有的數(shù)學(xué)操作都以安全的方式進(jìn)行。
其他方法包括使用硬件安全模塊(HSM)來(lái)存儲(chǔ)變量,或使用多簽名錢包來(lái)保護(hù)私鑰。防止存儲(chǔ)漏洞的最佳方法是使用這些方法的組合,因?yàn)槊糠N方法都有自己的優(yōu)勢(shì)和弱點(diǎn)。通過(guò)使用多層安全保護(hù),攻擊者要破壞智能合約中存儲(chǔ)的數(shù)據(jù)就更難了。
第 8 部分:誤用轉(zhuǎn)賬和發(fā)送
談到智能合約,為了避免任何誤用,有幾件關(guān)鍵的事情需要記住。首先,最重要的是要記住,智能合約是不可改變的。這意味著,一旦他們被部署,他們就不能被改變。因此,在部署之前,對(duì)你的代碼進(jìn)行雙重檢查和三重檢查是至關(guān)重要的。
一個(gè)可能導(dǎo)致誤用智能合約的常見錯(cuò)誤是混淆了 transfer 和 send 功能。這兩個(gè)函數(shù)看起來(lái)很相似,但它們實(shí)際上作用不同。transfer 可用與轉(zhuǎn)移所有權(quán),而 send 功能是用來(lái)發(fā)送資產(chǎn)。
簡(jiǎn)而言之,誤用智能合約會(huì)產(chǎn)生嚴(yán)重的后果。在部署你的代碼之前,一定要仔細(xì)檢查,并確保你了解 transfer 和 send 功能之間的區(qū)別。
第 9 部分:函數(shù)可見性漏洞
談到智能合約中函數(shù)的可見性,主要有兩種類型的漏洞可能發(fā)生。第一種類型的漏洞是不應(yīng)該被公開 public 的函數(shù)被標(biāo)記為 public 。如果函數(shù)沒有被正確地標(biāo)記為私有(private),或者可見性被意外地設(shè)置為公開(public),就會(huì)發(fā)生這種情況。這種類型的漏洞可以被任何能夠訪問(wèn)合約的人利用,并可能導(dǎo)致合約被破壞。
第二種類型的漏洞是當(dāng)一個(gè)函數(shù)在不應(yīng)該是私有的情況下被變成了私有。如果可見性被意外地設(shè)置為私有,或者沒有被正確地標(biāo)記為公共,就會(huì)發(fā)生這種情況。這種類型的漏洞可以被任何能夠訪問(wèn)合約的人所利用,并可能導(dǎo)致合約被破壞。
第 10 部分:整數(shù)算術(shù)錯(cuò)誤
當(dāng)你在編寫智能合約時(shí),一定要注意整數(shù)算術(shù)錯(cuò)誤。當(dāng)你用過(guò)大或過(guò)小的整數(shù)進(jìn)行計(jì)算時(shí),這些錯(cuò)誤就會(huì)發(fā)生。
例如,假設(shè)你試圖計(jì)算一個(gè)智能合約中所有代幣的總價(jià)值。每個(gè)代幣的價(jià)值被存儲(chǔ)為一個(gè)整數(shù)。如果合約中的代幣超過(guò) 2,147,483,647 個(gè),那么總價(jià)值將太大,無(wú)法使用一個(gè)整數(shù)變量完整表示。這將導(dǎo)致一個(gè)錯(cuò)誤。
為了避免這種情況,你可以使用一個(gè)像 SafeMath 這樣的庫(kù)(0.8 之后 Solidity 內(nèi)置了 SafeMath),它可以幫助你安全地進(jìn)行整數(shù)運(yùn)算。
第 11 部分:循環(huán)和遞歸的漏洞
正如我們所看到的,循環(huán)和遞歸可以在編程中發(fā)揮巨大的作用。然而,它們也可以被濫用來(lái)制造漏洞。
這方面的一個(gè)例子是所謂的 "無(wú)限循環(huán)"。這是指一個(gè)程序被卡在一個(gè)循環(huán)中,而且永遠(yuǎn)無(wú)法退出。這可能導(dǎo)致程序崩潰,或者更糟糕的是,它會(huì)消耗所運(yùn)行的系統(tǒng)的所有資源,造成拒絕服務(wù)攻擊。這對(duì)智能合約來(lái)說(shuō)是不利的,因?yàn)樗赡軐?dǎo)致用戶虧損。
另一個(gè)例子是當(dāng)一個(gè)程序遞歸太深時(shí)。這也可能導(dǎo)致崩潰,或者導(dǎo)致程序耗盡內(nèi)存而被迫終止。
這兩個(gè)漏洞都可以被攻擊者利用,給系統(tǒng)或其用戶造成問(wèn)題。因此,意識(shí)到它們并采取措施防止它們被利用是很重要的。
第 12 部分:預(yù)防、檢測(cè)、緩解和補(bǔ)救。
預(yù)防:預(yù)防智能合約問(wèn)題的最好方法是有一個(gè)徹底和完整的測(cè)試過(guò)程。這應(yīng)該包括合約代碼的單元測(cè)試,以及合約在預(yù)定環(huán)境中的功能測(cè)試。同樣重要的是,為合約制定一個(gè)清晰明確的規(guī)范,以便所有相關(guān)方都能準(zhǔn)確理解合約應(yīng)該做什么。
檢測(cè):智能合約的問(wèn)題通??梢酝ㄟ^(guò)監(jiān)測(cè)合約的性能并將其與預(yù)期行為進(jìn)行比較來(lái)檢測(cè)。如果有任何差異,這可能表明合約有問(wèn)題。也可以使用靜態(tài)分析工具來(lái)檢查合約代碼中的錯(cuò)誤或潛在的漏洞。
緩解:如果在智能合約中發(fā)現(xiàn)問(wèn)題,必須采取措施緩解問(wèn)題。這可能涉及改變合約代碼以修復(fù)問(wèn)題,也可能涉及改變合約的使用方式。例如,如果一個(gè)合約被發(fā)現(xiàn)容易受到某種特定的攻擊,可能會(huì)通過(guò)改變合約的使用方式來(lái)緩解問(wèn)題,從而使攻擊不再可能。
補(bǔ)救:如果一個(gè)問(wèn)題不能被緩解,那么可能有必要采取措施來(lái)補(bǔ)救這個(gè)問(wèn)題。這可能涉及到用一個(gè)沒有同樣問(wèn)題的新版本來(lái)替換合約,或者可能涉及到從使用中完全刪除合約。
第 13 部分:用于檢測(cè)漏洞的自動(dòng)工具
隨著智能合約的普及,對(duì)能夠掃描這些合約漏洞的自動(dòng)化工具的需求也在不斷增加。
目前有許多不同的自動(dòng)化漏洞掃描器,每個(gè)都有自己的優(yōu)勢(shì)和不足:
Mythril是一個(gè)流行的選擇,它使用 symbolic 執(zhí)行來(lái)分析合約并找到潛在的漏洞。
Oyente是另一個(gè)流行的選擇,它使用靜態(tài)分析來(lái)尋找潛在的問(wèn)題。
Securify是一個(gè)較新的工具,它使用靜態(tài)和動(dòng)態(tài)分析的組合來(lái)尋找漏洞。
這些掃描器并不總是 100%準(zhǔn)確的,所以自己進(jìn)行測(cè)試和人工審查是很重要的。
智能合約黑客/審計(jì)的資源
視頻:
https://www.youtube.com/watch?v=LLiJK_VeAvQ 審計(jì)智能合約--以太坊應(yīng)用程序的安全審查
https://www.youtube.com/watch?v=DkVpUqzU8SI 了解如何審計(jì)以太坊智能合約--由 bloctrax 介紹
https://www.youtube.com/watch?v=WchXkMlKj9w[5]BHIS | 區(qū)塊鏈安全和智能合約審計(jì)入門
https://www.youtube.com/watch?v=qRznPHUFCLA 智能合約 101--如何審計(jì) NFT 項(xiàng)目
https://www.youtube.com/watch?v=PTE1Hcqup_M 高級(jí)智能合約安全和審計(jì)工具
https://www.youtube.com/watch?v=0aJfCug1zTM 智能合約安全和審計(jì) 101
https://www.youtube.com/watch?v=R1eZCmR91vQ 如何查找 Solidity 漏洞
https://www.youtube.com/watch?v=IOUnhCTw6tE 高級(jí)智能合約黑客攻擊
學(xué)習(xí)攻擊
https://consensys.github.io/smart-contract-best-practices/known_attacks/
https://www.youtube.com/watch?v=apCGPh7tKhw
https://www.youtube.com/watch?v=R1eZCmR91vQ
https://swcregistry.io/
用于練習(xí)
https://www.damnvulnerabledefi.xyz/index.html
https://ethernaut.openzeppelin.com/
一個(gè)路線圖:
https://github.com/razzorsec/AuditorsRoadmap
awesome-ethereum-security:
https://github.com/crytic/awesome-ethereum-security
結(jié)論
本文提供了一份關(guān)于審計(jì)智能合約的指南。通過(guò)了解審計(jì)過(guò)程,你可以更好地準(zhǔn)備識(shí)別和糾正合約中的潛在漏洞。
原文:https://medium.com/coinmonks/the-ultimate-smart-contract-auditing-guide-ddec6e78e7dc
參考資料
[1]?登鏈翻譯計(jì)劃:?https://github.com/lbc-team/Pioneer
[2]?翻譯小組:?https://learnblockchain.cn/people/412
[3]?Tiny 熊:?https://learnblockchain.cn/people/15
[4]?Unsplash:?https://unsplash.com/es/@michael_f?utm_source=medium&utm_medium=referral文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-723685.html
[5]?https://www.youtube.com/watch?v=WchXkMlKj9w:?https://www.youtube.com/watch?v=WchXkMlKj9w&t=12s文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-723685.html
到了這里,關(guān)于【區(qū)塊鏈 | 審計(jì)】智能合約審計(jì)指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!