區塊鏈系統層級的弱點與攻擊
區塊鏈是運作於電腦節點之間的peer-to-peer網路,所以設計或開發很差的區塊鏈都會危及節點的安全.本文使用真實案例讓讀者了解針對區塊鏈設計或實施的系統層面的攻擊.
比特幣駭客
比特幣被設計為一種加密貨幣,這意味著它需要驗證交易金額是否小於發送者錢包中的金額。該交易驗證代碼包含一個integer overflow漏洞,允許非常大的交易金額通過驗證。攻擊者通過向攻擊者控制的帳號發送 1840 億顆比特幣(但比特幣實際上最多只能有2100萬顆)的交易來使用此漏洞。這將讓攻擊者控制超過 98% 的比特幣,並將破壞整體比特幣的價值。但從賽局理論的觀點來說這樣的破壞對攻擊者來說毫無利益可言。
比特幣網路決定倒回區塊鏈以解除這個攻擊。這是一個重要的決定,因為分佈式帳本被設計為不可變的,這其實破壞了區塊鏈的基本精神,但是為了全體使用者的利益而這樣做是否正確則有待時間證明。
這次的攻擊讓我們了解在部署之前對區塊鏈代碼進行全面安全測試的重要性。integer overflow漏洞是一個眾所周知的開發上的漏洞,很可能已被確定為安全評估的一部分。
Verge貨幣駭客
Verge 加密貨幣是一種專注於保護使用者隱私的加密貨幣。 駭客是使用了這個加密貨幣的以下幾種功能而成功入侵的:
- 彈性的時間戳記:由於區塊鏈上缺乏同步的time server,節點會接受當前時間 2 小時內誤差時間戳記的任何區塊或交易
- Difficulty Updates:Verge 使用 Dark Gravity Wave演算法,根據過去區塊時間的sliding window,在每個區塊的基礎上變動 PoW挖掘難度
- 共識演算法:Verge 使用PoW,但支援五種演算法(Scrypt,X17,Lyra2rev2,myr-groestl,blake2s),而不是只用一種
攻擊者利用這三個功能來控制 Verge 區塊鏈。 通過將每隔一個區塊的時間戳偽造為過去一個小時(正常是30分鐘做出一個區塊),攻擊者看起來比正常速度建立區塊慢了一些。 結果,Dark Gravity Wave演算法降低了攻擊者使用的挖掘演算法(scrypt)的難度。 使用 scrypt 進行挖掘變得異常簡單,允許攻擊者使用不到 10% 的網路運算資源執行 51% 的攻擊(意味可以執行雙重花費)。
為了修正這個問題,Verge 將時間戳記容忍度從兩小時縮短到十五分鐘。 這最大程度上減少了攻擊者對挖礦難度的影響。
這次攻擊對區塊鍊的資安教訓是”系統的複雜性會損害安全性”。 只有結合 Verge 加密貨幣中內建的三個功能才能進行攻擊。 這攻擊還顯示了扭曲時間這類攻擊的有效性(利用時間戳的靈活性)以及頻繁更新挖掘難度的危險。
EOS的弱點
EOS 是一個開源的智慧合約平台。作為智慧合約平台,EOS 軟體需要能夠解析和執行智慧合約檔案。解析函數中的buffer out of bounds的寫入漏洞允許惡意智慧合約利用 EOS 區塊鏈。這個漏洞是因為可以繞過ASLR(Address Space Layout Randomization) 並從受到攻擊的超級節點拿到remote shell。其結果是,駭客可以完全破壞區塊鍊網路和運行它的所有節點。但這從賽局理論來說卻沒有意義,因為這樣的攻擊對於攻擊者來說是沒有得到利益的。
由於 EOS專案 尚未啟動,EOS 開發人員能夠在他們的 Github 頁面上發布修復,而沒有漏洞被利用的風險。這個過程證明了:
- 一般性的開發上錯誤仍然是一個問題
- 外部資源審查代碼的價值,並且易受攻擊的智慧合約平台可以讓惡意智慧合約利用運行區塊鏈軟體的節點。
Lisk加密貨幣
Lisk 是一種加密貨幣,容易受到利用兩個內建功能的攻擊。 Lisk 用使用者的公鑰 (SHA-256) hash最後 64 bit作為他們在區塊鏈上的錢包地址。 在使用者執行交易(發送加密貨幣)之前,該地址不會與區塊鏈上的特定公鑰綁定。
該系統可能會受到攻擊的原因是,向帳號發送交易不會將錢包地址與公鑰綁定,因為這需要使用者主動進行。如果沒有綁定任何收到金額的地址是無主的。 而找到可以綁定到特定錢包地址的公鑰複雜性(最多為 2的64次方的運算 — 而這是有可能破解的)能夠讓攻擊者宣告不同的地址。
漏洞被回報之後,Lisk 開發人員發佈公告描述該問題並建議使用者採取行動,將他們的錢包地址與公鑰關聯起來,如果使用者沒有這樣做,此類的攻擊還是會再度發生。 然而,Lisk 仍然容易受到攻擊,並且可能容易受到競爭條件(race conditions)的影響,即攻擊者試圖在為其初始交易金額和發送金額之間的宣告地址來聲明這個交易是屬於這個攻擊者的。
Pigoncoin駭客
Bitcoin Core 是一種加密貨幣錢包,專為與比特幣加密貨幣一起使用而設計的.對Bitcoin Core代碼特定部分的一系列更新造成了兩個不同的漏洞,兩個漏洞都處理區塊中的交易嘗試雙重花費相同輸入的可能性.在某些版本的Bitcoin Core中,如果嘗試處理這樣的區塊 (DoS),這樣的交易將導致節點崩潰.在某些版本中,這種雙重花費區塊將被視為有效,允許憑空創造價值.
Bitcoin Core開發人員在比特幣因這個漏洞被使用之前修復了該問題.但是,從Bitcoin Core代碼中分叉出多種其他加密貨幣,這使得這些加密貨幣容易受到相同的攻擊,需要發布相同的補丁.而Pigeoncoin 是比特幣變種,未能及時修補其軟體,攻擊者利用Pigeoncoin這個漏洞創造了 2.35 億個Pigeoncoin .這大約是Pigeoncoin供應量的 25%,價值約 15,000 美元.
Bitcoin Core 開發團隊針對該漏洞發布了一個補丁,使錢包能夠直接忽略格式錯誤的區塊.從這裡我們學到
- 監控繼承過來代碼的錯誤修正是必不可少的
- 必須盡快對區塊鏈軟體的更新