從The DAO黑客事件看區(qū)塊鏈安全隱患區(qū)塊鏈
在編程人員努力對(duì)抗各種漏洞的時(shí)候,也需要思考如何將對(duì)安全問(wèn)題的防范嵌入到整個(gè)開發(fā)過(guò)程中。市面上有一些輔助性的工具,但編程人員需要首先理解他們自己在面對(duì)此類問(wèn)題時(shí)的脆弱之處。
在軟件行業(yè),整體而言安全方面的考慮是重中之重。這一點(diǎn)對(duì)于區(qū)塊鏈技術(shù)來(lái)說(shuō)尤為如此。如果安全底線被突破,其他問(wèn)題也就無(wú)從談起。區(qū)塊鏈技術(shù)被證明可以用于打造一個(gè)去中心化、去信任的交易系統(tǒng),但區(qū)塊鏈系統(tǒng)仍然不是百分之百的安全無(wú)虞。
安全漏洞存在于設(shè)計(jì)、架構(gòu)、編程、運(yùn)營(yíng)等各個(gè)階段,因此,區(qū)塊鏈也是可能被黑客攻擊的。
對(duì)于智能合約而言,只要被部署在區(qū)塊鏈上,就會(huì)和該區(qū)塊鏈共存。所以,所有的漏洞與安全缺陷也會(huì)和智能合約共存。
基本上每一個(gè)區(qū)塊鏈都使用一套自己的編程語(yǔ)言來(lái)部署智能合約。我們來(lái)仔細(xì)研究一下。
智能合約語(yǔ)言
區(qū)塊鏈環(huán)境包括開發(fā)智能合約所使用的語(yǔ)言。
例如,以太坊平臺(tái)使用的是Solidity語(yǔ)言編寫智能合約。Solidity語(yǔ)言的開發(fā)者將其設(shè)計(jì)成一種圖靈完備的編程語(yǔ)言。所謂圖靈完備,就是該語(yǔ)言允許編程者可以執(zhí)行一切底層系統(tǒng)可以計(jì)算的問(wèn)題。這就讓編程者可以在代碼中實(shí)現(xiàn)循環(huán),但也潛在地為區(qū)塊鏈帶來(lái)了安全隱患。
圖靈完備
圖靈完備語(yǔ)言天然具有復(fù)雜性,而復(fù)雜性又會(huì)帶來(lái)漏洞和安全隱患。
比特幣網(wǎng)絡(luò)使用了一個(gè)名為Script的編程語(yǔ)言,該語(yǔ)言并不是一種圖靈完備語(yǔ)言,目的就是為了增強(qiáng)安全性。
編程人員的可選擇性越少,那么區(qū)塊鏈產(chǎn)生安全隱患的幾率就越低。
為了減少釋放錯(cuò)誤代碼帶來(lái)的危害,編程人員需要了解智能合約開發(fā)過(guò)程中的陷阱和反模式(反模式是指錯(cuò)誤的編程方式)。
The DAO黑客事件:一個(gè)可重入性問(wèn)題在編程人員開發(fā)智能合約給區(qū)塊鏈帶來(lái)的眾多安全隱患中,可重入性問(wèn)題危害最大。它會(huì)導(dǎo)致一個(gè)賬戶在同一交易中被重復(fù)支出。這問(wèn)題經(jīng)常會(huì)發(fā)生在退款處理的過(guò)程中,但實(shí)際上這一缺陷,如果在設(shè)計(jì)和編程階段不被預(yù)先處理,就會(huì)影響到所有交易過(guò)程。
在迄今為止最臭名昭著的加密貨幣領(lǐng)域攻擊事件中,黑客就是利用了the DAO在可重入性問(wèn)題上的缺陷。The DAO的全稱為Decentralized Autonomous Organization,意為“去中心化自治組織”,也就是說(shuō),沒有一個(gè)機(jī)構(gòu)化的領(lǐng)導(dǎo)者對(duì)其運(yùn)營(yíng)進(jìn)行管理。The DAO本身提倡的是讓用戶自主投票,選擇要進(jìn)行投入的項(xiàng)目。在the DAO成立的首個(gè)月里,它就籌集了1.5億美元的資金。2016年6月17日,黑客利用其可重入性缺陷,盜取了其中價(jià)值5000萬(wàn)美元的以太幣資金。該問(wèn)題直到后來(lái)以太經(jīng)典與以太坊進(jìn)行了硬分叉之后才得以解決。
反模式易受可重入性問(wèn)題侵害
一個(gè)易受侵害的可重入性程序邏輯是如下這樣的
function to process a payment () {
check the validity of the transaction, the recipient, and the account balance;
(2) process the transaction;
(3) update the state of the system to show the transaction has been processed;
}
一眼看上去,這個(gè)邏輯是完整且正確的,但問(wèn)題隱藏在第二步之中。
對(duì)于該函數(shù)的第一個(gè)調(diào)用,會(huì)繼續(xù)執(zhí)行第二步,另一個(gè)對(duì)于同一交易的調(diào)用則會(huì)進(jìn)入該函數(shù)。因?yàn)闋顟B(tài)信息表明其仍在初始狀態(tài),且沒有在第三步中被執(zhí)行,那么第二次調(diào)用則會(huì)驗(yàn)證其為一次有效交易,并予以執(zhí)行。
最終,系統(tǒng)因?yàn)橥瑯拥睦碛稍俅螌?duì)貨幣進(jìn)行消費(fèi)。黑客們就會(huì)利用這一漏洞,在狀態(tài)被調(diào)整正常前多次使用該函數(shù)進(jìn)行交易。
解決可重入性問(wèn)題的方法
解決該問(wèn)題,可以對(duì)函數(shù)進(jìn)行一個(gè)調(diào)整:
function to process a payment () {
check the validity of the transaction, the recipient, and the account balance;
(2) update the state of the system to show the transaction has been processed;
(3) process the transaction;
}
代碼需要對(duì)所有可能的例外進(jìn)行解釋,同時(shí)也需要對(duì)所有的邏輯相關(guān)性進(jìn)行解釋。
溢出問(wèn)題
溢出是另一個(gè)需要編程人員警惕的問(wèn)題。
不同的編程語(yǔ)言提供的版式不同。例如,強(qiáng)版式語(yǔ)言不允許編程者向數(shù)值變量中添加串?dāng)?shù)據(jù),而弱版式語(yǔ)言則允許。強(qiáng)版式語(yǔ)言對(duì)范圍進(jìn)行限制,如果一個(gè)數(shù)組包含是個(gè)元素,那編程人員就無(wú)法獲取第是一個(gè)元素。弱版式語(yǔ)言則沒有這樣的限制,但因此也帶來(lái)了崩潰的可能。如果最大允許值為一個(gè)值為99的變量,如果你賦值為100,運(yùn)行的時(shí)候必然會(huì)崩潰!
所以,溢出也是一個(gè)黑客可能利用的漏洞。如果黑客將一個(gè)超出代碼可運(yùn)行范圍的參數(shù)植入一個(gè)智能合約,那系統(tǒng)就會(huì)崩潰,而這一次崩潰就會(huì)導(dǎo)致一系列的漏洞。這樣的崩潰可能引發(fā)“拒絕服務(wù)”攻擊(DDoS attack),關(guān)于系統(tǒng)內(nèi)部運(yùn)行的關(guān)鍵信息有時(shí)候也可能會(huì)在錯(cuò)誤信息頁(yè)面中被暴露出來(lái)。
在網(wǎng)絡(luò)應(yīng)用中,黑客通常會(huì)用惡意代碼去塞滿內(nèi)存,當(dāng)程序崩潰、進(jìn)入到內(nèi)存的隨機(jī)點(diǎn)時(shí),惡意代碼就會(huì)被釋放。
弱版式語(yǔ)言提供能力和動(dòng)態(tài)靈活性,但這也需要更靈活的設(shè)計(jì)和測(cè)試,以加強(qiáng)針對(duì)攻擊的保護(hù)。
密碼信息漏洞無(wú)法斬?cái)?/strong>
軟件世界充斥著大量的安全問(wèn)題。當(dāng)一個(gè)新興技術(shù)誕生,新的安全威脅也隨之而來(lái)。除了上述問(wèn)題以外,下面還有一些區(qū)塊鏈安全方面的隱患值得注意。
壞的加密貨幣會(huì)帶來(lái)很多問(wèn)題。密碼學(xué)方面的安全是隱私的保障,如果隱私問(wèn)題被突破,那么一切安全問(wèn)題就無(wú)從談起。IOTA團(tuán)隊(duì)在他們的產(chǎn)品的首個(gè)版本開發(fā)過(guò)程中,在編寫密碼數(shù)據(jù)庫(kù)時(shí)就犯了錯(cuò)誤。編制密碼時(shí),有一個(gè)無(wú)法避免的問(wèn)題在于,所有復(fù)雜的軟件都存在漏洞,所以你的密碼信息必然會(huì)有漏洞。
已有的密碼數(shù)據(jù)庫(kù),經(jīng)過(guò)了學(xué)術(shù)界的審核,也在經(jīng)年累月的實(shí)踐中經(jīng)受住了考驗(yàn)。
在數(shù)字錢包的世界中,隨機(jī)數(shù)據(jù)的生成必須真的是隨機(jī)的。尤其是在加密貨幣早期階段,有些錢包并沒有達(dá)到這一要求。
加密貨幣地址要求必須是唯一的。這一唯一性來(lái)自于一個(gè)隨機(jī)數(shù)值生成器,而這個(gè)生成器需要一個(gè)誘因才能觸發(fā)。如果這個(gè)誘因不是隨機(jī)的,那整個(gè)系統(tǒng)就會(huì)失效。
如果隨機(jī)性失效,一個(gè)重大的后果就是有很多相同的地址會(huì)被生成。想象一下,如果同一錢包地址X被分配給不同的人,那如果一個(gè)款項(xiàng)被分配進(jìn)X,究竟誰(shuí)有資格領(lǐng)取這筆款項(xiàng)?
隨機(jī)性失效帶來(lái)的另一個(gè)問(wèn)題是,黑客有可能破解制造誘因的算法,那么他就可以重復(fù)為自己制造誘因,從而控制整個(gè)系統(tǒng)。
問(wèn)題源源不斷
安全性問(wèn)題是一場(chǎng)永無(wú)止境的戰(zhàn)斗,就算是編程人員、架構(gòu)師、測(cè)試人員解決了代碼中的所有問(wèn)題,運(yùn)行過(guò)程中的問(wèn)題仍然層出不窮。
在一個(gè)可信工作環(huán)境中,如果有壞人掌控了整個(gè)網(wǎng)絡(luò)的51%,那么網(wǎng)絡(luò)的完整性就被破壞掉了。博弈論為這種攻擊提供了緩沖。一個(gè)新的加密貨幣,因?yàn)樵诰W(wǎng)絡(luò)中的暴露程度最低,可能遭受的攻擊幾率最大。但51%的網(wǎng)絡(luò)攻擊會(huì)損傷加密貨幣本身的價(jià)值,所以攻擊者實(shí)際上是在攻擊他們自己。
區(qū)塊鏈因?yàn)榇嬖谟诰W(wǎng)絡(luò)中,所以就像整個(gè)網(wǎng)絡(luò)一樣,暴露在黑客面前。例如,你要從一個(gè)網(wǎng)上交易所購(gòu)買代幣,植入攻擊、跨站腳本、釣魚攻擊,還有其他各種傳統(tǒng)黑客攻擊方式就會(huì)接踵而至。
結(jié)語(yǔ)
在編程人員努力對(duì)抗各種漏洞的時(shí)候,也需要思考如何將對(duì)安全問(wèn)題的防范嵌入到整個(gè)開發(fā)過(guò)程中。市面上有一些輔助性的工具,但編程人員需要首先理解他們自己在面對(duì)此類問(wèn)題時(shí)的脆弱之處。
去中心化應(yīng)用安全計(jì)劃(DASP,The Decentralized Application Security Project)致力于成為區(qū)塊鏈安全信息和資源的知識(shí)庫(kù)。他們?cè)陂_源Web應(yīng)用安全計(jì)劃(OWASP,the Open Web Application Security Project)上進(jìn)行建模。年度OWASP名單會(huì)將現(xiàn)有的10個(gè)主要網(wǎng)絡(luò)應(yīng)用隱患列入其中。而DASP希望在區(qū)塊鏈領(lǐng)域發(fā)布同類榜單。
不是所有的網(wǎng)絡(luò)攻擊都可以被預(yù)先估計(jì)到。所謂“零日攻擊”就是指在一次攻擊中,黑客先于所有人知道相關(guān)情況。因此,編程人員需要在設(shè)計(jì)和部署軟件的過(guò)程中,模仿黑客的思維進(jìn)行思考。如果你不能在代碼中找到軟肋,那就等著黑客前來(lái)攻擊吧。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。