復(fù)盤 EOS 安全事件及再議區(qū)塊鏈安全

責(zé)任編輯:zsheng

2018-06-03 10:43:16

摘自:洞察網(wǎng)

2018年5月29日,360公布了其發(fā)現(xiàn)EOSIO嚴(yán)重漏洞的消息。此新聞及后續(xù)一系列相關(guān)跟進(jìn)事件迅速成為區(qū)塊鏈領(lǐng)域內(nèi)的輿論熱點(diǎn)。隨著越來越多的聲音與內(nèi)容出現(xiàn),各界對(duì)此次事件也逐漸有了更為清晰的認(rèn)識(shí)。在此有必要從技術(shù)角度對(duì)此次事件進(jìn)行客觀復(fù)盤與分析,并再次對(duì)區(qū)塊鏈安全進(jìn)行探討。

2018年5月29日,360公布了其發(fā)現(xiàn)EOSIO嚴(yán)重漏洞的消息。此新聞及后續(xù)一系列相關(guān)跟進(jìn)事件迅速成為區(qū)塊鏈領(lǐng)域內(nèi)的輿論熱點(diǎn)。隨著越來越多的聲音與內(nèi)容出現(xiàn),各界對(duì)此次事件也逐漸有了更為清晰的認(rèn)識(shí)。在此有必要從技術(shù)角度對(duì)此次事件進(jìn)行客觀復(fù)盤與分析,并再次對(duì)區(qū)塊鏈安全進(jìn)行探討。

事件回顧

根據(jù)目前網(wǎng)上公開資料,包括博客、代碼記錄等,我們對(duì)本次安全事件的技術(shù)過程進(jìn)行一個(gè)簡(jiǎn)要梳理:

北京時(shí)間5月28日 360公司Vulcan(伏爾甘)團(tuán)隊(duì)聯(lián)系主導(dǎo)EOSIO開發(fā)的Daniel Larimer(即bytemaster,以下簡(jiǎn)稱BM)并報(bào)告了發(fā)現(xiàn)的高危安全漏洞情況

5月28日 BM在github的eos項(xiàng)目上新建了一個(gè)需要跟蹤的問題(Issue)。同天,該問題所描述的bug被修復(fù);該問題關(guān)閉

5月29日中午,360公司在其官方微信公眾號(hào)上公布了區(qū)塊鏈平臺(tái)EOSIO的高危安全漏洞的消息

同天晚些時(shí)候,360公司在其公司博客“奇虎360技術(shù)博客”上公布了該漏洞的細(xì)節(jié)內(nèi)容

技術(shù)分析

我們首先從奇虎360技術(shù)博客的報(bào)告“EOS節(jié)點(diǎn)遠(yuǎn)程代碼執(zhí)行漏洞 — EOS智能合約WASM函數(shù)表數(shù)組越界”[1]中來查看本次漏洞的詳細(xì)技術(shù)內(nèi)容。

根據(jù)報(bào)告所述,在修復(fù)該漏洞的提交

ea89dce21d13d41a22b3512a27be97b4be9df755之前的代碼版本上,我們可以看到在libraries/chain/webassembly/binaryen.cpp文件的76行,有assert用于檢查變量取值情況。但assert一般僅適用于程序編譯構(gòu)建的Debug模式,對(duì)于正式發(fā)布的Release模式通常并不起作用,因此相當(dāng)于沒有做檢查,導(dǎo)致78行對(duì)數(shù)組的訪問存在隱患。

因此在發(fā)現(xiàn)該漏洞后,開發(fā)團(tuán)隊(duì)已將assert改為可正常調(diào)用的名為FC_ASSERT的宏定義。

知道了問題所在后,我們?cè)賮砜匆幌戮帉慐OSIO所使用的C++程序的內(nèi)存結(jié)構(gòu)及語(yǔ)言特性。

C++程序的內(nèi)存區(qū)域包括棧區(qū)、堆區(qū)、自由存儲(chǔ)區(qū)、靜態(tài)全局存儲(chǔ)區(qū)、常量區(qū)及代碼區(qū)等。每個(gè)區(qū)域均有其獨(dú)特的作用。同時(shí),C/C++允許程序員通過指針等方式,對(duì)內(nèi)存進(jìn)行極為自主的控制及使用,并不強(qiáng)制檢查數(shù)組邊界等條件。因?yàn)榘▋?nèi)存管理在內(nèi)的種種極為靈活、可控制底層的語(yǔ)言特性,C/C++憑借其高性能被廣泛使用于對(duì)程序執(zhí)行速度有嚴(yán)格要求的工業(yè)界。但也正是因?yàn)檫@種靈活性,C/C++程序常會(huì)因?yàn)閮?nèi)存管理的復(fù)雜性而出現(xiàn)內(nèi)存泄露、宕機(jī)或內(nèi)存越界等問題。這點(diǎn)在大型工程上尤其常見。

圖 1 內(nèi)存問題引起程序崩潰示例

原因在于,C++程序指針訪問到相應(yīng)內(nèi)存區(qū)域,即有可能對(duì)其進(jìn)行相應(yīng)的操作,所以如果控制不當(dāng),訪問到原本的“界限”之外,就會(huì)產(chǎn)生越界的問題:如果訪問到數(shù)據(jù)區(qū)域,則可能會(huì)引起程序崩潰或讀取、修改到原本不應(yīng)訪問到的信息;如果訪問到代碼區(qū)域,則可能注入或改變?cè)姓4a。這就是緩沖區(qū)溢出的基本原理。

作為計(jì)算機(jī)及互聯(lián)網(wǎng)上十分常見且潛在影響巨大的攻擊手段,利用緩沖區(qū)溢出進(jìn)行攻擊有記錄的最早一次是發(fā)生在1988年的Morris蠕蟲攻擊。據(jù)估計(jì),它一經(jīng)出現(xiàn)便影響了互聯(lián)網(wǎng)上10%的計(jì)算機(jī),造成約10萬(wàn)至100萬(wàn)美元的損失。從其首次出現(xiàn)到今天的30年間,很多著名的攻擊事件都采取了緩沖區(qū)溢出的方式進(jìn)行,其影響也隨著互聯(lián)網(wǎng)的發(fā)展而擴(kuò)大。

回到本次EOSIO的這個(gè)漏洞,根據(jù)360的報(bào)告我們可以看到:當(dāng)檢查代碼失效后,如果offset變量被任意設(shè)置一個(gè)地址,例如0xfffffff,則會(huì)引起segmentation fault的錯(cuò)誤而導(dǎo)致程序崩潰;而如果對(duì)合約進(jìn)行精心設(shè)計(jì),攻擊者可通過對(duì)內(nèi)存越界寫入的方式來執(zhí)行惡意代碼,正如360報(bào)告中附加的視頻所示。

同時(shí),如果能將風(fēng)險(xiǎn)控制在單機(jī)范圍內(nèi),那對(duì)全局來說影響還是相對(duì)可接受的。但正是由于惡意代碼可以是一個(gè)區(qū)塊鏈上的合約,因此EOSIO將合約打包成區(qū)塊后會(huì)在整個(gè)網(wǎng)絡(luò)中傳播,使得所有節(jié)點(diǎn)均可被此惡意代碼控制,即整個(gè)網(wǎng)絡(luò)都受到致命影響。

構(gòu)建區(qū)塊鏈安全生態(tài)

從本次漏洞結(jié)合近期以太坊ERC20漏洞等安全事件,我們應(yīng)更加認(rèn)識(shí)到《【火線視點(diǎn)3】從ERC20漏洞事件看區(qū)塊鏈安全生態(tài)建設(shè)》中的觀點(diǎn):區(qū)塊鏈安全生態(tài)不僅僅需要項(xiàng)目團(tuán)隊(duì)、開發(fā)人員,更需要多方的通力合作。下面主要從項(xiàng)目團(tuán)隊(duì)內(nèi)控、項(xiàng)目生態(tài)激勵(lì)和投資者自我防范這三個(gè)方面去探討區(qū)塊鏈安全生態(tài)的建設(shè)。

1 完善代碼安全審查機(jī)制

回顧ERC20漏洞事件和EOSIO的緩沖區(qū)溢出事件,他們完全都可以通過有效的代碼安全審查機(jī)制來避免。以ERC20漏洞為例,經(jīng)過核查,使用ERC20協(xié)議的項(xiàng)目竟然有20余個(gè)都存在類似的問題。

瞬息萬(wàn)變的幣圈確實(shí)發(fā)展的太快,每一個(gè)人都是飛奔著前進(jìn),都趕著寫白皮書、趕著募資、趕著上項(xiàng)目,自然而然就很少有人沉下心來好好做測(cè)試,好好做安全審查,導(dǎo)致漏洞頻出、安全事件頻發(fā)。

區(qū)塊鏈作為一個(gè)分布式的去中心化系統(tǒng),代碼一旦部署將很難更新,需通過硬分叉或者軟分叉來對(duì)代碼進(jìn)行升級(jí),成本不可謂不高。THE DAO事件則直接將以太坊分裂成為ETH和ETC,是對(duì)以太坊生態(tài)的重大破壞。所以在項(xiàng)目發(fā)布之前,充足的測(cè)試和代碼審核變得十分關(guān)鍵和必要。比如多人代碼審核、內(nèi)部測(cè)評(píng)小組、外部專家評(píng)測(cè)等。

多人代碼審核

由于一個(gè)人的能力和認(rèn)知總是有限的,所以對(duì)于同一段代碼,不同的人將會(huì)發(fā)現(xiàn)不同的問題,多人代碼審核機(jī)制能使得代碼的BUG率和漏洞率大大降低。這種方式也是軟件行業(yè)降低錯(cuò)誤率最為通用和有效的方式之一。

內(nèi)部測(cè)評(píng)小組

項(xiàng)目組建立內(nèi)部安全測(cè)評(píng)小組,梳理業(yè)界常見的安全問題清單,并逐一對(duì)發(fā)布的項(xiàng)目進(jìn)行安全審計(jì),通過簡(jiǎn)單的梳理和測(cè)評(píng)便能將常見的基本漏洞一掃而空,大大增加了系統(tǒng)的可靠性。

外部專家評(píng)測(cè)

對(duì)于某些新型的,特殊性的漏洞,項(xiàng)目組可以借助于例如第三方評(píng)測(cè)機(jī)構(gòu)等外部安全專家的幫助進(jìn)行梳理和測(cè)評(píng),爭(zhēng)取在項(xiàng)目發(fā)布前將安全隱患降到最低程度。

2 發(fā)展白帽黑客激勵(lì)機(jī)制

世界無(wú)非兩極,一陰一陽(yáng)、一黑一白、一正一邪,有黑客肆意破壞,就有白帽黑客維護(hù)世界正義。隨著各類數(shù)字資產(chǎn)的市值越來越高,黑客們從中套取的收益也越來越客觀,相比之下,白帽黑客們卻窮酸的多。

這種巨大的收入差導(dǎo)致越來越多人加入的黑客的陣營(yíng),而白帽黑客們則為數(shù)稀少。通過激勵(lì)白帽黑客來抑制或者是平衡黑客越來越肆無(wú)忌憚的破壞行為或許將成為一種有效的手段。

那么如何激勵(lì)白帽黑客們?yōu)槠脚_(tái)做出貢獻(xiàn)呢?我想主要可以從兩方面入手,一是物質(zhì)激勵(lì),二是精神激勵(lì)。

物質(zhì)激勵(lì)

對(duì)于發(fā)行通證的公鏈來說,最實(shí)在的物質(zhì)激勵(lì)自然就是通證。它既是區(qū)塊鏈平臺(tái)的價(jià)值載體,也是平臺(tái)生態(tài)治理的重要手段。比如COSMOS,為了鼓勵(lì)發(fā)現(xiàn)并及時(shí)報(bào)告缺陷,Cosmos Hub允許黑客通過ReportHackTx 交易來“邀功”,主要就是說明,“這個(gè)節(jié)點(diǎn)已被攻擊,請(qǐng)將獎(jiǎng)金發(fā)到這個(gè)地址”。黑客可以收到擊中資產(chǎn)的5%作為賞金。

除此之外我們也可以通過設(shè)立黑客獎(jiǎng)金池、黑客基金或者項(xiàng)目特別顧問等方式來激勵(lì)白帽黑客主動(dòng)挖掘漏洞,幫助平臺(tái)持久安全地運(yùn)行。

精神激勵(lì)

除了物質(zhì)獎(jiǎng)勵(lì),對(duì)于Hacker這一非常另類、有性格的群體來說,精神上的激勵(lì)或許是更持久有效的方式。對(duì)于每一個(gè)為平臺(tái)或者項(xiàng)目作出貢獻(xiàn)的黑客來說,項(xiàng)目組、基金會(huì)或者社區(qū)都應(yīng)將給與其相應(yīng)的榮譽(yù)獎(jiǎng)勵(lì)。可以是排行榜、貢獻(xiàn)值亦或是某種稀缺頭銜等等,使其不僅能被社區(qū)其它成員知曉,更能明顯區(qū)別于普通會(huì)員,增強(qiáng)其在社區(qū)的存在感、參與感和榮譽(yù)感。更可考慮用較為“極客”的方式進(jìn)行精神激勵(lì),例如將白帽黑客對(duì)平臺(tái)、社區(qū)的貢獻(xiàn)記錄在區(qū)塊鏈上,形成更有針對(duì)性的生態(tài)系統(tǒng)良性循環(huán)。

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)