国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

智能合約安全綜述:漏洞分析

2019-10-11 01:23:441c2
關(guān)鍵詞:以太調(diào)用攻擊者

1c2

(1.華南師范大學(xué) a.計(jì)算機(jī)學(xué)院, b.廣州市云計(jì)算安全與測(cè)評(píng)技術(shù)重點(diǎn)實(shí)驗(yàn)室, c.唯鏈區(qū)塊鏈技術(shù)與應(yīng)用聯(lián)合實(shí)驗(yàn)室, 廣東 廣州 510000;2.唯鏈基金會(huì), 上海 200000; 3.廣州大學(xué) 網(wǎng)絡(luò)空間先進(jìn)技術(shù)研究院, 廣東 廣州 510006)

新型的去中心化加密貨幣——比特幣[1],自2009年面世至今,在實(shí)踐上的穩(wěn)定性成功地吸引了業(yè)界和學(xué)術(shù)界的廣泛關(guān)注[2].其蘊(yùn)含的去中心化、可追溯性以及不可篡改等特征的底層架區(qū)塊鏈技術(shù),為數(shù)據(jù)存儲(chǔ)與價(jià)值交換提供了一種安全可靠的去中心化模式.基于區(qū)塊鏈技術(shù)構(gòu)造去中心化應(yīng)用的前景被眾多學(xué)術(shù)界和企業(yè)界人士,甚至是政府部門寄予厚望[3-4].近年來,隨著區(qū)塊鏈技術(shù)的發(fā)展,搭載智能合約功能的區(qū)塊鏈技術(shù)是最重要的發(fā)展趨勢(shì)之一,以太坊(Ethereum)則是其中最重要的區(qū)塊鏈平臺(tái)[5].智能合約是一種可編程式交易,可以被互不受信任的節(jié)點(diǎn)通過區(qū)塊鏈共識(shí)機(jī)制(如工作量證明[1]、權(quán)益證明[6])自動(dòng)且正確的執(zhí)行.目前借助智能合約所部署的應(yīng)用已經(jīng)涵蓋了金融衍生品及服務(wù)、實(shí)體資產(chǎn)以及供應(yīng)鏈等.

由于智能合約應(yīng)用便利,大量高價(jià)值數(shù)字資產(chǎn)利用智能合約進(jìn)行存儲(chǔ)和轉(zhuǎn)移,因此,容易受到攻擊者的密集活動(dòng)影響.而且,因?yàn)閰^(qū)塊鏈上的智能合約具有一經(jīng)部署就不可篡改的特性,如果智能合約中存在了安全性漏洞,則無法對(duì)已部署到區(qū)塊鏈上的合約代碼進(jìn)行補(bǔ)丁更新.即是說,以太坊智能合約的正確執(zhí)行是其結(jié)果有效性的必要條件,單獨(dú)的正確性不足以證明智能合約的安全性.這使得區(qū)塊鏈智能合約從本質(zhì)上存在天然的機(jī)制漏洞,容易造成經(jīng)濟(jì)損失.目前針對(duì)以太坊智能合約的攻擊已經(jīng)有大量的例子[7-8].例如,在2016年6月,惡意攻擊者通過以太坊Solidity[9]編程語言里遞歸調(diào)用的漏洞對(duì)智能合約DAO進(jìn)行了攻擊[10],盜取了大約6 000萬美元,最終導(dǎo)致以太坊的硬分叉(Hard-fork).

實(shí)際上,在以太坊上開發(fā)和設(shè)計(jì)智能合約很容易引入安全性漏洞,其中很大一部分是由于以太坊虛擬機(jī)(Ethereum Virtual Machine,EVM)所支持的高級(jí)語言,如Solidity(一種與Javascript類似的編程語言),其語法特性與開發(fā)人員的直覺認(rèn)知存在誤差,導(dǎo)致所編寫的智能合約存在一些程序上的漏洞.此外,造成漏洞的原因還有可能是來源于虛擬機(jī)層面的指令以及區(qū)塊鏈協(xié)議內(nèi)部執(zhí)行的機(jī)制,比如智能合約之間的依賴問題會(huì)與智能合約部署時(shí)間存在關(guān)系.

在theDAO事件發(fā)生之后,出現(xiàn)了Oyente[11]、ContractFuzzer[12]、Teether[13]、Madmax[14]、Zeus[15]等檢測(cè)智能合約安全性的工具.這些工具通過代碼審計(jì)、測(cè)試、模型檢測(cè)等方法,提供智能合約開發(fā)者在部署前發(fā)現(xiàn)漏洞的機(jī)會(huì),以減少因?yàn)榘踩┒炊鴮?dǎo)致的損失.

為了系統(tǒng)地總結(jié)并對(duì)智能合約漏洞問題進(jìn)行分類,本文主要從以太坊上的智能合約漏洞類型進(jìn)行闡述和歸納.在第一章里,本文對(duì)以太坊智能合約的程序編程模型進(jìn)行介紹,第二章從Solidity編程語言的層面上對(duì)漏洞類型進(jìn)行整理,第三和第四章則分別從EVM和區(qū)塊鏈層面進(jìn)行總結(jié)和歸納.第五章介紹了DoS類型的特殊漏洞.最后對(duì)智能合約的漏洞問題進(jìn)行總結(jié)以及探討智能合約的未來發(fā)展.

1 以太坊智能合約程序編程模型

以太坊上的智能合約由一個(gè)或多個(gè)合約賬戶所對(duì)應(yīng)的合約代碼以及持有Ether的用戶地址所組成.以太坊上的用戶需要通過發(fā)起交易的方式調(diào)用智能合約,并且執(zhí)行過程和結(jié)果由礦工來打包寫入到區(qū)塊鏈中.

1.1 程序結(jié)構(gòu)

以太坊上的智能合約主要是通過Solidity進(jìn)行編寫,Solidity是一種具有面向?qū)ο笮再|(zhì)的弱類型語言.使用Solidity編寫的智能合約主要包含狀態(tài)變量的聲明、函數(shù)、修飾符和構(gòu)造函數(shù)的定義等部分.在以太坊上部署智能合約時(shí),開發(fā)人員需要先將使用Solidity編寫的智能合約代碼編譯為以太坊虛擬機(jī)可執(zhí)行的二進(jìn)制代碼.而在編譯過程中,智能合約代碼的入口會(huì)插入一小段稱為函數(shù)選擇器(Function Selector)的代碼,用以在調(diào)用函數(shù)時(shí)快速跳轉(zhuǎn)到相應(yīng)函數(shù)并加以執(zhí)行.在編譯完成后,可以通過客戶端發(fā)送合約創(chuàng)建交易(Contract Creation Transaction),或通過其他合約執(zhí)行特殊的EVM指令CREATE來部署該編譯后的智能合約.

1.2 調(diào)用方式

在以太坊成功部署的智能合約,可以通過三種方式調(diào)用合約中的公共函數(shù)(External/Public).第一種方式是通過客戶端發(fā)送消息調(diào)用交易(Message Call Transaction),其中包含了數(shù)據(jù)參數(shù)以及目標(biāo)函數(shù)簽名的哈希值.這種函數(shù)調(diào)用方式必須在交易得到確認(rèn)后才能生效.另外,礦工會(huì)對(duì)該交易收取Gas來作為執(zhí)行函數(shù)時(shí)所需要的代價(jià),因此,該方式是一種寫操作,即會(huì)對(duì)消息調(diào)用者的賬戶的余額以及合約的狀態(tài)進(jìn)行更改.第二種方式則通過另一個(gè)合約來間接的調(diào)用,這種方式最終可以被追溯成另一筆消息調(diào)用交易.最后一種方式是通過客戶端調(diào)用 view (或pure) 函數(shù),但這種方式并不會(huì)改變合約的狀態(tài),也不需要耗費(fèi)Gas.

1.3 存儲(chǔ)結(jié)構(gòu)

以太坊虛擬機(jī)(Ethereum Virtual Machine,EVM)的存儲(chǔ)方式可以分為四種:棧(Stack)、狀態(tài)存儲(chǔ)(Storage)、虛擬機(jī)內(nèi)存(Memory)和只讀內(nèi)存.EVM是基于棧的虛擬機(jī),棧中的每一個(gè)元素的長(zhǎng)度是256位,基本的算術(shù)運(yùn)算和邏輯運(yùn)算都是使用棧完成.虛擬機(jī)內(nèi)存實(shí)際上是一個(gè)連續(xù)的數(shù)組空間,用于存放如字符串等較復(fù)雜的數(shù)據(jù)類型.狀態(tài)存儲(chǔ)是key-value的存儲(chǔ)結(jié)構(gòu),用于持久化數(shù)據(jù).與棧和虛擬機(jī)內(nèi)存不同,狀態(tài)存儲(chǔ)的值會(huì)被記錄到以太坊的狀態(tài)樹當(dāng)中. 只讀內(nèi)存是EVM最特殊的一種存儲(chǔ)結(jié)構(gòu),主要用于存放參數(shù)和返回值.

2 代碼層漏洞

Solidity(類似于JavaScript語法)是圖靈完備的高級(jí)語言,是目前智能合約編寫的主要語言之一,雖然它為開發(fā)者提供便利的編程語言,但是使用不當(dāng)會(huì)使得編寫的智能合約異常脆弱,容易受到攻擊者攻擊,下面介紹及分析存在于代碼層的漏洞,對(duì)這些漏洞進(jìn)行案例還原.

2.1 可重入漏洞

可重入漏洞是目前以太坊系統(tǒng)中最著名的漏洞之一,黑客利用該漏洞在2016年成功轉(zhuǎn)移超過360萬個(gè)以太幣,盜取了大約6 000萬美元.該漏洞主要是因?yàn)橹悄芎霞s調(diào)用一個(gè)未知的合約地址,攻擊者可以精心構(gòu)造一份智能合約,在回調(diào)函數(shù)中加入惡意代碼.當(dāng)智能合約向該惡意合約地址發(fā)送以太幣的時(shí)候,合約上的惡意代碼將會(huì)被觸發(fā),這段惡意代碼通常會(huì)進(jìn)行開發(fā)者意想不到的操作.圖1例子根據(jù)DAO合約進(jìn)行改造而來.

圖1 可重入漏洞例子
Fig.1 The example of DAO

圖1代碼有著存款取款的正常功能,但是存在可以進(jìn)行可重入的漏洞,攻擊者可以利用第8行的代碼精心構(gòu)造如圖2代碼進(jìn)行攻擊.

圖2 可重入漏洞攻擊
Fig.2 Dao attack

當(dāng)攻擊者調(diào)用Attack合約中的AttackMyStore函數(shù)時(shí),將會(huì)運(yùn)行第4行代碼,這時(shí),會(huì)觸發(fā)MyStore合約中的withdrawFunds函數(shù),運(yùn)行到第8行時(shí),將會(huì)自動(dòng)觸發(fā)Attack合約的fallback函數(shù),繼而觸發(fā)MyStore中的withdrawFunds函數(shù),形成一個(gè)不斷循環(huán)可重入的過程,攻擊者將拿到原本存儲(chǔ)在MyStore中的所有以太幣.

Solidity文檔建議使用“檢查-生效-交互”的模型編寫代碼以避免可重入漏洞.若將圖1中的第9行代碼和第8行代碼進(jìn)行交換,則攻擊者無法通過可重入的漏洞對(duì)該合約進(jìn)行攻擊.

2.2 危險(xiǎn)的DELEGATECALL

智能合約在使用DELEGATECALL時(shí),會(huì)調(diào)用存在于其他智能合約中的代碼,但是會(huì)保持當(dāng)前的上下文關(guān)系,這種特性雖方便了開發(fā)者使用,卻加大了設(shè)計(jì)安全代碼庫的難度,攻擊者會(huì)利用保持上下文不變的特性修改原有上下文的內(nèi)容從而進(jìn)行攻擊.具體參考圖3.

圖3 供其他合約使用的庫代碼
Fig.3 The code of Libraries

圖3中的庫代碼是用來控制合約的起始時(shí)間和終止時(shí)間,下面構(gòu)造是對(duì)這個(gè)代碼庫的使用智能合約(圖4).

圖4 含有DELEGATECALL的合約代碼
Fig.4 DELEGATECALL in contract

這個(gè)漏洞和智能合約對(duì)于storage變量的存儲(chǔ)位置有關(guān),可以看到,在智能合約Lib中,第一個(gè)變量start存儲(chǔ)在合約的第一個(gè)位置,即slot[0]中,第二個(gè)變量end存儲(chǔ)在slot[1]中.在合約UseLib中,第一變量lib存儲(chǔ)在slot[0]中,第二個(gè)變量end與第三個(gè)變量start分別存儲(chǔ)在slot[1]與slot[2].當(dāng)運(yùn)行合約UseLib中的第7行代碼的時(shí)候,會(huì)調(diào)用合約Lib中的set_start函數(shù),由于DELEGATECALL中的上下文不變的特性,本來修改slot[0]中的內(nèi)容并不是開發(fā)者預(yù)想中的變量start,而是變成當(dāng)前上下文中的變量lib,因此,修改lib地址變量后,可為攻擊者提供有效的攻擊途徑.

2017年,惡意用戶通過此漏洞攻擊Parity錢包,導(dǎo)致價(jià)值將近1.7億美元的ETH被凍結(jié).

2.3 算術(shù)上溢/下溢

上溢/下溢在很多程序語言中都存在,在以太坊虛擬機(jī)中,uint類型最大為256位,超過此范圍會(huì)出現(xiàn)上下溢情況.在2018年美鏈中,使用了ERC20[16]中的batchTranfer函數(shù),在這個(gè)函數(shù)的實(shí)現(xiàn)中存在上溢的危險(xiǎn),攻擊者利用這一漏洞,造成了美鏈的巨大的經(jīng)濟(jì)損失.下面看美鏈的案例說明[17](圖5).

圖5 美鏈接口batchTranfer函數(shù)的具體實(shí)現(xiàn)
Fig.5 BEC’s code implementation

該合約雖然利用了庫代碼SafeMath進(jìn)行安全運(yùn)算,但是由于開發(fā)者的疏忽,仍然給攻擊者造成上溢的機(jī)會(huì).攻擊者調(diào)用batchTransfer函數(shù),_value賦值5789604461865809771178549250434395-392663499233282019728792003956564819968,_receivers的值為攻擊者提供的2個(gè)地址,在第8行代碼中,由于算術(shù)運(yùn)算發(fā)生上溢,從而導(dǎo)致運(yùn)算的結(jié)果為0,第5、6、7行的代碼無法偵測(cè)異常,最終,攻擊者成功攻擊,轉(zhuǎn)走賬戶中所有的金額.

2.4 默認(rèn)函數(shù)類型

目前Solidity語言是以太坊智能合約使用最廣的語言,在Solidity中,默認(rèn)函數(shù)的類型為public,默認(rèn)變量的類型為pirvate.由于開發(fā)者的疏忽,會(huì)使合約產(chǎn)生漏洞,使得攻擊者能對(duì)合約進(jìn)行攻擊.

圖6的合約是一簡(jiǎn)單的游戲,當(dāng)調(diào)用者的地址的最后八位為0時(shí)即為游戲的勝利者,可以把Game合約中的金額全都拿走,但是由于開發(fā)者的使用不當(dāng),函數(shù)_sendWinnings的類型并沒有顯示提供,導(dǎo)致該函數(shù)的類型為默認(rèn)類型,所有的區(qū)塊鏈用戶都能取走該智能合約中的所有金額.

圖6 合約函數(shù)類型均為默認(rèn)類型
Fig.6 Default type

2.5 外部調(diào)用的返回值

在智能合約中,一般通過transfer()、send()、call()等函數(shù)進(jìn)行對(duì)其他賬戶的轉(zhuǎn)賬[9],transfer()函數(shù)會(huì)自動(dòng)檢查轉(zhuǎn)賬結(jié)果,當(dāng)轉(zhuǎn)賬失敗的時(shí)候會(huì)自行拋出異常,但是send()與call()函數(shù)失敗時(shí)不會(huì)自行拋出異常,而是繼續(xù)往下執(zhí)行剩余代碼,進(jìn)而攻擊者可以利用此特性,故意轉(zhuǎn)賬失敗來達(dá)到攻擊目的,見圖7.

圖7 智能合約缺少外部調(diào)用檢查

Fig.7 Exterior appropriation check after intelligent contract default

圖7中,正常的情況下執(zhí)行第7行代碼的時(shí)候,勝利者將會(huì)得到本次游戲的獎(jiǎng)勵(lì),但是,由于某種原因轉(zhuǎn)賬失敗,此時(shí)并沒有檢查winner.send()的返回值,代碼會(huì)繼續(xù)執(zhí)行,在第8行代碼中,將SendOut變量更改為true,從而導(dǎo)致該游戲中的金額永遠(yuǎn)鎖在賬戶中無法提取.

3 虛擬機(jī)層

在以太坊系統(tǒng)中的智能合約必須都要依賴于EVM的執(zhí)行,有時(shí)候由于編譯問題,導(dǎo)致程序的執(zhí)行過程不符合開發(fā)者執(zhí)行的預(yù)期,最終攻擊者可以利用此類漏洞進(jìn)行攻擊.

3.1 短地址攻擊

當(dāng)向智能合約發(fā)送交易的時(shí)候,根據(jù)智能合約ABI規(guī)范對(duì)函數(shù)參數(shù)進(jìn)行編碼.在ABI規(guī)范中輸入的地址參數(shù)必須是20字節(jié),當(dāng)輸入的地址少于20個(gè)字節(jié)的時(shí)候,EVM將用0補(bǔ)全以滿足要求.如開發(fā)者沒有嚴(yán)格按照此規(guī)范對(duì)輸入進(jìn)行檢查,將會(huì)使得攻擊者有機(jī)會(huì)對(duì)合約發(fā)起攻擊.ERC20轉(zhuǎn)賬接口的定義如下:

function transfer(address to, uint tokens) public returns (bool success);

在正常的轉(zhuǎn)賬例子里,輸入的地址參數(shù)為0xca35b7d915458ef540ade6068dfe2f44e8fa733c,輸入的tokens參數(shù)為100,這時(shí)候EVM會(huì)對(duì)transfer()的函數(shù)調(diào)用進(jìn)行編碼,最終的編碼為a9059cbb000000000000000000000000ca35b7d9154-58ef540ade6068dfe2f44e8fa733c0000000000000000-000000000000000000000000000000056bc75e2d631-00000,其中前4個(gè)字節(jié)(a9059cbb)為transfer()函數(shù),緊接著的32個(gè)字節(jié)為第一個(gè)address參數(shù),最后的32個(gè)字節(jié)為第二個(gè)uint256參數(shù),這時(shí)的56bc75e2d63100000對(duì)應(yīng)著參數(shù)中的100token.

而在短地址轉(zhuǎn)賬中,不足20字節(jié)的地址參數(shù)會(huì)出現(xiàn)意想不到的效果,當(dāng)輸入的tokens參數(shù)為100,輸入的地址參數(shù)為0xca35b7d915458ef-540ade6068dfe2f44e8fa73時(shí)(注意這里的地址參數(shù)比正常轉(zhuǎn)賬中少了兩位),為了補(bǔ)位,EVM會(huì)在數(shù)據(jù)后面補(bǔ)足0,因此,最終編碼為a9059cbb-000000000000000000000000ca35b7d915458ef540a-de6068dfe2f44e8fa730000000000000000000000000-000000000000000000000056bc75e2d6310000000,其中,由于補(bǔ)全的原因,第二個(gè)參數(shù)這時(shí)會(huì)由原來的56bc75e2d63100000變成56bc75e2d6310000000,從原來的100tokens變成25600tokens,進(jìn)而造成攻擊.目前該攻擊在實(shí)際運(yùn)用中還沒發(fā)現(xiàn).

3.2 Tx.Origin漏洞

在智能合約中存在一個(gè)全局變量tx.origin,它返回發(fā)起本次交易的調(diào)用者,因此,攻擊者能利用此漏洞創(chuàng)建一個(gè)類似于陷阱的合約,對(duì)調(diào)用該智能合約的用戶造成攻擊.圖8是簡(jiǎn)單的取款操作.

圖8 含有tx.origin的智能合約
Fig.8 The contract with tx.origin

攻擊者可以利用圖8的tx.origin漏洞構(gòu)造一份相應(yīng)的智能合約,見圖9.

圖9 對(duì)tx.origin漏洞進(jìn)行攻擊
Fig.9 Use tx.origin to attack

當(dāng)使用者被騙后,用自己的賬戶向智能合約Attacker發(fā)起轉(zhuǎn)賬的時(shí)候,將會(huì)觸發(fā)fallback函數(shù),該函數(shù)會(huì)調(diào)用合約MyStore中的withdrawAll函數(shù),因?yàn)閠x.origin的緣故,導(dǎo)致無法檢測(cè)出異常,這時(shí),發(fā)起調(diào)用的賬戶中的金額將會(huì)全部轉(zhuǎn)到attacker的賬戶里.

4 區(qū)塊鏈層

目前市面上有多種區(qū)塊鏈系統(tǒng),最知名的是比特幣與以太坊系統(tǒng),不同的系統(tǒng)會(huì)有著不同的特性,而對(duì)于競(jìng)爭(zhēng)記賬權(quán)或者塊產(chǎn)生的規(guī)則大不相同,由于這些細(xì)微的差別,從理論上來說有機(jī)會(huì)讓攻擊者能利用這些差別進(jìn)行攻擊.

4.1 打包交易的順序

由于區(qū)塊鏈通過例如PoW[1]或者PoS[18]等共識(shí)算法競(jìng)爭(zhēng)記賬權(quán)的,交易打包的順序由競(jìng)爭(zhēng)到記賬權(quán)的節(jié)點(diǎn)決定,不同的節(jié)點(diǎn)打包交易的順序不一定相同,因此,交易順序不同往往會(huì)引發(fā)不同的結(jié)果.

圖10中的合約是簡(jiǎn)單的維護(hù)商品價(jià)格和售賣商品的流程,假設(shè)A用戶頻繁地調(diào)用updatePrice()更改商品價(jià)格,B用戶調(diào)用buy()購買商品,當(dāng)這些交易在幾乎相同的時(shí)間進(jìn)行提交,這時(shí)由于交易打包順序由礦工節(jié)點(diǎn)決定,B用戶可能買到商品的價(jià)格由于頻繁的價(jià)格更新而與購買時(shí)價(jià)格不符,從而導(dǎo)致B用戶的經(jīng)濟(jì)損失.

圖10 維護(hù)商品價(jià)格的智能合約
Fig.10 A contract to update price

4.2 基于時(shí)間戳的隨機(jī)變量漏洞

基于時(shí)間戳進(jìn)行隨機(jī)數(shù)選取是大多數(shù)程序中常見的操作,但是由于時(shí)間戳在塊產(chǎn)生的時(shí)候由打包節(jié)點(diǎn)決定,可以在大約900 s時(shí)在誤差范圍內(nèi)調(diào)整時(shí)間戳的值[19],因此,攻擊者可以利用這一特性生成有利于自己的時(shí)間戳進(jìn)行攻擊,見圖11.

圖11 合約基于時(shí)間戳進(jìn)行隨機(jī)數(shù)選擇
Fig.11 Use timestamp to generate number

圖11中的合約就是一個(gè)碰運(yùn)氣的游戲,參與者每次提供10個(gè)以太幣參加,有1/15的可能性獲得該合約賬戶中所有的金額,從上述提到的原理可知,礦工節(jié)點(diǎn)可以控制塊的時(shí)間戳的具體值,礦工可以一直利用時(shí)間戳導(dǎo)致now%15永遠(yuǎn)不為0,當(dāng)累計(jì)到一定程度后再對(duì)賬戶里的金額進(jìn)行提取.

5 拒絕服務(wù)

拒絕服務(wù)攻擊是一種針對(duì)以太坊常見的攻擊類型,其目的是使以太坊網(wǎng)絡(luò)資源和系統(tǒng)資源耗盡,從而無法對(duì)外提供正常的服務(wù).為了保證整個(gè)以太坊網(wǎng)絡(luò)中各個(gè)節(jié)點(diǎn)的一致性,智能合約的運(yùn)行需要利用網(wǎng)絡(luò)同步到以太坊中的各個(gè)節(jié)點(diǎn),因此,在以太坊中部署和執(zhí)行智能合約都需要很大的資源開銷.雖然EVM通過設(shè)置gas機(jī)制(用戶需要為部署和執(zhí)行智能合約而付出代價(jià),而這個(gè)代價(jià)就是以太幣)來防止某些惡意用戶浪費(fèi)以太坊系統(tǒng)中的系統(tǒng)和網(wǎng)絡(luò)資源,但是,智能合約依然是以太坊面臨DOS攻擊時(shí)較為脆弱的一個(gè)環(huán)節(jié),攻擊者可以在智能合約中插入消耗系統(tǒng)資源高的代碼,使得以太坊系統(tǒng)忙于執(zhí)行這些惡意代碼而無暇對(duì)外界正常提供服務(wù).除此之外,開發(fā)人員編寫智能合約也會(huì)引入DOS的漏洞,攻擊者通過利用這些漏洞使智能合約陷入拒絕服務(wù)的狀態(tài)當(dāng)中.稱前者為主動(dòng)式DOS,后者為被動(dòng)式DOS.

5.1 主動(dòng)式DoS

主動(dòng)式DOS攻擊,主要是指通過部署和執(zhí)行擁有大量消耗系統(tǒng)資源高但所需gas低廉的EVM指令的智能合約,使攻擊者可以在低成本的條件下讓以太坊整個(gè)網(wǎng)絡(luò)陷入拒絕服務(wù)的狀態(tài)[20].2016年,兼有系統(tǒng)消耗高和gas低廉的指令EXCODESIZE和SUICIDE被攻擊者發(fā)現(xiàn),并利用其對(duì)以太坊網(wǎng)絡(luò)進(jìn)行攻擊,導(dǎo)致以太坊網(wǎng)絡(luò)交易速率下降.雖然以太坊通過修改gas機(jī)制阻止這種攻擊的再次出現(xiàn)[21-22],但嚴(yán)重影響了公眾對(duì)以太坊等區(qū)塊鏈系統(tǒng)的信心.

5.1.1 EXCODESIZE DOS攻擊[23]

EXCODESIZE是EVM用于查尋某個(gè)合約賬戶代碼規(guī)模的指令[5],會(huì)對(duì)磁盤I/O造成很大的負(fù)擔(dān),普通用戶需要消耗大量資源來執(zhí)行EXCODESIZE指令.同時(shí)EXCODESIZE擁有很低的調(diào)用成本(在1.3.5的geth之前的版本僅僅需要20 gas).為此,攻擊者可以通過部署和調(diào)用有大量的EXCODESIZE指令的智能合約,造成以太坊節(jié)點(diǎn)頻繁讀寫磁盤,降低以太坊網(wǎng)絡(luò)交易吞吐量.在geth 1.6的版本之后,EXCODESIZE指令被上調(diào)至700 gas的開銷,相比之前20 gas的開銷,增長(zhǎng)了34倍[22].因此,使用大量EXCODESIZE進(jìn)行DOS攻擊的成本上升,此類的攻擊才得到了初步的遏制.

5.1.2 空賬戶DOS攻擊

空賬戶是指沒有代碼,沒有以太幣的以太坊賬戶,這些賬戶不存在任何功能但需要存儲(chǔ)在以太坊的狀態(tài)樹中.在2016年10月,攻擊者通過創(chuàng)建大量的空賬戶對(duì)以太坊網(wǎng)絡(luò)進(jìn)行攻擊,導(dǎo)致以太坊浪費(fèi)了大量的存儲(chǔ)資源,增加同步時(shí)間,甚至導(dǎo)致了11月份針對(duì)修復(fù)此類攻擊的“Spurious Dragon”分叉[21].攻擊者通過在母合約中創(chuàng)建子合約,并且循環(huán)調(diào)用子合約的SUICIDE[5],把子合約的以太幣(實(shí)際并無以太幣)發(fā)送到指定的賬戶.這里攻擊者所指定的賬戶在以太坊中是不存在的,因此,以太坊會(huì)創(chuàng)建賬戶地址并紀(jì)錄在狀態(tài)樹當(dāng)中.通過這種方式創(chuàng)造一個(gè)新賬戶僅需要90 gas,但以太坊實(shí)際的系統(tǒng)開銷是極其巨大的.在2016年10月的DOS攻擊中,攻擊者通過這樣的方式創(chuàng)造了超過1 900萬的空賬戶,給以太坊的存儲(chǔ)和網(wǎng)絡(luò)同步造成了很沉重的負(fù)擔(dān).“Spuerious Dragon”分叉后,以太坊通過規(guī)定SUICIDE的gas消耗為5 000,若在執(zhí)行時(shí)創(chuàng)建了新賬戶,其消耗應(yīng)該是25 000 gas,并且節(jié)點(diǎn)可以刪除之前攻擊所產(chǎn)生的僵尸賬戶,以減少空賬戶所帶來的負(fù)面影響.

5.2 被動(dòng)式 DOS

被動(dòng)式DOS主要是指由于智能合約在編寫過程中所引入的漏洞,使得智能合約在部署后陷入無法對(duì)其他用戶服務(wù)的狀態(tài)[14].被動(dòng)式DOS與其說是一種攻擊,不如說是一種漏洞,因?yàn)殚_發(fā)者在編寫過程中的考慮不周而導(dǎo)致智能合約在部署和運(yùn)行一段時(shí)間后處于拒絕服務(wù)的狀態(tài).

5.2.1 無界循環(huán)DOS攻擊

無界循環(huán)DOS是指智能合約的循環(huán)體結(jié)束條件處于開發(fā)者不可控制的狀態(tài)當(dāng)中,完全由用戶的輸入所確定.因此,智能合約運(yùn)行的gas開銷也完全被輸入所決定,很多由out-of-gas異常而產(chǎn)生的問題有很大的概率并沒有被開發(fā)人員所考慮到,其中就包括DOS情況的出現(xiàn).一個(gè)很常見的帶有無界循環(huán)DOS漏洞的代碼如圖12, 當(dāng)用戶數(shù)量達(dá)到一定程度的時(shí)候,執(zhí)行圖11代碼所需要的gas變得極其巨大,超過調(diào)用者所限定的gas-limited甚至是block-limited.這就造成了一種情況,用戶每次調(diào)用這段代碼時(shí)都會(huì)出現(xiàn)out-of-gas的異常并回滾至調(diào)用前的狀態(tài),也就是處于拒絕服務(wù)的狀態(tài).

圖12 DOS例子1
Fig.12 Example One of DOS

5.2.2 Gas-less send DOS攻擊

為了避免reentrancy漏洞,send()函數(shù)的gas被強(qiáng)制指定為2 300,一旦在轉(zhuǎn)賬過程中執(zhí)行fallback函數(shù)所耗費(fèi)的gas超過2 300就會(huì)觸發(fā)out-of-gas的異常并觸發(fā)以太坊的回滾.考慮圖13代碼, 代碼所實(shí)現(xiàn)的功能較為簡(jiǎn)單:向所有的投資者發(fā)放分紅.但考慮這樣的一種情況,當(dāng)中某些惡意投資者在自己的fallback函數(shù)帶有了gas消耗較大的代碼,而上述代碼的運(yùn)行過程必定會(huì)執(zhí)行這個(gè)fallback函數(shù),造成out-of-gas異常的出現(xiàn).因此,這段代碼就被這個(gè)惡意投資者鎖定,無法再對(duì)外提供應(yīng)有的服務(wù).

圖13 DOS例子2
Fig.13 Example two of DOS

5.2.3 Overflow DOS

Solidity提供的數(shù)值類型較多,在使用過程中稍有不慎就會(huì)造成數(shù)值上溢.若在循環(huán)結(jié)構(gòu)中錯(cuò)誤使用Solidity類型,也會(huì)造成DOS情況的出現(xiàn).考慮圖14代碼,在Solidity中uint在執(zhí)行特定類型時(shí),一般是指8位的無符號(hào)數(shù),其表達(dá)的范圍是0~255.當(dāng)用戶數(shù)量少于256時(shí),該代碼能夠正常對(duì)所有用戶提供服務(wù),但是一旦用戶數(shù)量超過256時(shí),因?yàn)閕在循環(huán)遞增中會(huì)發(fā)生溢出,處于后面的用戶就不會(huì)得到和前面用戶相同的服務(wù).換言之,大于255的編號(hào)的用戶被拒絕訪問.

圖14 DOS例子3
Fig.14 Example three of DOS

6 總結(jié)與展望

智能合約作為以太坊的執(zhí)行代碼,有著至關(guān)重要的作用,因此,智能合約的安全與漏洞自然而然成為研究的關(guān)注點(diǎn),本文分別從以太坊的代碼層、虛擬機(jī)層、區(qū)塊鏈層分層地介紹和總結(jié)了目前以太坊智能合約所存在的漏洞及其實(shí)例,而由于拒絕服務(wù)在目前的研究中存在有非常多的變種,而且在執(zhí)行此類攻擊時(shí)會(huì)涉及到上面三個(gè)層級(jí),本文把它作為特殊的漏洞類型單獨(dú)進(jìn)行詳述.通過本文對(duì)目前以太坊存在的漏洞的分析,希望能為后續(xù)的研究工作提供一些總結(jié),并幫助智能合約開發(fā)者們盡量避免這些已知的漏洞,從而提高智能合約的編碼的規(guī)范性和有效性.同時(shí),也可以為目前以太坊的開發(fā)者修復(fù)這些與區(qū)塊鏈平臺(tái)相關(guān)的漏洞,促進(jìn)以太坊智能合約的不斷更新和完善.

猜你喜歡
以太調(diào)用攻擊者
以太極為旗,開啟新時(shí)代“黃河大合唱”
少林與太極(2023年7期)2023-08-25 05:27:52
基于微分博弈的追逃問題最優(yōu)策略設(shè)計(jì)
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
車易鏈:做汽車業(yè)的“以太坊”
汽車觀察(2018年9期)2018-10-23 05:46:24
正面迎接批判
愛你(2018年16期)2018-06-21 03:28:44
基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
有限次重復(fù)博弈下的網(wǎng)絡(luò)攻擊行為研究
百通推出入門級(jí)快速工業(yè)以太網(wǎng)絡(luò)交換器系列
以太互聯(lián) 高效便捷 經(jīng)濟(jì)、可靠、易用的小型可編程控制器
杭锦旗| 南乐县| 汉源县| 尉氏县| 溧水县| 靖江市| 高邑县| 桐梓县| 灵丘县| 鄢陵县| 桦甸市| 平阴县| 囊谦县| 行唐县| 锡林郭勒盟| 远安县| 南阳市| 布拖县| 威信县| 天柱县| 通渭县| 喀喇| 华坪县| 丁青县| 祁东县| 偃师市| 安达市| 浮山县| 定西市| 沂源县| 巴林右旗| 友谊县| 西安市| 宁化县| 北流市| 河间市| 伊川县| 昭觉县| 科尔| 会宁县| 伊吾县|