智能合約九大安全漏洞

在設(shè)計(jì)和開發(fā)智能合約時(shí),安全必須是重中之重。一旦智能合約部署到區(qū)塊鏈上,就很難甚至無(wú)法修補(bǔ),必須刪除、重新創(chuàng)建和重新部署。此外,一旦智能合約上鏈,任何人都可以訪問智能合約中的漏洞。

1.png

本文來(lái)自微信公眾號(hào)“GoUpSec”。

智能合約部署在區(qū)塊鏈上,例如以太坊或其他分布式賬本基礎(chǔ)設(shè)施,偵聽來(lái)自預(yù)言機(jī)(Oracle)的加密安全數(shù)據(jù)源的事件和更新。這些合同通常控制大量高價(jià)值數(shù)據(jù)的流動(dòng),例如轉(zhuǎn)移資金、提供服務(wù)和解鎖受保護(hù)的內(nèi)容,這使它們成為極具吸引力的攻擊目標(biāo)。

在設(shè)計(jì)和開發(fā)智能合約時(shí),安全必須是重中之重。一旦智能合約部署到區(qū)塊鏈上,就很難甚至無(wú)法修補(bǔ),必須刪除、重新創(chuàng)建和重新部署。此外,一旦智能合約上鏈,任何人都可以訪問智能合約中的漏洞。

在流行的智能合約平臺(tái)以太坊上部署用Solidity編寫的智能合約時(shí),開發(fā)團(tuán)隊(duì)需要特別注意以下九大安全漏洞(攻擊媒介):

一、重入攻擊

重入攻擊媒介的存在是因?yàn)镾olidity智能合約必須執(zhí)行:每一行代碼都必須在下一行代碼開始之前執(zhí)行。這意味著當(dāng)合約對(duì)另一個(gè)合約進(jìn)行外部調(diào)用時(shí),調(diào)用合約的執(zhí)行將暫停,直到調(diào)用返回。這使被調(diào)用的合約暫時(shí)控制接下來(lái)發(fā)生的事情,從而創(chuàng)造了無(wú)限循環(huán)的可能性。

例如,惡意合約可以遞歸回原始合約以提取資源,而無(wú)需等待第一次調(diào)用完成,因此在函數(shù)完成之前絕不能允許原始合約更新其余額。重入攻擊有多種形式,包括單功能、跨功能、交叉收縮和只讀重入攻擊。漏洞利用列表在GitHub上維護(hù)。

修復(fù)建議:

當(dāng)智能合約的代碼邏輯有缺陷時(shí),就會(huì)出現(xiàn)此漏洞。開發(fā)人員需要仔細(xì)設(shè)計(jì)外部調(diào)用,并始終檢查和更新合約的狀態(tài),例如在滿足發(fā)送資金的請(qǐng)求之前減少以太幣余額。添加重入防護(hù),可鎖定協(xié)定來(lái)防止一次執(zhí)行多個(gè)函數(shù)。使用各種審計(jì)工具,如Slither,Mythril和Securify,檢查是否存在不同類型的重入漏洞。

二、預(yù)言機(jī)操縱

智能合約通過預(yù)言機(jī)訪問和使用來(lái)自區(qū)塊鏈外部的數(shù)據(jù)。這使他們能夠與鏈下系統(tǒng)(如股票市場(chǎng))進(jìn)行交互。不正確的預(yù)言機(jī)數(shù)據(jù)可能會(huì)錯(cuò)誤地觸發(fā)智能合約的執(zhí)行,即所謂的“預(yù)言機(jī)問題”。許多去中心化金融應(yīng)用程序已被這種方法利用,攻擊者最喜歡的是閃電貸款攻擊。閃電貸款本質(zhì)上是無(wú)抵押貸款,只要在同一筆交易中償還貸款,就可以無(wú)限制借錢。攻擊者使用這些貸款來(lái)扭曲資產(chǎn)價(jià)格以產(chǎn)生利潤(rùn),同時(shí)仍然遵守區(qū)塊鏈的規(guī)則。

修復(fù)建議:

使用去中心化的預(yù)言機(jī),如Chainlink或Tellor,甚至多個(gè)預(yù)言機(jī),是確保合約收到準(zhǔn)確數(shù)據(jù)的最簡(jiǎn)單方法。此類預(yù)言機(jī)使攻擊者干擾數(shù)據(jù)變得更加困難和昂貴。

三、gasgriefing攻擊

要在以太坊區(qū)塊鏈平臺(tái)上執(zhí)行交易或執(zhí)行智能合約,用戶必須支付gas交易費(fèi),后者是為了激勵(lì)驗(yàn)證者(礦工)投入驗(yàn)證交易所需的資源。gas費(fèi)用價(jià)格由交易時(shí)的供應(yīng)、需求和網(wǎng)絡(luò)容量決定。

當(dāng)用戶發(fā)送執(zhí)行目標(biāo)智能合約所需的gas量但不足以執(zhí)行子調(diào)用時(shí),就會(huì)發(fā)生gasgrief——對(duì)其他合約進(jìn)行的調(diào)用。如果合約沒有檢查執(zhí)行子調(diào)用所需的gas是否可用,則子調(diào)用將無(wú)法按預(yù)期執(zhí)行。這可能會(huì)對(duì)應(yīng)用程序的邏輯產(chǎn)生重大影響。

修復(fù)建議:

目前沒有有效的技術(shù)來(lái)預(yù)防gasgriefing。開發(fā)人員所能做的就是對(duì)合約進(jìn)行編碼,設(shè)置要發(fā)送的gas量,而不是讓用戶來(lái)設(shè)置。然而,gas費(fèi)用的上升可能意味著交易失敗。

四、交易訂單依賴攻擊(搶先)

智能合約從待處理交易提交給網(wǎng)絡(luò)的那一刻起就是公開可見的。這使區(qū)塊的礦工能夠選擇具有最高gas費(fèi)用的交易。例如,用戶可以通過優(yōu)先費(fèi)–小費(fèi)–以激勵(lì)礦工將他們的交易優(yōu)先于同一區(qū)塊中的其他交易。然而,這也使攻擊者能夠觀察機(jī)會(huì),他們可以通過提交相同的合同來(lái)提前運(yùn)行有利可圖的合同,但gas費(fèi)用更高,因?yàn)榇祟惡贤髢?yōu)先被處理。由于這些攻擊必須在幾分之一秒內(nèi)實(shí)施,因此它們通常由機(jī)器人或礦工自己執(zhí)行。

修復(fù)建議:

這些攻擊很難避免。一種選擇是只接受gas價(jià)格低于預(yù)定閾值的交易?;蛘呤褂锰峤缓徒沂痉桨?,該方案涉及用戶首先提交解決方案哈希而不是明文解決方案,以便潛在的領(lǐng)跑者無(wú)法查看解決方案,直到為時(shí)已晚。各種智能合約審計(jì)工具可以檢測(cè)代碼是否引入了前端漏洞。

五、強(qiáng)制饋送攻擊

強(qiáng)制饋送攻擊利用了這樣一個(gè)事實(shí),即開發(fā)人員無(wú)法阻止智能合約接收以太坊的原生加密貨幣以太幣。這使得以太幣轉(zhuǎn)移到任何合約中變得容易–強(qiáng)制喂食它們–以改變它持有的以太幣的余額,從而操縱任何僅依賴于內(nèi)部會(huì)計(jì)預(yù)期余額的功能邏輯,例如如果余額增加超過一定水平,則支付獎(jiǎng)勵(lì)。

修復(fù)建議:

以這種方式阻止合約余額操縱是不可能的。合約的余額絕不應(yīng)用作函數(shù)中的檢查或保護(hù),因?yàn)閷?shí)際的以太幣余額可能高于合約內(nèi)部代碼預(yù)期的余額。

六、時(shí)間戳依賴性

時(shí)間戳值由執(zhí)行智能合約的節(jié)點(diǎn)生成。由于以太坊平臺(tái)的分布式性質(zhì),幾乎不可能保證每個(gè)節(jié)點(diǎn)上的時(shí)間正確同步。然后,節(jié)點(diǎn)可以操縱時(shí)間戳值,以針對(duì)依賴block.timestamp變量執(zhí)行時(shí)間關(guān)鍵型操作的任何合約進(jìn)行邏輯攻擊。

修復(fù)建議:

為避免此漏洞,開發(fā)人員不應(yīng)將block.timestamp函數(shù)用作控件或邏輯檢查,或用作隨機(jī)性源。

七、拒絕服務(wù)

與任何在線服務(wù)一樣,智能合約容易受到DoS攻擊。通過重載服務(wù)(如身份驗(yàn)證),攻擊者可以阻止其他合約執(zhí)行或生成意外的合約還原,例如,返回未使用的gas,并且所有狀態(tài)都恢復(fù)到交易開始執(zhí)行之前的狀態(tài)。這可能導(dǎo)致拍賣結(jié)果或金融交易中使用的價(jià)值縱以利于攻擊者。

修復(fù)建議:

使攻擊者付出高昂的代價(jià)是阻止它們的最佳方式。時(shí)間鎖定謎題和gas費(fèi)只是增加攻擊者成本的一些方法。確保僅調(diào)用受信任的合約還可以降低因DoS攻擊導(dǎo)致嚴(yán)重問題的可能性。

八、整數(shù)下溢和溢出

當(dāng)算術(shù)運(yùn)算的結(jié)果超出固定大小的值范圍時(shí),會(huì)發(fā)生整數(shù)下溢和溢出:對(duì)于整數(shù)類型uint0,則為255到8。大于255的值溢出并重置為0,而小于0的值重置為255。這會(huì)導(dǎo)致合約的狀態(tài)變量和邏輯發(fā)生意外更改,并觸發(fā)無(wú)效操作。

修復(fù)建議:

從版本0.8.0開始,Solidity編譯器不再允許可能導(dǎo)致整數(shù)下溢和溢出的代碼。檢查使用早期版本編譯的任何合約以獲取涉及算術(shù)運(yùn)算的函數(shù),或使用庫(kù)(如SafeMath)來(lái)檢查下溢和溢出問題。

九、信息和功能暴露

任何人都可以訪問區(qū)塊鏈。機(jī)密或敏感信息不應(yīng)保存到區(qū)塊鏈中,除非它被加密。智能合約中的變量和函數(shù)也可以被其他智能合約看到和訪問,這使得它們有可能被誤用或?yàn)E用。

修復(fù)建議:

開發(fā)人員應(yīng)始終實(shí)施適當(dāng)?shù)脑L問控制,并使用最小特權(quán)原則,通過使用Solidity的變量和函數(shù)可見性修飾符來(lái)根據(jù)需要分配最低級(jí)別的可見性,而不是更多。

智能合約漏洞的預(yù)防

智能合約代碼在部署后很難修補(bǔ)。開發(fā)團(tuán)隊(duì)從一開始就需要整合正確的安全性,嚴(yán)格測(cè)試其邏輯和代碼執(zhí)行,始終遵循智能合約安全最佳實(shí)踐。除非開發(fā)團(tuán)隊(duì)中有專門的智能合約安全專家,能對(duì)每個(gè)功能進(jìn)行單元測(cè)試來(lái)審核智能合約代碼的邏輯缺陷和其他漏洞,否則請(qǐng)用智能合約的專業(yè)審計(jì)服務(wù)來(lái)識(shí)別安全問題。

THEEND

最新評(píng)論(評(píng)論僅代表用戶觀點(diǎn))

更多
暫無(wú)評(píng)論