以太坊智能合約安全的研究_第1頁
以太坊智能合約安全的研究_第2頁
以太坊智能合約安全的研究_第3頁
以太坊智能合約安全的研究_第4頁
以太坊智能合約安全的研究_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

以太坊智能合約安全的研究摘要區(qū)塊鏈技術(shù)是以點對點網(wǎng)絡(luò)為基礎(chǔ),將資料分散于網(wǎng)絡(luò)中的每個節(jié)點,同時也不需要任何第三方的控管與維護,諸多的特性帶起了虛擬貨幣「比特幣」的發(fā)展,成為了全球幣值最高的貨幣,后續(xù)也帶起了以智能合約為特點的以太坊平臺,其特殊的貨幣「以太幣」成為市值僅次于比特幣的虛擬貨幣,由于智能合約的廣泛應(yīng)用,使以太坊的使用者逐漸增加,然而在撰寫智能合約中,程序語言「Solidity」因為其特殊的規(guī)則與語法,的「TheDAO事件」,因此,本論文整理了現(xiàn)今智能合約中常見的漏洞及陷阱,以合約模擬過程并提出解決或避免方式,讓撰寫合約者能有效地避免合約遭受攻擊。關(guān)鍵詞:區(qū)塊鏈、以太坊、智能合約、SolidityThestudyonEthereumsmartcontractsecurityBlockchaintechnologyisbasedonpeer-to-peernetwork.Itdistributesdatatoeverinthenetwork,anddoesnotreqmakethevirtualcurrency“Bitcoin”popularwhichbecurrencyvalueintheworld.IthasalsomaketheEthereumplatformfeaturingsmartpopulartoo.It’sspecialcurrency“Ether”becomesthevirtualcurrencywithebitcoin.DuetothevariousapplicationofandproposesolutionsoravoidancemethodstomaketheprogrammeravoidcontractKeywords:Blockchain,Ethereum,smartcontract或許大家都不太熟悉、甚至是從未耳聞,而當(dāng)「區(qū)塊鏈」技術(shù)漸漸浮出臺面,連帶著虛擬貨幣等名詞也越來越廣為人知,尤其是2017/05/12的知名「WannaCry」大規(guī)模計算機綁元,成長率大約為可怕的400%,拖了此事件的福,各大媒體或電視臺開始播報關(guān)于虛擬貨幣與區(qū)塊鏈的相關(guān)新聞,讓更多民眾了解到虛擬貨幣的重要性。近年來區(qū)塊鏈技術(shù)的蓬勃發(fā)展,也帶動了虛擬加密貨幣的價值提升及提升關(guān)注度,甚至已經(jīng)是許多人做投資(如外幣、股票的)選項之一,而區(qū)塊鏈技術(shù)以不可竄改性、公開透明、無須信任第三方的等特性聞名,因此非常適合用于金流及貨幣的交易上,比特幣是由化名中本聰在全世界第一個區(qū)塊鏈的應(yīng)用,也是能讓區(qū)塊鏈技術(shù)發(fā)光發(fā)熱的代表之一,之后也有許多不同的虛擬加密貨幣發(fā)行,如門羅幣、以太幣、音樂幣等等,而目前市面上區(qū)塊鏈技術(shù)最熱門的兩大應(yīng)用,分別是單純金流交易的比特幣交易系統(tǒng)[12],有了價值的轉(zhuǎn)移與流動,不論是區(qū)塊鏈底層或是貨幣交易所,都成為了惡意攻擊者的首要目標(biāo),尤其是幣值較高的比特幣和以太幣最為常見。區(qū)塊鏈技術(shù)本身在資安上雖然安全,但攻擊者仍會從其他方面對貨幣做攻擊,本文要介紹的以太坊,除了擁有自己發(fā)行的貨幣之外,還有一個特別的功能,叫做「智能合約」[5],智能合約是由使用者經(jīng)由其特殊的計算機代碼,如Serpent(python-like)、 Solidity(javascript-lik能完成后,合約將部屬進區(qū)塊鏈中并等待驗證,驗證完成后即執(zhí)行合約中的功能,形成一個公開透明,且不能竄改的契約,也因為合約能開發(fā)出許多不同的應(yīng)用如投票、募款然而,合約的功能與內(nèi)容依舊以貨幣的來往或交易為基礎(chǔ),再加上以太坊是以區(qū)塊鏈為基礎(chǔ)的平臺,部屬到區(qū)塊鏈中的合約除了公開透明,當(dāng)然也不可竄改,這更開啟了漏洞的大門,一旦智能合約中的原始碼具有漏洞或異常,攻擊者可以透過撰寫攻擊合約并與漏洞合約做互動,達到竊取以太幣,或永久停止合約運轉(zhuǎn)等情形,在2018年的一篇論文中,研究人員使用其開發(fā)的分析工具分析了約97萬個現(xiàn)有智能合約,發(fā)現(xiàn)仍有高達34200個合約具有安全漏洞,可能導(dǎo)致黑客竊取以太幣,甚至刪除合約。貳、文獻探討 坊基金會是一家在瑞士的非營利組織,該基金會的目的是管理通過以太幣預(yù)售募集到的資金,從而更好的為以太坊和去中心化的技術(shù)生態(tài)系統(tǒng)服務(wù)。各種應(yīng)用。簡單來說,區(qū)塊鏈數(shù)(據(jù)結(jié)構(gòu))+智能合約算(法)=以太坊[6],相對于比特幣的區(qū)塊鏈而言,優(yōu)勢就是在于它可以容易的實現(xiàn)任何類型的智能合約,由于以太坊的開發(fā)歷史較比特幣晚,所以改善了比特幣的某些缺點,例如比分鐘,以太坊則需約15秒左右便可完成。前皆是采用PoW共識機制來決定寫入?yún)^(qū)塊的節(jié)點,別給予該節(jié)點一定數(shù)量的貨幣作為獎勵,當(dāng)然,以太幣也能在交易所與其他貨幣進行交易,市值是僅次于比特幣的加密貨幣。作為區(qū)塊鏈2.0的代表,以太幣的價值曾在2017年間增長了230%,增長幅度甚至高過于比特幣。者想使用以太坊平臺上的服務(wù),首先須創(chuàng)建以太坊錢包,接著必須擁有一定數(shù)量的以太幣,取得方式可從參與寫入?yún)^(qū)塊鏈工作、與其他節(jié)點交易、或從直接從指定管道購買,節(jié)點可從以太坊官方錢包或其他單位開發(fā)的錢包軟件查看自己擁有的以太幣數(shù)量。在以太坊平臺中,當(dāng)使用者有任何需要將資料寫入?yún)^(qū)塊鏈的動作,如轉(zhuǎn)約、與合約互動等行為,就需要網(wǎng)絡(luò)上的礦工們來將這些信息透過EthereumVirtualMachine(EVM)[7][8]執(zhí)行一步驟如下。1.使用者部屬合約或發(fā)起其他類型交易。3.使用者可調(diào)整單位Gas的金額多寡。4.選定手續(xù)費后送出等待礦工確認(rèn)交易。從以上步驟可以看出,Gas的多寡并不是使用者自己可選取的,使用者在以太坊上執(zhí)行的任何功能都有對應(yīng)的程序碼,EVM在運算每行程式碼時都會根據(jù)不同功能產(chǎn)生擇單位Gas的價值。而除了Gas的價值可供使用者調(diào)整外,另一個被稱之為GasLimit。使用者愿意支付的單位Gas價值,使用者愿意提供的金額越高,礦工的收益也越高,通常交易也越快。使用者愿意花的最大值Gas數(shù)量去完成該筆交易,也可讓系統(tǒng)自動調(diào)整。交易手續(xù)費=使用的Gas(Gasused)*選擇的Gas價值(GasPrice)此例子透過EVM計算后消耗了67,849個Gas,當(dāng)使用者的GasLimit選擇大于或小于代表該交易并不需要GasLimit這么多的Gas,以太坊會自動將剩余的Gas退還給使用者,并不會造成使用者多扣手續(xù)費的情況。使用者提供的GasLimit還不足以完成該筆交易,那么該交易會回復(fù)初始狀態(tài)不會執(zhí)行,但是使用者仍須付出提供的手續(xù)費。易運算會無上限的消耗系統(tǒng)資源。2.3智能合約智能合約(SmartContract),是由跨領(lǐng)域的法律學(xué)者NickSzabo所提出。他在自己發(fā)智能合約并沒有一個可信任的執(zhí)行環(huán)境,所以一直沒有流行起來。但如今區(qū)塊鏈為智能合約提供一個可信的執(zhí)行環(huán)境,理所當(dāng)然的智能合約在區(qū)塊鏈的領(lǐng)域就逐漸嶄露頭角,并且被應(yīng)用到實際環(huán)境中。當(dāng)使用者要在以太坊中部屬合約,大致需要以下步驟:1.撰寫智能合約使用者可透過自己的需求、撰寫相對應(yīng)的功能與函式,以語言Solidity為例,程序碼會先經(jīng)由「Solc編譯器」(Soliditycommandlinecompiler)編譯成二進制的ContractByteCode并轉(zhuǎn)交給EVM執(zhí)行,EVM會估算使用者所需Gas,使用者制定GasPrice與輸入錢包密碼即可將合約送出等待驗證。2.部屬至區(qū)塊鏈網(wǎng)絡(luò)并驗證驗證完畢,合約將被記錄至區(qū)塊鏈上。3.觸發(fā)合約執(zhí)行合約的觸發(fā)條件,依照使用者的合約需求及撰寫來定義,如募款合約,當(dāng)接收到他人募款時即觸發(fā)合約內(nèi)募款功能,當(dāng)執(zhí)行合約功能,須回到第二步驟等待由于以太坊是以區(qū)塊鏈為基礎(chǔ)的平臺,所以智能合約的特性與運作,同樣繼承了區(qū)塊鏈技術(shù)的特性,如合約部署后受到不可竄改性的影響,即使有錯誤或漏洞也無法對合約程序碼做更改。在本節(jié)中,我們將針對智能合約撰寫時容易忽略的漏洞或陷阱進行整理3.1Overflow/UnderOverflow在Solidity中可以處理256bit數(shù)字,最多為2256-1,溢位是系統(tǒng)給予的存放空間為有限之下,所需表示的數(shù)值超過范圍,因此在金流應(yīng)用的合約中,無適當(dāng)處理溢位問題將會造成非常大的損害,如下圖一所示。圖一:上溢位示意圖如上圖所示,由于超出系統(tǒng)范圍,因此最大值加上1后系統(tǒng)將會判定錯誤,最終結(jié)果會返回0。Underflow下溢位與上溢位同理,由于合約是圍繞著金流的應(yīng)用做開發(fā),因此在Solidity中并圖二:下溢位示意圖區(qū)塊中的gaslimit也能有效防御惡意攻擊者使用高復(fù)雜度的程序碼使網(wǎng)絡(luò)過度忙碌,導(dǎo)致他人交易速度延緩,然而當(dāng)使用EthereumWallet上的Send函式功能,或是在合約中撰寫send()、transfer()將Ether傳給其他合約時,卻可能發(fā)生outofgas異常,這是因為address.send(amount)是一個空簽名的呼叫方式,此方式會觸發(fā)合約的fallbackfunction,而此時的fallbackfunction被限制最大值為2,300個gas,然而,2300個gas能做的事十分有限,所有會改變合約狀態(tài)或需寫入?yún)^(qū)塊鏈的動作都將導(dǎo)致超過標(biāo)準(zhǔn),如以下常見的4個動作:改變合約內(nèi)變量值創(chuàng)建合約呼叫內(nèi)部、外部函式發(fā)送Ether由于以上規(guī)則,好的程序設(shè)計師在撰寫合約時,fallbackfunction都會避免需消耗超過來簡單從區(qū)塊鏈讀取數(shù)據(jù)做為日志使用。當(dāng)合約中使用了循環(huán)做撰寫則需特別注意,循環(huán)的堆棧次數(shù)很有可能會導(dǎo)致gas消耗量超越gaslimit,這會導(dǎo)致合約在某個點被強迫停止。在Solidity中,當(dāng)使用者呼叫外部函式時發(fā)生錯誤,例如參數(shù)的型態(tài)宣告錯誤或者者使用者將Ether發(fā)送給某合約時,由于發(fā)送Ether是空簽名的函式,也將觸發(fā)合約的 oftheEther」來展示利用此漏洞進行攻擊的效果,以下將分4個步驟解說。約內(nèi)金額轉(zhuǎn)送給當(dāng)前國王,利用onlyKing修飾符來呼叫第5行的modifier功能,限定只有符合國王的Address才可執(zhí)行該函式2addresspublic3uintpublicking_B45modifier6require(msg.sender==7_;910functionKingOfEt1115funct16require(ms17if(!king.ca20king=msg.s21ki24functiongetbalance()publiconlyK25require(king.send(this.balanc額的200%,也就是0.2Ether即可篡位成功,此時NCHU成為了新的國王,并且將國王金額補償給前國王后,新的國王金額也再度提升為200%,也就是0.4Ether。接著,我們部屬一個攻擊合約「CallToTheUnknown」,程序碼如下,第三行的23functionBecomeKing(address_address,uintAmount)public{4if(!_address.call.value(Amount578functionCallToThe910function數(shù)目,我們嘗試傳送1Ether給國王合約,此時將出現(xiàn)錯誤,這是因為此國王合約就會觸發(fā)合約CallToTheUnknown的fallbackfunction中的revert函式,任何的動作都會被還原,也就是說沒有人能再度篡位成功,合約CallToTheUnknown將永久成為國王。當(dāng)某函式為非遞回函式,在無特殊例外情況下,該函式在終止前不能重新呼叫或執(zhí)行,但是在Solidity中,由于fallbackfunction的特殊規(guī)則,這可能導(dǎo)致一般函式在發(fā)送Ether時觸發(fā)了fallbackfunction而導(dǎo)致類似遞回的重復(fù)呼叫函式情況發(fā)生,這是在一般程序約「TheDAO」來展示利用此漏洞進行攻擊的效果,以下將分5個步驟解說。首先撰寫并部屬簡易版銀行存款合約,程序碼如下,合約中第15行的Deposit為存款函式,使用者可輸入任意金額將之存入到合約內(nèi),并可使用第三的mapping功能以自己的賬戶address去查詢存款余額。合約中第5行的withdraw函式為提款功能,使用者須輸入提款金額以及自己的賬戶或合約address后,通過金額判斷式即可提款成功,余額將在提款完成后自動扣款。23mapping(address=>uint)publi45functionwithdraw(uintmone6uints78if(!msg.sender.call.value915functiondepo16shares[msg目的是為了從外部合約呼叫本合約的函式,并且在第3行以及第8行的初始化函式的方式來呼叫合約Back之函式。第12行attack函式為攻擊函式,他會呼叫Back在第5行宣告為1Ether,是使用重復(fù)進入攻擊時每回合的盜取金額,執(zhí)行后提款成約在fallbackfunction中寫入一個循環(huán),將導(dǎo)致能從Bank合約重復(fù)提款直到循環(huán)停止。2contractDAO4uintnu6addressowner=ms78functionDAOattack(addressDAO)public913B.withdr2618if(num<30)21functiongetBalance()publicconstantreturns(uint22returnthis.ba由于我們在部屬攻擊合約時,宣告的attackfond為1Ether,這代表當(dāng)攻擊者執(zhí)行提存款,假設(shè)為2Ether,接著攻擊者去Bank合約中查詢余額狀況,攻擊者的余額將為2Ether,Bank合約的總金額也將提升。確認(rèn)余額狀況后,即可執(zhí)行攻擊合約的attack函式,該函式將因為Reentrance漏洞成了30Ether,正好是循環(huán)數(shù)(30)乘上變量at只用了2Ether的存款,卻提款出了30Ether。用者可以設(shè)定為public讓該函式可于EthereumWallet供他人讀取或執(zhí)行,而當(dāng)設(shè)定為 private其他使用者則無法從合約界面讀取或任何方式呼叫,但這仍無法保護其隱私性,這是因為任何需要寫入?yún)^(qū)塊鏈的動作,如改變合約中的變量值,皆需要提出交易并等待任何人都能讀取區(qū)塊鏈中的任何數(shù)據(jù)或資料,其中當(dāng)然也包含了擁有private修飾符的函式內(nèi)容。本論文用合約「GuessNumber」來展示利用此漏洞進行攻擊的效果,以下將分3個步驟解說。撰寫及部屬合約,程序碼如下,第13行play函式可以讓使用者輸入一個數(shù)字,并及輸入的數(shù)字存入Players中,函式后段當(dāng)變量num等于2(代表已有兩位使用者完為使用者2獲勝,差額的0.2Ether儲存在合約中作為合約擁有者的手續(xù)費。第31賬戶address中。4uintnumb5Player[2]private89functionGuessNumber()1013functionplay(uintnu15players[num]1720functio21uintn=players[0].number+players[1].number;22if(n%2==0)23players[0].addr.tra25players[1].addr.tra26deletepla27n30functiongetProfit()p31if(msg.sender!=owner)r32msg.sender.tr28者2可從區(qū)塊鏈網(wǎng)絡(luò)中尋找此筆資料,可以很明確的看到此筆交易的gasused、gas 此時,使用者B只要利用此特性,在執(zhí)行Play函式前先至區(qū)塊鏈網(wǎng)絡(luò)中查詢,他可以永遠的知道前一位使用者的輸入?yún)?shù),以此為例,使用者B只需輸入任意基數(shù)就可以獲取贏家獎勵1.8Ether。肆、結(jié)論在本節(jié)中,本論文將分析各個漏洞或弱點的解決或避免方式。23functionmul(uint256a,uint256b)internalpurereturns(u4if(a==0)11functiondiv(uint256a,uint256b)in15functionsub(uint256a,uint256b)20functionadd(uint256a,uint256b)internalpureretur況,如有溢位發(fā)生會拋出錯誤。在以太坊中發(fā)送Ether時,假設(shè)沒有Ether不足而發(fā)送失敗,有可能發(fā)生的情況歸類如下。l合約→合約發(fā)送成功,因為接收方合約的fallbackfunction消耗低于2300個gas。發(fā)送失敗,因為接收方合約的fallbackfunction消耗高于2300個gas。式不受2300個gas的限制。發(fā)送失敗,因為合約內(nèi)沒有寫入fallbackfunction并加上修飾符payable。l合約→賬戶發(fā)送成功發(fā)送成功從以上歸類情況可以看出,發(fā)送Ether時的接收方為合約時才有發(fā)送失敗的情況出現(xiàn),因此合約內(nèi)的fallbackfunction規(guī)則及撰寫方式須多加留意。以合約KingoftheEther為例,因為將補償傳送給國觸發(fā)的fallbackfunction而導(dǎo)致不明狀況發(fā)生,因此在合約傳送金額時應(yīng)采取一些防護措施而預(yù)防此情況發(fā)生,以下將合約KingoftheEther的fallbackfunction更改如下。1funct2bool3req

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論