區(qū)塊鏈安全漏洞隱患,DAO黑客可重入性
在區(qū)塊鏈領域中,安全方面的考慮壓倒了軟件中所有其他要考慮因素。如果實現(xiàn)不了安全, 其他任何方面做得再好也于事無補。
區(qū)塊鏈被證明分散的, 可信任的事務工作, 但許多區(qū)塊鏈的安全漏洞仍然存在。
安全漏洞存在于設計階段、編碼階段和操作階段。同樣,區(qū)塊鏈有可能受到黑客的攻擊。
區(qū)塊鏈安全漏洞
智能合約的存在就像鉆石一樣是永恒存在的,只要它們被部署的區(qū)塊鏈繼續(xù)被使用。因此,所有的漏洞和區(qū)塊鏈安全漏洞也會像智能合約一樣存在。
通常, 每個區(qū)塊鏈提供其自己的編程語言來實現(xiàn)智能合約。
智能合約的編程語言區(qū)塊鏈會利用他們自己的語言來開發(fā)智能合約。
例如,以太坊平臺包含了編寫智能合約的可靠語言。創(chuàng)作者設計的是一種堅固的圖靈機完整語言。
圖靈機完整的語言實質(zhì)上允許程序員實現(xiàn)底層系統(tǒng)所能做到的任何事情。因此, 這就給程序員提供了代碼中實現(xiàn)循環(huán)的能力, 這可能會導致區(qū)塊鏈引發(fā)安全漏洞。
圖靈機完整語言圖靈機完整語言非常的復雜, 但正是這種復雜性往往會招致 bug 和漏洞。
比特幣網(wǎng)絡也有一種編程語言,它稱之為腳本。腳本的目的不是為了增強安全性。
給程序員的選項越少,區(qū)塊鏈安全漏洞進入系統(tǒng)的可能性就越小。
為了盡量減少將錯誤代碼發(fā)布到鏈外的風險, 程序員必須了解智能合約編程中固有的常見缺陷和反模式。(反模式表示錯誤的編程實踐)。
DAO黑客:可重入性問題
可重入性問題在被編寫到智能合約中的區(qū)塊鏈安全漏洞中可能排在最高的位置??芍厝胄酝ㄟ^對同一事務的多個支出來消耗一個帳戶。處理退款的用例適合這種利用,但是如果不在設計和編碼階段解決,這種缺陷就會影響到所有事務。
在迄今為止最臭名昭著的加密貨幣攻擊之一中,DAO黑客就利用了可重入性。沒有組織領導決定如何運行DAO(分散的自治組織),使他們能夠?qū)ν顿Y的項目進行投票。
它在第一個月籌集了超過1.5億美元的資金。2016年6月17日,黑客從該組織的“重入性”漏洞中抽走了5000萬美元。從以太經(jīng)典(ETC)到以太幣(ETH)的硬叉導致了解決這次黑客攻擊所產(chǎn)生問題的所有努力。
反模式易陷入可重入性代碼脆弱的可重入性邏輯看起來是這樣的:
處理支付()的函數(shù)
(1) 檢查交易的有效性、收款人和賬戶余額;
(2) 處理交易;
(3) 更新系統(tǒng)狀態(tài),以顯示已處理了事務;
乍一看,邏輯看起來是正確和完整的,但缺陷在于步驟3之前執(zhí)行步驟2的順序。
對函數(shù)的第一次調(diào)用將繼續(xù)處理步驟2,而對同一事務的另一次調(diào)用則可以輸入該函數(shù)。由于狀態(tài)信息仍處于初始狀態(tài),尚未在步驟3中處理,因此第二個調(diào)用將檢查為要處理的有效事務。
因此,該系統(tǒng)第二次為同一義務支出貨幣。黑客在狀態(tài)正確設置之前,將多個事務快速地發(fā)送到函數(shù)中。
治療可重入性
對算法的這一修改糾正了上面的問題:
處理支付()的函數(shù)
(1) 檢查交易的有效性、收款人和賬戶余額;
(2) 更新系統(tǒng)狀態(tài)以顯示已處理了事務;
(3) 處理交易;
代碼必須說明所有必要的異常處理,并且它還必須說明所有邏輯依賴項。
OverflowOverflow是程序員需要注意的另一個常見的安全缺陷。
一些編程語言提供了強類型,而其他語言提供了弱類型。例如,強類型語言不允許程序員將字符串數(shù)據(jù)分配給數(shù)值變量,弱類型語言允許執(zhí)行此類操作。
強類型語言實施范圍有很大的限制。如果一個數(shù)組是十個元素,程序員就不能嘗試訪問第十一個元素。弱類型語言允許這樣的行為,但會導致崩潰。如果一個變量所允許的最大值是99,并且為它賦值100,那么運行它時就會看到它崩潰!
因此,Overflow是黑客常使用的手段。如果黑客向智能合約提供了一個超出代碼處理范圍的參數(shù),就會產(chǎn)生崩潰結果。這樣的崩潰助長了多重攻擊。崩潰可能觸發(fā)拒絕服務攻擊(DDoS攻擊),這時,關于系統(tǒng)內(nèi)部的重要信息有時會在錯誤消息中顯示出來。
在web應用程序中,黑客經(jīng)常用自己的惡意代碼填充內(nèi)存,因此,當程序崩潰并進入內(nèi)存中的一個隨機點時,惡意代碼就會執(zhí)行。
弱類型語言提供了強大的功能和動態(tài)靈活性,但它們也需要更嚴格的設計和測試來抵抗攻擊。
大量的安全問題困擾著軟件世界。隨著新技術的出現(xiàn),出現(xiàn)了新的威脅。除了上面提到的漏洞外,這些明顯的缺陷只是許多其他區(qū)塊鏈安全漏洞中的一些。
糟糕的密碼系統(tǒng)制造了很多麻煩。密碼學確保隱私,當隱私被破壞時,一切都會被破壞。IOTA團隊犯了一個錯誤,在產(chǎn)品的初始版本中從頭編寫自己的密碼庫。滾動自己來加密所固有的問題是,所有復雜的軟件都包含錯誤。
建立的密碼庫在經(jīng)過學術界的審查后仍然存在,并且隨著時間的推移,證明它是可靠的。
在錢包的世界里,隨機數(shù)生成必須是真正隨機的。特別是在加密貨幣出現(xiàn)的初期,一些錢包就不能滿足這一要求。
加密貨幣要求地址必須是唯一的。唯一性來自一個隨機數(shù)生成器,并且隨機數(shù)生成器需要一個種子來開始這個過程。如果種子不是真正隨機的,系統(tǒng)就會失敗。
一個壞的隨機性的結果意味著同一地址被多次創(chuàng)建。想象一下,錢包將地址X分配給某人A,然后稍后某個時候?qū)⒌刂稾分配給某人B。當付款到達地址X時它只適用于一個人。那么到底哪個人會得到錢?
當黑客找出用于創(chuàng)建種子的算法時,會出現(xiàn)另一個隨機性不好的問題。黑客為自己重新生成種子,并擁有系統(tǒng)。
安全永無止境安全是一場永無止境的戰(zhàn)斗,即使程序員、架構師和測試人員從代碼中刪除了所有漏洞,操作漏洞依然存在。
在一個工作環(huán)境的證明中,如果壞的參與者控制了網(wǎng)絡的51%,那么完整性就會被破壞。博弈論為這種攻擊提供了緩解。但是51%的攻擊摧毀了貨幣的價值,所以攻擊者只是傷害了他們自己。
區(qū)塊鏈生活在互聯(lián)網(wǎng)上,和互聯(lián)網(wǎng)一樣,也和黑客有同樣的接觸。例如,假設您從一個網(wǎng)站上的交換器中購買代幣。注射式攻擊、跨站點編寫腳本、網(wǎng)絡釣魚攻擊以及所有其他傳統(tǒng)網(wǎng)站攻擊都占上風。
結語正如程序員要防范錯誤一樣,程序員也必須在開發(fā)中考慮到安全性。雖然存在一些幫助程序員完成任務的工具,但是程序員必須首先了解他們自己的漏洞以防止它們。
分散式應用安全項目(DASP)希望成為區(qū)塊鏈安全性信息和資源的存儲庫。他們在開放的Web應用安全項目(OWASP)上對自己進行了一些建模。年度OWASP前10名明確列出了目前存在的主要網(wǎng)頁應用程序漏洞。DASP前10名希望為區(qū)塊鏈提供同等的資源。
并非所有的攻擊都是事先知道的。零日攻擊定義了黑客在其他人之前就知道的漏洞。所以程序員在設計和實現(xiàn)軟件時必須像攻擊者一樣去思考。如果您沒有在代碼中找到漏洞,那么希望尋找利潤的黑客來替你找到它們。