區塊鏈安全————區塊鏈技術安全討論

FLy_鵬程萬里發表於2018-06-18

0x00 背景介紹

區塊鏈技術是金融科技(Fintech)領域的一項重要技術創新。

作為分散式記賬(Distributed Ledger Technology,DLT)平臺的核心技術,區塊鏈被認為在金融、徵信、物聯網、經濟貿易結算、資產管理等眾多領域都擁有廣泛的應用前景。區塊鏈技術自身尚處於快速發展的初級階段,現有區塊鏈系統在設計和實現中利用了分散式系統、密碼學、博弈論、網路協議等諸多學科的知識,為學習原理和實踐應用都帶來了不小的挑戰。

區塊鏈屬於一種去中心化的記錄技術。參與到系統上的節點,可能不屬於同一組織、彼此無需信任;區塊鏈資料由所有節點共同維護,每個參與維護節點都能複製獲得一份完整記錄的拷貝,由此可以看出區塊鏈技術的特點:

  • 維護一條不斷增長的鏈,只可能新增記錄,而發生過的記錄都不可篡改;
  • 去中心化,或者說多中心化,無需集中的控制而能達成共識,實現上儘量分散式;
  • 通過密碼學的機制來確保交易無法抵賴和破壞,並儘量保護使用者資訊和記錄的隱私性。

雖然單純從區塊鏈理解,僅僅是一種資料記錄技術,或者是一種去中心化的分散式資料庫儲存技術,但如果和智慧合約結合擴充套件,就能讓其提供更多複雜的操作,現在活躍的各個數字貨幣就是其中一種表現形式。

0x01 區塊鏈安全性思考

由於區塊鏈技術的特性,在設計之處就想要從不同維度解決一部分安全問題:

01 Hash唯一性

在blockchain中,每一個區塊和Hash都是以一一對應的,每個Hash都是由區塊頭通過sha256計算得到的。因為區塊頭中包含了當前區塊體的Hash和上一個區塊的Hash,所以如果當前區塊內容改變或者上一個區塊Hash改變,就一定會引起當前區塊Hash改變。如果有人修改了一個區塊,該區塊的 Hash 就變了。為了讓後面的區塊還能連到它,該人必須同時修改後面所有的區塊,否則被改掉的區塊就脫離區塊鏈了。由於區塊計算的算力需求強度很大,同時修改多個區塊幾乎是不可能的。

由於這樣的聯動機制,塊鏈保證了自身的可靠性,資料一旦寫入,就無法被篡改。這就像歷史一樣,發生了就是發生了,從此再無法改變,確保了資料的唯一性。

02 密碼學安全性

以比特幣為例,數字貨幣採用了非對稱加密,所有的資料儲存和記錄都有數字簽名作為憑據,非對稱加密保證了支付的可靠性。

03 身份驗證

在數字貨幣交易過程中,由一個地址到另一個地址的資料轉移都會對其進行驗證:

- 上一筆交易的Hash(驗證貨幣的由來)
- 本次交易的雙方地址
- 支付方的公鑰
- 支付方式的私鑰生成的數字簽名

驗證交易是否成功屬實會經過如下幾步:

- 找到上一筆交易確認貨幣來源
- 計算對方公鑰指紋並與其地址比對,保證公鑰的真實性
- 使用公鑰解開數字簽名,保證私鑰真實性
04 去中心化的分散式設計

針對區塊鏈來說,賬本資料全部公開或者部分公開,強調的是賬本資料多副本存在,不能存在資料丟失的風險,區塊鏈當前採用的解決方案就是全分散式儲存,網路中有許多個全節點,同步所有賬本資料(有些同步部分,當然每個資料儲存的副本足夠多),這樣網路中的副本足夠多,就可以滿足高可用的要求,丟失資料的風險就會低很多。所以建議部署區塊鏈網路時,全節點儘量分散,分散在不同地理位置、不同的基礎服務提供商、不同的利益體等。

05 傳輸安全性

在傳輸過程中,資料還未持久化,這部分空中資料會採用HTTP+SSL(也有采用websocket+websocketS)進行處理,從而保證資料在網路傳輸中防篡改且加密處理。

0x02 數字貨幣安全性思考

01 BTC

比特幣(Bitcoin,代號BTC)是一種用去中心化、全球通用、不需第三方機構或個人,基於區塊鏈作為支付技術的電子加密貨幣。比特幣由中本聰於2009年1月3日,基於無國界的對等網路,用共識主動性開源軟體發明創立。比特幣也是目前知名度與市場總值最高的加密貨幣。

比特幣區塊結構


錢包和交易

比特幣錢包的地址就是公鑰通過 Base58 演算法編碼後的一段字串,使用該演算法可以將公鑰中的一些不可見字元編碼成平時常見的字元。Base58 相對於 Base64 來說消除了非字母或數字的字元,如:“+”和“/”,同時還消除了那些容易產生混淆的字元,如數字 0 和大寫字母 O,大寫字母 I 和小寫字母 l。這一段用作比特幣錢包地址的字串就相當於一個比特幣賬戶。

交易屬於比特幣中的核心部分,區塊鏈應用到數字貨幣上也是為提供更安全可靠的交易。交易之前會先確認每一筆筆交易的真實性,如果是真實的,交易記錄便會寫入到新的區塊中去,而一旦加入到區塊鏈中了也就意味著再也不能被撤回和修改。

交易驗證流程大概為:

  1. 驗證交易雙方的錢包地址,也就是雙方的公鑰。
  2. 支付方的上一筆的交易輸出,前面也說到了錢包裡面是沒有存放你的比特幣數量的,而你每一筆交易都會產生交易輸出記錄到區塊鏈中。通過交易輸出可以確認支付方是否能夠支付一定數量的比特幣。
  3. 支付方的私鑰生成的數字簽名。如果使用支付方的公鑰能解開這個數字簽名便可以確認支付方的身份是真實的,而不是有人惡意的使用當前的支付方的錢包地址在做交易。

一旦這些資訊都能得到確認便可以將交易資訊寫入到新的區塊中去,完成交易。受比特幣區塊大小的限制(目前的為 1MB,一筆交易資訊大概需要 500 多位元組),一個區塊最多隻能包含 2000 多筆的交易。因為區塊鏈中記錄了所有的交易資訊,所以每個比特幣錢包的交易記錄和幣的數量都是可以被查到的,但是隻要沒有對外公開承認錢包地址是屬於你的,也不會有人知道一個錢包地址的真實擁有者。

還有一種交易叫做 coinbase 交易,當礦工挖到一個新的區塊時,他會獲得挖礦獎勵。挖礦獎勵就是通過 coinbase 交易拿到手的,也一樣是需要把交易資訊新增到新的區塊中去,但是 coinbase 交易不需要引用之前的交易輸出。

安全問題

比特幣基於區塊鏈,具有去中心化結構,使用者通過一個公開的地址和金鑰來宣示所有權。某種程度上,誰掌握了這個金鑰,誰就實質性地擁有了對應地址中的比特幣資產。而區塊鏈的防篡改特徵,是指比特幣的交易記錄不可篡改,而非金鑰不會丟失。同時,也正因為區塊鏈不可篡改,金鑰一旦丟失,也意味著不可能通過修改區塊鏈記錄來拿回比特幣。

因此針對比特幣的盜幣事件屢有發生,主要是通過下面三個手段:

  1. 交易平臺監守自盜
  2. 交易所遭受黑客攻擊
  3. 使用者交易賬戶被盜

交易平臺監守自盜可以向平臺索回,但是黑客攻擊導致的盜幣,很難被追回。因為黑客一旦盜取比特幣,接下來便會通過混幣等手段進行洗白,除非有國家力量強力介入,否則追回的可能性僅僅停留在理論層面。

02 ETH

以太幣(Ether,代號ETH)為以太坊區塊鏈上的代幣,可在許多加密貨幣的外匯市場上交易,它也是以太坊上用來支付交易手續費和運算服務的媒介。以太坊(Ethereum)是一個開源的有智慧合約功能的公共區塊鏈平臺。通過其專用加密貨幣以太幣提供去中心化的虛擬機器(稱為“以太虛擬機器”Ethereum Virtual Machine)來處理點對點合約。

智慧合約

以太坊與比特幣最大的一個區別——提供了一個功能更強大的合約程式設計環境。如果說比特幣的功能只是數字貨幣本身,那麼在以太坊上,使用者還可以編寫智慧合約應用程式,直接將區塊鏈技術的發展帶入到 2.0 時代。


以太坊中的智慧合約是執行在虛擬機器上的,也就是通常說的 EVM(Ethereum Virtual Machine,以太坊虛擬機器)。這是一個智慧合約的沙盒,合約儲存在以太坊的區塊鏈上,並被編譯為以太坊虛擬機器位元組碼,通過虛擬機器來執行智慧合約。由於這個中間層的存在,以太坊也實現了多種語言的合約程式碼編譯,網路中的每個以太坊節點執行 EVM 實現並執行相同的指令。如果說比特幣是二維世界的話,那麼以太坊就是三維世界,可以實現無數個不同的二維世界。

安全問題

ETH最大的特點就是智慧合約,而智慧合約漏洞也就導致了ETH的安全問題。

2016年黑客通過The Dao,利用智慧合約中的漏洞,成功盜取360萬以太幣。THE DAO持有近15%的以太幣總數,因此這次事件對以太坊網路及其加密幣都產生了負面影響。

The DAO事件發生後,以太坊創始人Vitalik Buterin提議修改以太坊程式碼,對以太坊區塊鏈實施硬分叉,將黑客盜取資金的交易記錄回滾,得到了社群大部分礦工的支援,但也遭到了少數人的強烈反對。最終堅持不同意回滾的少數礦工們將他們挖出的區塊鏈命名為Ethereum Classic(以太坊經典,簡稱ETC),導致了以太坊社群的分裂。在虛擬貨幣歷史上,這是第一次,也可能唯一一次由於安全問題導致的區塊鏈分叉事件。

無獨有偶2017年7月19日, 多重簽名錢包Parity1.5及以上版本出現安全漏洞,15萬個ETH被盜,共價值3000萬美元。

兩次被盜事件都是因為智慧合約中的漏洞。讓我們看到,虛擬貨幣的安全不僅僅是平臺和個人,區塊鏈上的應用,也是我們應該關注的內容。

03 XMR

門羅幣(Monero,代號XMR)是一個建立於2014年4月開源加密貨幣,它著重於隱私、分權和可擴充套件性。與自比特幣衍生的許多加密貨幣不同,Monero基於CryptoNote協議,並在區塊鏈模糊化方面有顯著的演算法差異。

隱蔽地址

隱蔽地址是為了解決輸入輸出地址關聯性的問題。每當傳送者要給接收者傳送一筆金額的時候,他會首先通過接收者的地址(每次都重新生成),利用橢圓曲線加密算出一個一次性的公鑰。然後傳送者將這個公鑰連同一個附加資訊傳送到區塊鏈上,接收方可以根據自己的私鑰來檢測每個交易塊,從而確定傳送方是否已經傳送了這筆金額。當接收方要使用這筆金額時,可以根據自己的私鑰以及交易資訊計算出來一個簽名私鑰,用這個私鑰對交易進行簽名即可。

環簽名

隱蔽地址雖然能保證接收者地址每次都變化,從而讓外部攻擊者看不出地址關聯性,但並不能保證傳送者與接收者之間的匿名性。因此門羅幣提出了一個環簽名的方案——事實上,在古代就已經有類似的思想了:如圖5所示,聯名上書的時候,上書人的名字可以寫成一個環形,由於環中各個名字的地位看上去彼此相等,因此外界很難猜測發起人是誰。這就是環簽名。


除了交易地址,交易金額也會暴露部分隱私。門羅幣還提供了一種叫做環狀保密交易(RingCT)的技術來同時隱藏交易地址以及交易金額。這項技術正在逐步部署來達到真正的匿名。這項技術採用了多層連線自發匿名組簽名(Multi-layered Linkable Spontaneous Anonymous Group signature)的協議。

安全問題

比特幣交易私密性方面做的不太好,關於貨幣隱私的兩個基本屬性:

  1. 不可連結性(Unlinkability):無法證明兩個交易是傳送給同一個人的,也就是無法知道交易的接收者是誰。
  2. 不可追蹤性(Untraceability):無法知道交易的傳送者是誰。

比特幣交易要傳送地址資訊,很明顯不符合之上的要求。門羅幣通過隱蔽地址來保證不可連結性,通過環簽名來保證不可追蹤性,從而給使用者的交易資訊提供了很好的隱私性。另一方面,比特幣挖礦主要依賴於大量專業化的專用積體電路(ASIC)。它的演算法在ASIC上的執行速度遠超於在標準家庭電腦或者膝上型電腦上執行。相比之下,門羅幣的挖礦演算法要精良得多。它並不依賴於ASIC,使用任何CPU或GPU都可以完成,這就意味著門羅幣具有更低的挖掘門檻。

門羅幣的這些特性,使其成為黑產挖礦的不二之選。過去的一段時間,出現了許多以門羅幣挖礦為目的的網路攻擊事件。

04 小結

在以太坊這種平臺區塊鏈上,如果執行智慧合約,應用程式出現漏洞,同樣也會威脅其上的數字資產。

以太坊解決了比特幣的單應用的侷限,使得區塊鏈像一個作業系統,開發者可以在其上搭建自己的“應用”。門羅幣降低了挖礦的門檻,同時又滿足了交易私密性需求。這些特性都符合黑產的需要,過去的一段時間,以門羅幣挖礦為目的的網路攻擊事件時有發生。

0x03 交易平臺安全性思考

隨著區塊鏈技術的迅速發展,使得虛擬貨幣漸漸走入的大眾的視線。隨之而來的就是大量的虛擬幣交易平臺。虛擬貨幣交易平臺就是為使用者提供虛擬貨幣與虛擬貨幣之間兌換的平臺,部分平臺還提供人民幣與虛擬貨幣的p2p兌換服務。現在交易平臺平均每天的交易額都是數以億計,然而交易平臺背後的經營者能力與平臺的自身的安全性並沒有很好的保障。從14年至今據不完全統計,單純由於交易所安全性導致的直接損失就達到了1.8億美元之多。


隨著虛擬幣的水漲船高,交易所就成了黑客們的首要目標,據統計入侵一家交易所給黑客帶來的直接利益大約1000萬美元左右,然而交易所的安全性參差不齊和各個國家對這類平臺基本都暫時沒有好的管控策略,這給黑客帶來了很大的便利,同時也直接威脅著使用者的資金安全。

01 平臺被黑事件回顧
位元兒(Bter.com) 比特幣交易平臺被盜事件

2014-08-15 
事件簡介: 
位元兒是一家中國的山寨幣交易所。NXT等山寨幣都在上面交易。 
由於POS幣的錢包必須上線執行才能獲取利息。因此NXT錢包必須線上執行,給了入侵的機會。POS幣不能冷錢包儲存,暴露出POS的重大安全隱患。黑客盜走NXT後與平臺方通過交易留言進行了談判:


並要求平臺方支付BTC作為贖金換回NXT


最終平臺支付了110個BTC,卻未能完全贖回NXT,只能要求社群回滾NXT的交易區塊。本次位元兒被黑是歷史上第一次完全公開展現的網路犯罪,暴露出交易平臺和數字貨幣在當時沒有監管野蠻生長的嚴肅問題。

以太幣組織The DAO被黑事件

2016-06 
事件簡介: 
以太幣的去中心化組織The Dao被黑,價值逾5000萬美元的以太幣外溢位DAO的錢包。以太幣(ETH)市場價格瞬間縮水,從記錄高位21.50美元跌至15.28美元,跌幅逾23%。 
在此前的智慧合約寫法中,有三個嚴重漏洞,黑客也正是利用這幾個漏洞攻擊The DAO竊取以太幣。

fallback函式呼叫

向合約地址傳送幣有兩種寫法:


二者都是傳送20個ether,都是 個新的message call, 同的是這兩個調的gasli mit 樣。send()給予0的gas(相當於 call.gas(0).value()() ), call.value()() 給予全部(當前剩餘)的gas。 當我們調某個智慧合約時,如果指定的函式找到,或者根本就沒指定調哪個函式(如傳送ether)時,fallback函式就會被呼叫。

當通過 addr.call.value()() 的 式傳送ether,和send() 樣,fallback函式會被調 ,但是傳遞給fallback函式的是當前剩餘的所有gas,如果精設計個fallback就能影響到系統,如寫storage, 新調新的智慧合約等等。

遞迴呼叫

一段使用者從智慧合約中取款的程式碼如下:


如果付款方的合約賬戶中有1000個ether,而取款方有10個ether,此處就有嚴重的遞迴呼叫問題,取款方可以將1000個ether全部取走。

呼叫深度限制

合約可以通過message call呼叫其他智慧合約, 被呼叫的合約繼續通過message call在呼叫其他合約,這樣的巢狀呼叫深度限制為1024。


如果攻擊者製造以上的1023個巢狀呼叫,之後再呼叫sendether(),就可以讓add.send(20ether)失效,而其他執行成功:


在DAO的程式碼


當合約執行到withdrawRewardFor(msg.sender);進入到函式withdrawRewardFor判斷


putOut如下:


和此前的舉例類似,DAO通過 addr.call.value()() 傳送以太幣 沒有選擇 send() 從 客只需要建立fallback再次調 splitDAO() 即可轉移多份以太幣,PoC如下:


The DAO事件給整個以太坊社群帶來了重大影響,也導致了之後的硬分叉和ETC(以太經典)的剝離。

Bitfinex遭黑客攻擊事件

2016-08 
事件簡介:
Bitfinex是交易比特幣、ether和萊特幣等數字貨幣的最大交易所之一。
根據Bitfinex在8月2日凌晨釋出的公告,該交易所在發現了一個安全漏洞後便停止了交易。釋出在官網上的宣告表示:


Bitfinex負責社群和產品開發的主管塔克特(Zane Tackett)證實,119,756個比特幣遭竊,該公司已經知道相關係統是如何被入侵的。以週二的價格計算,失竊比特幣價值約6,500萬美元,受此訊息影響,全球比特幣價格應聲下跌25%。


隨後Bitfinex官網釋出公告稱這次損失將由平臺上所有使用者共同承擔,這將導致每位使用者的賬戶平均損失36%

對於類似比特幣這樣的數字貨幣,由於是通過數學演算法挖礦形成,與實體質地的紙幣不同,這些數字貨幣交易的安全性就完全體現在交易所的風險控制能力以及防黑客能力上。

Parity多重簽名錢包被盜事件

2017-07 
事件簡介: 
Parity是一款多重簽名錢包,是目前使用最廣泛的以太坊錢包之一,創始人兼CTO 是以太坊前CTO黃皮書作者Gavin Woods。
7 月 19 日,Parity釋出安全警報,警告其錢包軟體1. 5 版本及之後的版本存在一個漏洞。據該公司的報告,確認有150,000ETH(大約價值 3000 萬美元)被盜。據Parity所說,漏洞是由一種叫做wallet.sol的多重簽名合約出現bug導致。後來,白帽黑客找回了大約377,000 受影響的ETH。


本次攻擊造成了以太幣價格的震盪,Coindesk的資料顯示,事件曝光後以太幣價格一度從235美元下跌至196美元左右。此次事件主要是由於合約程式碼不嚴謹導致的。我們可以從區塊瀏覽器看到黑客的資金地址。


可以看到,一共盜取了153,037 個ETH,受到影響的合約程式碼均為Parity的創始人Gavin Wood寫的Multi-Sig庫程式碼。通過分析程式碼可以確定核心問題在於越權的函式呼叫,合約介面必須精心設計和明確定義訪問許可權,或者更進一步說,合約的設計必須符合某種成熟的模式,或者標準,合約程式碼部署前最好交由專業的機構進行評審。否則,一個不起眼的程式碼就會讓你丟掉所有的錢。

USDT發行方Tether遭受黑客攻擊事件

2017-12 
事件簡介: 
Tether公司是USDT代幣的發行公司——USDT是一種與美元掛鉤的加密貨幣,如今正在被交易所廣泛用於進行交易。該公司在公告中聲稱其系統遭受攻擊,已經導致價值3000萬美元的USDT代幣被盜。


被盜的代幣不會再贖回,但Tether公司表示他們正在試圖恢復令牌,以確保這些交易所不再交易或引入這些被盜的資金,不讓這些資金回到加密貨幣經濟。此次被黑事件後,比特幣的價格下降了5.4%,是11月13日以來的最高紀錄。然而,Tether被盜宣告一出,國外社群有使用者認為,該地址中被盜的3000萬美元只是Tether掩耳盜鈴的第一步。實際面臨的兌付危機遠遠不止3000萬美元。此次事件不僅單純的一次虛擬幣被盜事件同時導致了Tether的信任危機。

Youbite交易所被入侵事件

2017-12-19
事件簡介:
12月19日,韓國數字貨幣交易所Youbite宣佈在當天下午4時(北京時間3時)左右,交易平臺受到黑客入侵,造成的損失相當於平臺內總資產的17%。 這家平臺是韓國一家市場份額較小的數字貨幣交易平臺,在今年4月,這家平臺也曾經遭受過黑客攻擊,損失了近4000個比特幣。


Youbit表示,在4月份遭遇黑客攻擊之後,其加強了安全策略,將其餘83%的交易所資金都安全地存放在冷錢包裡。儘管如此,運營該交易所的公司Yaipan還是於本週二申請了破產,並停止了平臺交易。公告顯示,該交易所將所有客戶的資產價值減記至市場價值的75%,客戶可立即提取這部分資產。該公司表示,將在破產程式結束時償還剩餘的資金,屆時將提出保險索賠並出售公司的經營權。

03 小結

虛擬幣的火熱,直接攪動著金融市場與科技市場,也面臨著各種安全問題。現在各個國家也開始對區塊鏈市場與虛擬幣市場相繼出臺政策與治理方案,對交易所也開始納入管控範圍,韓國前段時間對其國家7家大型交易所進行了安全測試均被成功入侵,但每個交易所每天交易量是數以億計的。可見這類安全問題不是個例,作為虛擬幣交易平臺,是否有資質有能力保護線上虛擬貨幣啊安全性成為一個值得考究的問題,虛擬幣已經漸漸的從網路進入到現實世界中,然而這個過程的進步同樣帶來了很大的隱患,這也促使著政府企業以及個人對交易平臺以及虛擬幣本身更加的慎重選擇與投入。

0x04 區塊鏈在安全行業的應用

區塊鏈社群非常活躍,人們經常認為,這項技術不僅有效地推動了虛擬貨幣的發展,而且還加強了現有的安全解決方案,從區塊鏈角度解決了一些安全問題。

列舉幾個區塊鏈技術的安全用途:

01 更安全的認證機制

根據區塊鏈技術的特性,裝置可以以對等的方式識別和互動,而不需要第三方權威。伴隨著雙重身份驗證,偽造數字安全證書成為不可能,使得網路結構具有更好的安全性。比如應用到密碼驗證服務,物聯網裝置認證。

02 更安全的資料保護

在基於區塊鏈的系統中,儲存的後設資料分散在分散式賬本中,不能在一個集中點收集,篡改或者刪除。其中的資料,具有更好的完整性,可靠性以及不可抵賴性。可以應用到公共資料儲存場景,比如產權記錄,金融記錄。

03 更安全的基礎設施

利用區塊鏈分散式特性,可以提供一種分散式平臺,通過這種系統,可以訪問和利用共享的頻寬,這種方式遠優於頻寬有限的單伺服器集中模型。去中心化的平臺可以降低DDoS成功的風險,更好的保護基礎設施。比如網站,DNS解析服務等。


相關文章