11月以來至少有三大EOS競(jìng)猜類DApp因“隨機(jī)數(shù)漏洞”相繼被黑——包括EOSDice、FFgame和EOS.WIN。這里的所謂“隨機(jī)數(shù)漏洞”其實(shí)是出現(xiàn)在智能合約上的。
大多數(shù)人都是從以太坊了解到“智能合約”的概念,事實(shí)上,智能合約早在以太坊出現(xiàn)之前就已經(jīng)存在了。1993年,計(jì)算機(jī)科學(xué)家、加密大師尼克·薩博(Nick Szabo)就提出了“智能合約(Smart Contract)”的概念。最初的目的是為了將他所謂的“高度演進(jìn)”的合同法和慣例算法設(shè)計(jì)成互聯(lián)網(wǎng)上陌生人之間的電子商務(wù)協(xié)議。1994年,他寫成了《智能合約》論文,這是智能合約的開山之作這一重要的研究成果也為V神開創(chuàng)區(qū)塊鏈2.0時(shí)代奠定了重要基礎(chǔ)。
之所以被稱為智能合約,主要由于合約的條款由計(jì)算機(jī)代碼進(jìn)行評(píng)估并執(zhí)行,而非使用人力。此外,合約代碼一旦上鏈,執(zhí)行的過程和結(jié)果都完全透明公開且不可篡改。但是,隨著智能合約的廣泛利用,人們發(fā)現(xiàn)智能合約有可能出現(xiàn)漏洞,也同時(shí)存在著很多無法預(yù)料的安全風(fēng)險(xiǎn)。目前,以太坊智能合約的編程語(yǔ)言solidity和以太坊智能合約運(yùn)行的虛擬環(huán)境EVM的設(shè)計(jì)還不夠完善,漏洞一旦被黑客利用就可能導(dǎo)致很多無法預(yù)料的安全問題,特別是資產(chǎn)方面的安全。
根據(jù)安全公司Hosho的數(shù)據(jù)顯示,智能合約的漏洞普遍存在。經(jīng)過Hosho審計(jì)的總額高達(dá)10億美元的智能合約項(xiàng)目中,有25%被發(fā)現(xiàn)存在嚴(yán)重漏洞,約有60%至少存在一個(gè)安全問題。早在2016年就曾發(fā)生過區(qū)塊鏈歷史上沉重的一次攻擊事件。一個(gè)基于以太坊區(qū)塊鏈平臺(tái)的業(yè)界最大的眾籌項(xiàng)目the DAO就受到了黑客的攻擊。原因是the DAO編寫的智能合約中包含的一個(gè)splitDAO函數(shù)。攻擊者利用此函數(shù)的漏洞,不斷從the DAO項(xiàng)目的資產(chǎn)池中分離出the DAO資產(chǎn)并轉(zhuǎn)到黑客自己建立的child DAO。
事實(shí)上,child DAO設(shè)計(jì)的目的最初是為了保護(hù)在DAO投票中處于弱勢(shì)地位的Token持有者。通過創(chuàng)建child DAO給予他們一個(gè)小規(guī)模的可提議、投票以及分紅的新的分布式自治組織的環(huán)境。黑客在發(fā)起攻擊的三個(gè)小時(shí)內(nèi),有大約300萬以太幣資產(chǎn)被轉(zhuǎn)出the DAO資產(chǎn)池。按照當(dāng)時(shí)的以太幣交易價(jià)格,市值近6000萬美元的以太幣被轉(zhuǎn)移到了黑客的child DAO里。隨后,the DAO監(jiān)護(hù)人提議社區(qū)發(fā)送垃圾交易阻塞以太坊網(wǎng)絡(luò),以減緩the DAO資產(chǎn)被分離出去的速度。Vitalik也在以太坊官方博客發(fā)布題為《緊急狀態(tài)更新:關(guān)于the DAO的漏洞》的文章。該文章解釋了被攻擊的細(xì)節(jié)和解決方案。
Vitalik提議進(jìn)行一次軟分叉且不會(huì)有回滾,也不會(huì)有任何交易或者區(qū)塊被撤銷的可能。軟分叉將從塊高度1760000開始把任何與the DAO和child DAO相關(guān)的交易認(rèn)作無效交易,以此來阻止攻擊者在27天后提現(xiàn)被盜的以太幣。隨后再通過以此硬分叉將以太幣找回。
這次攻擊事件被稱為區(qū)塊鏈?zhǔn)飞系?ldquo;黃金大劫案”,也是直接導(dǎo)致以太坊社區(qū)分叉的“罪魁禍?zhǔn)?rdquo;。除了此次最嚴(yán)重的攻擊事件外,智能合約中還存在著一類經(jīng)常被利用的影響資產(chǎn)安全的高危漏洞。計(jì)算機(jī)語(yǔ)言中的整數(shù)類型都有一個(gè)寬度。
換句話說,一個(gè)整數(shù)類型有一個(gè)最大值和一個(gè)最小值。當(dāng)兩個(gè)整數(shù)計(jì)算時(shí),結(jié)果大于最大值或小于最小值也就是溢出。若超出整數(shù)類型的最大表示范圍,數(shù)字便會(huì)由一個(gè)極大值變?yōu)橐粋€(gè)極小值或直接歸零。若超出整數(shù)類型的最小表示范圍,數(shù)字便會(huì)由一個(gè)極小值或者零變成一個(gè)極大值。這就是所謂的整數(shù)溢出漏洞。
黑客利用類似的機(jī)制憑空向一個(gè)賬戶中轉(zhuǎn)入很大數(shù)額的代幣,而合約中的邏輯只要求他花費(fèi)很小的代價(jià),這樣一來就能夠輕易地進(jìn)行漏洞攻擊。今年已經(jīng)發(fā)生了多起由于整數(shù)溢出造成的資產(chǎn)安全事件。
4月,黑客利用BatchOverFlow對(duì)美鏈BEC智能合約發(fā)起攻擊,憑空取出大量BEC代幣并在市場(chǎng)上進(jìn)行拋售。BEC隨即急劇貶值,價(jià)值幾乎為0,即使事后采取回滾,也并沒能挽回?fù)p失。隨后,SMT項(xiàng)目方也發(fā)現(xiàn)其交易存在異常,黑客利用其函數(shù)漏洞創(chuàng)造了大量SMT幣,火幣Pro隨即暫停了所有幣種的充值提取業(yè)務(wù),以防止黑客進(jìn)行大量拋售。此外,還包括奇偶校驗(yàn)錯(cuò)誤漏洞,該事件曾使價(jià)值1.68億美元的以太坊無法使用。為了減少智能合約漏洞所帶來的損失,不少公司都有不同的解決方案。
今年1月,智能合約安全初創(chuàng)企業(yè)Quanstamp設(shè)計(jì)了一個(gè)基于以太坊編程語(yǔ)言Solidity的智能合約安全審計(jì)協(xié)議。通過他們所設(shè)計(jì)的安全審計(jì)協(xié)議,客戶可以通過預(yù)先審查軟件和“Bug Finders”來仔細(xì)檢查智能合約中的漏洞,同時(shí)也會(huì)獎(jiǎng)勵(lì)那些在智能合約上糾錯(cuò)的用戶。 雖然這看似這一個(gè)有效的解決方案,但是對(duì)于客戶本身來說,除了需要審查源代碼之外,還必須人工手動(dòng)進(jìn)行修改。另一家名為CertiK也提出了解決方案,他們將提供區(qū)塊鏈生態(tài)所有組件的驗(yàn)證平臺(tái),包括智能合約和DApps。CertiK平臺(tái)應(yīng)用深度學(xué)習(xí)技術(shù)來構(gòu)建智能標(biāo)簽框架。
通過這個(gè)框架,大多數(shù)共享邏輯和屬性代碼都可以被自動(dòng)標(biāo)記,從而使得程序的邏輯和語(yǔ)義更加清晰和規(guī)范,驗(yàn)證的工作量也可以大大減少。這樣,就可以將復(fù)雜的證明任務(wù)分解成為更小的任務(wù),并在適當(dāng)?shù)某橄髮用骝?yàn)證其中的每一個(gè)。這種工作方式將有效地激勵(lì)和獎(jiǎng)勵(lì)社區(qū)的構(gòu)建,并在一定程度上改進(jìn)解決算法,保持一個(gè)有彈性、經(jīng)濟(jì)有效的解決方案。此外,以太坊基金會(huì)(Ethereum Foundation)開發(fā)者Alex Van de Sande公布了一項(xiàng)有關(guān)“保險(xiǎn)池”的提議。他認(rèn)為這個(gè)方案能夠降低網(wǎng)絡(luò)分裂的風(fēng)險(xiǎn)。
由于智能合約代碼漏洞造成的資金凍結(jié)的事故,在尋找解決方案的過程中可能產(chǎn)生分歧,從而帶來分裂網(wǎng)絡(luò)的風(fēng)險(xiǎn)。Van de Sande是以太坊Mist瀏覽器團(tuán)隊(duì)的領(lǐng)導(dǎo)者,他在一篇文章中提到過創(chuàng)建一個(gè)存有專用保險(xiǎn)資金的“贖回合約”(recovery contract)的方法。這樣,能夠降低個(gè)人或組織通過爭(zhēng)議性硬分叉來獲得部分或全部因?yàn)榇a漏洞所損失的資金。但是,Van de Sande的提議中最具爭(zhēng)議性的部分是涉及到了為超過51.3萬ETH發(fā)行贖回代幣的計(jì)劃。這個(gè)數(shù)量也是因合約代碼漏洞被錯(cuò)誤鎖定在Parity多重簽名錢包中的以太坊數(shù)量。Parity團(tuán)隊(duì)表示無意通過爭(zhēng)議性硬分叉的方式取回資金。
因此,Van de Sande認(rèn)為他的這項(xiàng)計(jì)劃將會(huì)使受害者(包括大多數(shù)以太坊核心開發(fā)者)成為利益相關(guān)者。 區(qū)塊鏈技術(shù)雖然被吹的神乎其神,但如果一味地忽略其中的漏洞而不解決,只會(huì)阻礙區(qū)塊鏈的進(jìn)一步發(fā)展。