原文標(biāo)題:《關(guān)于去中心化金融(DeFi)區(qū)塊鏈智能合約漏洞的探索》
區(qū)塊鏈?zhǔn)且环N新型的分布式系統(tǒng)體系,它使用 P2P 對(duì)等網(wǎng)絡(luò)通信,區(qū)塊存儲(chǔ),分布式算法共識(shí)和加密算法來(lái)防止篡改。從本質(zhì)上講,區(qū)塊鏈可以看作是由所有網(wǎng)絡(luò)節(jié)點(diǎn)共同維護(hù)的分布式數(shù)據(jù)庫(kù)。與傳統(tǒng)的分布式數(shù)據(jù)庫(kù)相比,區(qū)塊鏈由于具有完整的數(shù)據(jù)備份,開(kāi)放透明的網(wǎng)絡(luò),無(wú)法篡改,完整的信息可追溯性和弱信任模型,因此更適合對(duì)分散式信任有明確要求的應(yīng)用場(chǎng)景。特別是典型的區(qū)塊鏈應(yīng)用場(chǎng)景包括數(shù)字支付,產(chǎn)品可追溯性,版權(quán)保護(hù),供應(yīng)鏈財(cái)務(wù)等。在區(qū)塊鏈系統(tǒng)中,智能合約在實(shí)施分散式應(yīng)用部署和擴(kuò)展應(yīng)用的功能方面發(fā)揮著極其重要的作用。區(qū)塊鏈系統(tǒng)與傳統(tǒng)應(yīng)用程序相比,在區(qū)塊鏈系統(tǒng)架構(gòu)上運(yùn)行的智能合約具有開(kāi)放性和透明性,執(zhí)行性,不可篡改且不依賴第三方的特點(diǎn),可以滿足各種去中心化應(yīng)用場(chǎng)景的需求,包括近年來(lái)發(fā)展迅速的去中心化金融(DeFi)項(xiàng)目。
(資料圖)
截至 2021 年 1 月 15 日,去中心化金融(DeFi)以超過(guò) 45 億美元的資本成為了成功的金融范例,它利用基于區(qū)塊鏈的智能合約來(lái)確保其完整性和安全性,。去中心化金融是一個(gè)新的發(fā)展領(lǐng)域,用于交換,借出或借用令牌。通常,這些指令由智能合約(而不是單個(gè)集中的法人或個(gè)人)調(diào)節(jié)和 / 或由多方,分散式治理機(jī)制(例如 DAO)控制的「收益」或收入流。去中心化金融(DeFi)—在現(xiàn)有區(qū)塊鏈平臺(tái)之上逐漸興起。這個(gè)新領(lǐng)域的組成部分包括那些與貸款,資產(chǎn)交易和衍生品市場(chǎng)有關(guān)的部分。作為去中心化的應(yīng)用,智能合約管理著大量的數(shù)字資產(chǎn),從而也使其容易受到各種攻擊。
本文將從三個(gè)維度具體闡述了智能合約安全性問(wèn)題:首先,由于以太坊體系結(jié)構(gòu)每一層的漏洞導(dǎo)致的智能合約安全性。其次,也會(huì)探討 DeFi 和智能合約近期出現(xiàn)的各種攻擊。最后還將探討現(xiàn)有的可行性工具以及來(lái)其他的有效實(shí)踐如何最大限度地減少此類(lèi)攻擊。
以太坊架構(gòu)不同層的智能合約漏洞以太坊架構(gòu)概述在探討智能合約漏洞之前,我們先簡(jiǎn)單概述下有關(guān)以太坊智能合約架構(gòu)。
區(qū)塊鏈網(wǎng)絡(luò)能部署并自動(dòng)執(zhí)行編程腳本任務(wù)。這些程序稱為智能合約,用于定義在交易期間調(diào)用的自定義功能和規(guī)則。基于智能合約的區(qū)塊鏈技術(shù)已被應(yīng)用到各種行業(yè)中,例如金融,供應(yīng)鏈管理,醫(yī)療保健能源和政府服務(wù)。只有特定的區(qū)塊鏈平臺(tái)支持智能合約:以太坊是第一個(gè)支持智能合約的。其他區(qū)塊鏈平臺(tái)(例如 EOS,Lisk,比特幣和 Hyperledger Fabric)兼容于部署和執(zhí)行智能合約。一種稱為 Solidity 的腳本類(lèi)型語(yǔ)言用于在以太坊平臺(tái)中開(kāi)發(fā)智能合約。在這一部分中,我們介紹了以太坊平臺(tái)上智能合約實(shí)施的相關(guān)安全漏洞。智能合約可以持有和管理相應(yīng)的功能 Credit (地址){可能價(jià)值數(shù)千美元的大量虛擬貨幣。因此,對(duì)手不斷嘗試操縱智能合約的執(zhí)行以支持其活動(dòng)。本質(zhì)上,智能合約在分布式和無(wú)權(quán)限網(wǎng)絡(luò)上運(yùn)行,該網(wǎng)絡(luò)繼承了許多漏洞。在傳統(tǒng)的系統(tǒng)中,可以重新開(kāi)發(fā)或修補(bǔ)這一小部分的中心化應(yīng)用程序。
相反,在去中心化的區(qū)塊鏈網(wǎng)絡(luò)中,除非采取極端措施,否則無(wú)法在實(shí)時(shí)網(wǎng)絡(luò)中修改或升級(jí)已部署的智能合約。智能合約的一成不變特征是其安全方面的優(yōu)勢(shì)也是劣勢(shì)。由于這種不變性,黑客無(wú)法為自己的利益進(jìn)行更改或修改合約。但是,部署后開(kāi)發(fā)人員也無(wú)法修改智能合約應(yīng)用程序。他們可以取消或終止合約并創(chuàng)建新的智能合約,然后再次部署它。因此,出于安全性考慮,在部署智能合約之前,應(yīng)對(duì)智能合約進(jìn)行大范圍的測(cè)試。我們重點(diǎn)介紹了以太坊智能合約架構(gòu)的基本構(gòu)建模塊,如圖 1 所示,其中包括以太坊的架構(gòu)。
圖 1: 用于運(yùn)行以太坊區(qū)塊鏈的環(huán)境是通過(guò)一個(gè) Web 用戶界面與以太坊體系結(jié)構(gòu)服務(wù)的四層進(jìn)行交互,應(yīng)用層,用于存儲(chǔ)區(qū)塊鏈數(shù)據(jù)的數(shù)據(jù)庫(kù),用于支持共識(shí)協(xié)議的加密機(jī)制以及用于網(wǎng)絡(luò)層的 Internet 服務(wù) [20]
應(yīng)用層:以太坊客戶端在 EVM 中執(zhí)行智能合約,其中智能合約與以太坊賬戶相關(guān)聯(lián)。以太坊支持兩種類(lèi)型的賬戶:外部擁有賬戶(EOA)和合約賬戶。 EOA 用于將用戶資金存放在 Wei 中,Wei 是 Ether 的最小子面額,價(jià)值 10-18 Ether。 EOA 與公鑰相關(guān)聯(lián)并由公鑰解決;通過(guò)顯示相應(yīng)私鑰的所有權(quán)來(lái)驗(yàn)證對(duì) EOA 的訪問(wèn)。相反,合約帳戶與一段可執(zhí)行的字節(jié)碼(即智能合約)相關(guān)聯(lián),它定義了一些令人感興趣的業(yè)務(wù)邏輯。智能合約是 DApp 的基石。 DApp 通常將用戶界面作為其前端,并將一些智能合約作為其后端。一些 DApp 會(huì)發(fā)行自己的稱為令牌的加密貨幣,用于初始代幣發(fā)行(ICO)和交易所?;谝蕴坏牧钆剖且环N特殊的智能合約(例如 ERC-20)[20]。智能合約在 EVM 中執(zhí)行,這些 EVM 是使用基于堆棧的體系結(jié)構(gòu)的準(zhǔn)圖靈完整機(jī)器。術(shù)語(yǔ)「quasi」是指執(zhí)行受交易提供的 gas 限制。在以太坊應(yīng)用層中,發(fā)生各種漏洞,導(dǎo)致許多攻擊,如應(yīng)用層中的圖所示。
數(shù)據(jù)層:包含區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)。交易是 EOA (稱為發(fā)件人)與另一個(gè) EOA 或合約帳戶(稱為收件人)之間的交互。交易由以下方式指定:
nonce,它是用于跟蹤發(fā)送方已發(fā)起的交易總數(shù)的計(jì)數(shù)器;
收件人,該收件人指定了交易的目標(biāo) EOA 或合約帳戶;
價(jià)值,即從發(fā)件人向收款人轉(zhuǎn)移的金額(單位:Wei)(如果適用);
輸入,是與交易目的相對(duì)應(yīng)的字節(jié)碼或數(shù)據(jù);
gasPrice 和 gasLimit,分別指定發(fā)送方愿意向包含交易的區(qū)塊的獲勝礦工支付的單價(jià)和最大天然氣量;
(v,r,s),它是發(fā)送者的橢圓曲線數(shù)字簽名算法(ECDSA)簽名。執(zhí)行交易會(huì)更新所涉及帳戶的狀態(tài),從而更新區(qū)塊鏈。
共識(shí)層:確保區(qū)塊鏈的狀態(tài)一致。在撰寫(xiě)本文時(shí),以太坊大約需要 12-14 秒來(lái)創(chuàng)建一個(gè)區(qū)塊,這意味著多個(gè)礦工可以同時(shí)創(chuàng)建有效的區(qū)塊,并且可能有許多區(qū)塊。以太坊使用 GHOST 共識(shí)協(xié)議的變體來(lái)選擇「最重」分支作為主鏈,其中「heaviest」分支是根植于所討論的分叉的子樹(shù),并且具有最高的累積區(qū)塊難度,同時(shí)注意到陳舊區(qū)塊不在主鏈上。但注意,以太坊用權(quán)益證明(PoS)替代其當(dāng)前使用的工作量證明(PoW)。
網(wǎng)絡(luò)層:管理節(jié)點(diǎn)或客戶端的以太坊點(diǎn)對(duì)點(diǎn)(P2P)網(wǎng)絡(luò),以使節(jié)點(diǎn)始終可以從某些活動(dòng)節(jié)點(diǎn)獲取區(qū)塊鏈的更新?tīng)顟B(tài)。以太坊網(wǎng)絡(luò)是一個(gè)結(jié)構(gòu)化的 P2P 網(wǎng)絡(luò),其中每個(gè)節(jié)點(diǎn)(即客戶端)存儲(chǔ)整個(gè)區(qū)塊鏈的副本。為了進(jìn)行節(jié)點(diǎn)發(fā)現(xiàn)和路由,每個(gè)節(jié)點(diǎn)維護(hù)一個(gè)動(dòng)態(tài)路由表,其中包含 160 個(gè)存儲(chǔ)桶,每個(gè)存儲(chǔ)桶最多包含 16 個(gè)其他節(jié)點(diǎn)的 ID,IP 地址,UDP / TCP 端口條目。以太坊使用 RLPx 協(xié)議發(fā)現(xiàn)目標(biāo)客戶端,并使用以太坊有線協(xié)議來(lái)促進(jìn)客戶端之間以太坊區(qū)塊鏈信息(例如交易,區(qū)塊)的交換。
以太坊區(qū)塊鏈環(huán)境:運(yùn)行在如下四層的環(huán)境中:用戶與以太坊區(qū)塊鏈進(jìn)行交互的 Web 界面 ; 以太坊客戶的數(shù)據(jù)庫(kù),用于存儲(chǔ)區(qū)塊鏈數(shù)據(jù) ; 出于安全目的的加密機(jī)制;以及支持以太坊節(jié)點(diǎn)之間的區(qū)塊鏈通信的互聯(lián)網(wǎng)基礎(chǔ)設(shè)施。我們將以太坊區(qū)塊鏈架構(gòu)與環(huán)境區(qū)分開(kāi)來(lái),因?yàn)獒槍?duì)以太坊區(qū)塊鏈的攻擊可能來(lái)自環(huán)境,并且這些攻擊可能在環(huán)境中得到更好的解決,而不是由以太坊解決。
以太坊智能合約漏洞重點(diǎn)介紹了以太坊體系每一層的智能合約漏洞,如圖 2 所示。
圖 2:以太坊各層漏洞的分類(lèi)
以太坊應(yīng)用層重入性:此漏洞最初是從 DAO 攻擊中發(fā)現(xiàn)的 [1],當(dāng)外部被調(diào)用方合約在用方合約完成之前(即某種意義上是循環(huán)調(diào)用)在調(diào)用方合約中回調(diào)函數(shù)時(shí),會(huì)發(fā)生此漏洞。這使攻擊者可以繞開(kāi)適當(dāng)?shù)挠行詸z查,直到調(diào)用者合約被耗盡以太幣或交易用完為止。
委托呼叫注入:首先從對(duì) Parity 錢(qián)包的攻擊中發(fā)現(xiàn)了此漏洞 [2]。為了促使代碼重用,EVM 提供了一個(gè)操作碼委托調(diào)用,用于將被調(diào)用方合約的字節(jié)碼插入到調(diào)用方合約的字節(jié)碼中。結(jié)果惡意的被調(diào)用方合約可以直接修改(或操縱)調(diào)用方合約的狀態(tài)變量。此漏洞是由于被調(diào)用方合約可以更新調(diào)用方合約的狀態(tài)變量而導(dǎo)致的。聲明旨在通過(guò)委托調(diào)用作為庫(kù)共享的無(wú)狀態(tài)合約,可完全防此漏洞。
凍結(jié)以太:首次從對(duì) Parity 錢(qián)包的攻擊中發(fā)現(xiàn)了此漏洞 [3]。該漏洞產(chǎn)生由于用戶無(wú)法將錢(qián)存入其合約帳戶,而無(wú)法從這些帳戶中支出資金,從而有效凍結(jié)了他們的資金。
升級(jí)合約:引入合約升級(jí)的思想是為了緩解智能合約一旦部署后就無(wú)法修改的問(wèn)題,即使以后發(fā)現(xiàn)它們存在漏洞。為了允許合約升級(jí),有兩種方法:(i)將合約分為代理合約和邏輯合約,以使開(kāi)發(fā)人員可以升級(jí)后者而不是前者; (ii)使用注冊(cè)管理機(jī)構(gòu)合約來(lái)保存更新后的合約。這些方法雖然有效,但卻引入了一個(gè)新的漏洞:當(dāng)合約開(kāi)發(fā)者變得惡意時(shí),更新的合約可能是惡意的。此漏洞(即,不安全的聯(lián)系人更新)仍然是一個(gè)未解決的問(wèn)題。
具有意外還原的 DoS:發(fā)生這種情況的原因是,由于主叫方合約遇到外部呼叫失敗而導(dǎo)致事務(wù)被還原,或者被叫方合約故意執(zhí)行還原操作以中斷主叫方合約的執(zhí)行。此漏洞是由執(zhí)行被調(diào)用方合約還原的調(diào)用方合約引起的。通過(guò)使接收者調(diào)用交易來(lái)「提取」發(fā)件人為接收者預(yù)留的資金,可以防止此漏洞,從而有效地防止了發(fā)件人的交易被還原。
整數(shù)上溢和下溢:首次從針對(duì) BEC 令牌的攻擊中發(fā)現(xiàn)了此漏洞 [4]。當(dāng)運(yùn)算的結(jié)果超出了 Solidity 數(shù)據(jù)類(lèi)型的范圍時(shí),就會(huì)發(fā)生這種情況,例如導(dǎo)致對(duì)攻擊者的余額或其他狀態(tài)變量進(jìn)行未經(jīng)授權(quán)的操縱。該漏洞是由 Solidity 源代碼未在數(shù)字輸入上執(zhí)行正確的驗(yàn)證引起的,并且 Solidity 編譯器和 EVM 均未提供整數(shù)上溢 / 下溢檢測(cè)??梢酝ㄟ^(guò)使用 SafeMath 庫(kù)來(lái)防止此漏洞處理這些問(wèn)題。
操縱余額:當(dāng)合約的控制流決策依賴于此值時(shí),會(huì)發(fā)生此漏洞。平衡或解決(balance)平衡,攻擊者可以利用它使自己成為唯一可以獲取金錢(qián)的人??梢酝ㄟ^(guò)不使用任何條件聲明中的合約余額來(lái)防止此漏洞 [5]。通過(guò) tx.origin 進(jìn)行身份驗(yàn)證:tx.origin 是 Solidity 中的全局變量,它指的是發(fā)起有問(wèn)題交易的原始 EOA。當(dāng)合約使用 tx.origin 進(jìn)行授權(quán)時(shí)會(huì)發(fā)生此漏洞,這可能會(huì)受到網(wǎng)絡(luò)釣魚(yú)攻擊的危害。通過(guò)使用 msg.sender 而不是 tx.origin 進(jìn)行身份驗(yàn)證,可以防止此漏洞,因?yàn)?msg.sender 返回導(dǎo)致該消息的帳戶。
錯(cuò)誤的可見(jiàn)性:錯(cuò)誤地指定功能的可見(jiàn)性,從而允許未經(jīng)授權(quán)的訪問(wèn)。
無(wú)保護(hù)的自殺:合約的所有者(或受委托的第三方)可以使用自殺或自毀方法銷(xiāo)毀合約。 取消合約時(shí),將刪除其關(guān)聯(lián)的字節(jié)碼和存儲(chǔ)。 該漏洞是由合約強(qiáng)制執(zhí)行的身份驗(yàn)證不足引起的。 可以通過(guò)強(qiáng)制執(zhí)行例如多因素身份驗(yàn)證來(lái)緩解此漏洞,這意味著自殺操作必須得到多方的批準(zhǔn)。
將以太幣泄漏到任意地址:當(dāng)任意調(diào)用方都可以提取合約的資金時(shí),該漏洞就不會(huì)發(fā)生,該調(diào)用方既不是合約的所有者,也不是向合約存入資金的投資者。 此漏洞是由調(diào)用者調(diào)用將以太幣發(fā)送到任意地址的功能時(shí)無(wú)法檢查呼叫者的身份引起的。 通過(guò)對(duì)發(fā)送資金的功能進(jìn)行適當(dāng)?shù)纳矸蒡?yàn)證,可以防止此漏洞。
機(jī)密性失效:在區(qū)塊鏈中,由于區(qū)塊鏈的公共性質(zhì)(即交易細(xì)節(jié)是眾所周知的),限制變量或函數(shù)的可見(jiàn)性并不能確保變量或函數(shù)是機(jī)密的。 防止此漏洞的一種可能解決方案是使用加密技術(shù),例如定時(shí)承諾 [6]。
簽名信息不足:當(dāng)數(shù)字簽名對(duì)多個(gè)交易有效時(shí),就會(huì)發(fā)生此漏洞,當(dāng)一個(gè)發(fā)件人(例如 Alice)通過(guò)代理合約向多個(gè)收件人匯款(而不是發(fā)起多個(gè)交易)時(shí),可能會(huì)發(fā)生此漏洞。 此漏洞最初是在針對(duì)智能合約的重播攻擊中利用的。通過(guò)在每條消息中合并適當(dāng)?shù)男畔ⅲɡ绗F(xiàn)時(shí)值和時(shí)間戳)可以防止此漏洞。
具有不受限制的操作的 DoS:此漏洞首先從 Govern Mental 合約中觀察到 [7]。
未經(jīng)檢查的呼叫返回值:此漏洞也稱為處理錯(cuò)誤的異常。它有兩個(gè)變體,稱為 gas-less 發(fā)送和 unchecked 發(fā)送。當(dāng)不檢查低級(jí)調(diào)用的返回值時(shí)會(huì)出現(xiàn)這種情況,即使函數(shù)調(diào)用拋出錯(cuò)誤 [8],執(zhí)行也可能會(huì)繼續(xù)。
未初始化的存儲(chǔ)指針:回顧下,在 Solidity 中,合約狀態(tài)變量始終從插槽 0 開(kāi)始連續(xù)放置在存儲(chǔ)中。對(duì)于復(fù)合局部變量(例如,struct,array 或 mapping),將引用分配給未占用的對(duì)象存儲(chǔ)中的插槽以指向狀態(tài)變量。
錯(cuò)誤的構(gòu)造函數(shù)名稱:此漏洞最初是從 Rubixi 合約 [9] 中觀察到的,該構(gòu)造函數(shù)的名稱不正確,它使任何人都可以成為合約的所有者。在 Solidity 0.4.22 版之前,聲明與合約名稱相同的函數(shù)被視為合約構(gòu)造函數(shù),該函數(shù)僅在創(chuàng)建合約時(shí)執(zhí)行。
類(lèi)型轉(zhuǎn)換:此漏洞最早在 [10] 中發(fā)現(xiàn)。以 Solidity 語(yǔ)言編寫(xiě)的合約可以通過(guò)直接引用被調(diào)用方合約的實(shí)例來(lái)調(diào)用另一個(gè)合約。
過(guò)時(shí)的編譯器版本:當(dāng)合約使用過(guò)時(shí)的編譯器時(shí)會(huì)發(fā)生,其中包含錯(cuò)誤,因此使已編譯的合約易受攻擊。通過(guò)使用最新的編譯器可以防止此漏洞。
簡(jiǎn)短地址:此漏洞最早在 [11] 中實(shí)現(xiàn),并進(jìn)行了廣泛討論。
以太幣丟失給孤立地址:以太幣失去到孤立發(fā)生在匯款時(shí),以太坊僅檢查接收者地址的長(zhǎng)度不超過(guò) 160 位,而不檢查接收者地址的有效性。 如果將錢(qián)發(fā)送到一個(gè)不存在的孤立地址,則以太坊會(huì)自動(dòng)注冊(cè)該地址,而不是終止交易。 由于該地址未與任何 EOA 或合約帳戶相關(guān)聯(lián),因此沒(méi)有人可以提取已轉(zhuǎn)移的資金,這實(shí)際上是丟失的。 此漏洞是由 EVM 不能孤立保護(hù)引起的。 在撰寫(xiě)本文時(shí),只能通過(guò)手動(dòng)確保收件人地址的正確性來(lái)防止此漏洞。
調(diào)用堆棧深度限制:此漏洞是由 EVM 的執(zhí)行模型不足引起的,并且已被 EIP-150 的硬分叉所消除,該硬叉重新定義了外部調(diào)用的耗油量規(guī)則,使其不可能達(dá)到 1,024 in 調(diào)用堆棧深度。
低估操作碼:首先從兩次 DoS 攻擊中發(fā)現(xiàn)了此漏洞 [12] [13]。
交易順序依賴(又名前端運(yùn)行):這是指并發(fā)性問(wèn)題,即區(qū)塊鏈的即將到來(lái)的狀態(tài)取決于交易的執(zhí)行順序,但是由礦工決定。
時(shí)間依賴關(guān)系:當(dāng)合約在執(zhí)行關(guān)鍵操作(例如匯款)時(shí)將 block.timestamp 用作觸發(fā)條件的一部分或作為可由惡意礦工操縱的隨機(jī)性來(lái)源時(shí),會(huì)發(fā)生此漏洞。該漏洞是由以太坊引起的,它只要求時(shí)間戳大于其母塊的時(shí)間戳并且在當(dāng)前時(shí)鐘的 900 秒以內(nèi)。
產(chǎn)生隨機(jī)性:例如,許多賭博和彩票合約都是隨機(jī)選擇中獎(jiǎng)?wù)撸ǔ5淖龇ㄊ歉鶕?jù)一些初始私有種子(例如 block.number,block.timestamp,block。難易度或 blockhash)生成偽隨機(jī)數(shù)。但是,這些種子由礦工完全控制,這意味著惡意礦工可以操縱這些變量使自己成為贏家。此漏洞是由可操縱的 entropy 源引起的。
數(shù)據(jù)層漏洞
難以分辨的鏈:當(dāng)以太坊分為 ETH 和 ETC 兩條鏈 [13] 時(shí),首先從跨鏈重放攻擊中觀察到此漏洞?;叵胍幌?,以太坊使用 ECDSA 簽署交易。在進(jìn)行 EIP-155 [7] 硬分叉之前,每筆交易都包含六個(gè)字段(即,隨機(jī)數(shù),收件人,值,輸入,gasPrice 和 gasLimit)。但是,數(shù)字簽名不是特定于鏈的,因?yàn)槟菚r(shí)甚至還不知道特定于鏈的信息。結(jié)果,為一個(gè)鏈創(chuàng)建的事務(wù)可被另一鏈重用。通過(guò)將 chainID 合并到字段中,已消除了此漏洞。
State Trie 中的「空帳戶」:此漏洞首先從參考文獻(xiàn) [12] [13] 中報(bào)告的 DoS 攻擊中發(fā)現(xiàn)的。
共識(shí)層的漏洞可外包的難題:回想以太坊采用了名為 Ethash 的 PoW 難題,該難題旨在抵御 ASIC,并能夠限制并行計(jì)算的使用(由于事實(shí)上,礦工的大部分工作將是讀取數(shù)據(jù)集。 通過(guò)有限的內(nèi)存帶寬)。 但是,狡猾的礦工仍然可以將搜索難題解決方案的任務(wù)劃分為多個(gè)較小的任務(wù),然后將其外包。 該漏洞是由 Ethash 造成的,它僅使拼圖解決方案在原圖像搜索中部分順序,而不是依賴順序 PoW。
概率最終性:此漏洞是由以太坊區(qū)塊鏈偏愛(ài)可用性而非一致性的設(shè)計(jì)引起的,這是根據(jù) CAP 定理 [14] 選擇的。
帶有塊填充的 DoS:首次從 Fomo3D 合約中觀察到此漏洞 [15]。該漏洞僅導(dǎo)致攻擊者的交易包含在新開(kāi)采的區(qū)塊中,而其他交易則被礦工放棄一段時(shí)間。當(dāng)攻擊者提供更高的 gasPrice 以激勵(lì)礦工選擇攻擊者的交易時(shí),可能會(huì)發(fā)生這種情況。此漏洞是由貪婪的采礦激勵(lì)機(jī)制引起的。在撰寫(xiě)本文時(shí),尚無(wú)解決方案來(lái)防止此漏洞。
誠(chéng)實(shí)的采礦設(shè)想:此漏洞是由共識(shí)協(xié)議引起的,因?yàn)樗c激勵(lì)不兼容,請(qǐng)參見(jiàn) [16]。在撰寫(xiě)本文時(shí),此漏洞仍然是一個(gè)未解決的問(wèn)題。
出塊獎(jiǎng)勵(lì):它是指出塊獎(jiǎng)勵(lì)機(jī)制,用于應(yīng)對(duì)由于快速生成塊而導(dǎo)致的陳舊區(qū)塊增加。但是,這種機(jī)制有一個(gè)副作用,即允許自私的礦工將陳舊的區(qū)塊變成出塊并獲得獎(jiǎng)勵(lì),從而有效地激勵(lì)了自私的采礦和雙重支出。
驗(yàn)證者的困境:此漏洞最早在參考文獻(xiàn) [17] 中報(bào)道,指的是當(dāng)驗(yàn)證新交易需要不費(fèi)吹灰之力的計(jì)算時(shí),無(wú)論礦工是否選擇驗(yàn)證交易,都將受到攻擊。如果礦工驗(yàn)證了計(jì)算量大的交易,那么他們將花費(fèi)大量時(shí)間,并在下一個(gè)區(qū)塊的競(jìng)爭(zhēng)中為攻擊者提供優(yōu)勢(shì);如果礦工未經(jīng)驗(yàn)證接受交易,則區(qū)塊鏈可能包含不正確的交易。此漏洞是由以太坊中驗(yàn)證資源需求交易的高昂成本引起的??梢酝ㄟ^(guò)限制驗(yàn)證塊中所有事務(wù)所需的計(jì)算量來(lái)緩解此漏洞 [17]。但是,尚不清楚如何消除此漏洞。
網(wǎng)絡(luò)層的漏洞無(wú)限節(jié)點(diǎn)的創(chuàng)建:此漏洞是針對(duì) Geth 客戶端 1.8 之前的版本。在以太坊網(wǎng)絡(luò)中,每個(gè)節(jié)點(diǎn)都由唯一的 ID 標(biāo)識(shí),該 ID 是 64 字節(jié)的 ECDSA 公鑰。攻擊者可以在一臺(tái)計(jì)算機(jī)上創(chuàng)建無(wú)限數(shù)量的節(jié)點(diǎn)(即具有相同的 IP 地址),然后使用這些節(jié)點(diǎn)壟斷某些受害者節(jié)點(diǎn)的傳入和傳出連接,從而有效地將受害者與網(wǎng)絡(luò)中的其他對(duì)等節(jié)點(diǎn)隔離開(kāi)來(lái)。此漏洞是由對(duì)節(jié)點(diǎn)生成過(guò)程的弱限制引起的。通過(guò)使用 IP 地址和公鑰的組合作為節(jié)點(diǎn) ID,可以消除此漏洞。格斯(Geth)開(kāi)發(fā)人員尚未采用這種對(duì)策,他們認(rèn)為這對(duì)客戶端的可用性有負(fù)面影響。
不受限制的傳入連接:此漏洞在版本 1.8 [18] 之前的 Geth 客戶端中。 每個(gè)節(jié)點(diǎn)在任何時(shí)間點(diǎn)可以具有總數(shù)為 maxpeers 的連接(默認(rèn)值為 25),并且可以與其他節(jié)點(diǎn)發(fā)起多達(dá) 1 (1 + maxpeers)/2?個(gè)出站 TCP 連接。 但是,其他節(jié)點(diǎn)啟動(dòng)的傳入 TCP 連接的數(shù)量沒(méi)有上限。 通過(guò)為 maxpeers 建立與沒(méi)有出站連接的受害節(jié)點(diǎn)的許多傳入連接,攻擊者有機(jī)會(huì)使受害者黯然失色。 在 Geth v1.8 中,通過(guò)對(duì)到節(jié)點(diǎn)的傳入 TCP 連接的數(shù)量實(shí)施上限,默認(rèn)值為?maxpeers/3?= 8,消除了此漏洞。
公共對(duì)等體選擇:在 Geth 客戶端 1.8 之前的版本中檢測(cè)到此漏洞 [18]。
對(duì)等體選擇:該漏洞指的是 Geth 客戶端在從其路由表中選擇節(jié)點(diǎn)以建立出站連接時(shí),總是獲取隨機(jī)選擇的桶的頭部。由于每個(gè)存儲(chǔ)桶中的節(jié)點(diǎn)都是按活動(dòng)排序的,因此攻擊者可以通過(guò)定期向 Geth 客戶端發(fā)送消息來(lái)使其節(jié)點(diǎn)始終位于其他節(jié)點(diǎn)之前。通過(guò)在路由表中所有節(jié)點(diǎn)的集合中隨機(jī)選擇統(tǒng)一的節(jié)點(diǎn),而不是僅從每個(gè)存儲(chǔ)桶的頭中隨機(jī)選擇節(jié)點(diǎn),在 Geth v1.9 中已消除了此漏洞。
獨(dú)立塊同步:它允許攻擊者對(duì)以太坊 P2P 網(wǎng)絡(luò)進(jìn)行分區(qū),而不會(huì)壟斷受害者客戶端的連接?;叵胍幌拢總€(gè)塊標(biāo)題都包含一個(gè)難度字段,該字段記錄了該塊的挖掘難度。區(qū)塊鏈的總難度用 totalDifficulty 表示,是直到當(dāng)前區(qū)塊的難度之和。
RPC API 暴露:此漏洞最初是通過(guò)對(duì) Geth 和 Parity 客戶端的攻擊發(fā)現(xiàn)的 [19]。
引用:
[1] https://www.coindesk.com/understanding-dao-hack-journalists
[2]https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/
[3] https://medium.com/blockcat/on-the-parity-multi-sig-wallet-attack-83fb5e7f4b8c
[4] https://nvd.nist.gov/vuln/detail/CVE-2018-10299
[5]https://medium.com/loom-network/how-to-secure-your-smart-contracts-6-solidity-vulnerabilities-and-how-to-avoid-them-part-2-730db0aa4834
[6] https://eprint.iacr.org/2016/1007.pdf
[7]https://www.reddit.com/r/ethereum/comments/4ghzhv/governmentals_1100_eth_jackpot_payout_is_stuck/
[8]https://github.com/KadenZipfel/smart-contract-attack-vectors/blob/master/vulnerabilities/unchecked-call-return-value.md
[9]https://medium.com/hackernoon/hackpedia-16-solidity-hacks-vulnerabilities-their-fixes-and-real-world-examples-f3210eba5148
[10]https://medium.com/golem-project/how-to-find-10m-by-just-reading-blockchain-6ae9d39fcd95
[11]https://medium.com/loom-network/how-to-secure-your-smart-contracts-6-solidity-vulnerabilities-and-how-to-avoid-them-part-2-730db0aa4834
[12] https://blog.ethereum.org/2016/09/22/transaction-spam-attack-next-steps/
[13] https://blog.comae.io/the-280m-ethereums-bug-f28e5de43513?gi=3b0603be9186
[14] https://dl.acm.org/doi/10.1145/3149.214121
[15]https://medium.com/coinmonks/how-the-winner-got-fomo3d-prize-a-detailed-explanation-b30a69b7813f
[16] https://dl.acm.org/doi/10.1145/3212998
[17] https://dl.acm.org/doi/10.1145/2810103.2813659
[18]https://ljk.imag.fr/membres/Jean-Guillaume.Dumas/Enseignements/ProjetsCrypto/Ethereum/236.pdf
[19] https://mp.weixin.qq.com/s/ia9nBhmqVEXiiQdFrjzmyg
[20] https://dl.acm.org/doi/fullHtml/10.1145/3391195
撰文:Abba Garba,WeBlock CTO翻譯:HAO
來(lái)源:金色財(cái)經(jīng)
Copyright © 2015-2022 太平洋產(chǎn)業(yè)網(wǎng)版權(quán)所有 備案號(hào):豫ICP備2022016495號(hào)-17 聯(lián)系郵箱:93 96 74 66 9@qq.com