區塊鏈入門安全筆記

 

雖然有着愈來愈多的人蔘與到區塊鏈的行業之中,然而因爲不少人以前並無接觸過區塊鏈,也沒有相關的安全知識,安全意識薄弱,這就很容易讓攻擊者們有空可鑽。面對區塊鏈的衆多安全問題,咱們從兩方面介紹:區塊鏈安全重點名詞解釋和攻擊方法,讓新手們更快適應區塊鏈危機四伏的安全攻防世界。
1、重點名詞解釋   
(一)錢包(Wallet) 錢包(Wallet)是一個管理私鑰的工具,數字貨幣錢包形式多樣,但它一般包含一個軟件客戶端,容許使用者經過錢包檢查、存儲、交易其持有的數字貨幣。它是進入區塊鏈世界的基礎設施和重要入口。前端

(二)冷錢包(Cold Wallet)冷錢包(Cold Wallet)是一種脫離網絡鏈接的離線錢包,將數字貨幣進行離線儲存的錢包。使用者在一臺離線的錢包上面生成數字貨幣地址和私鑰,再將其保存起來。冷錢包是在不須要任何網絡的狀況下進行數字貨幣的儲存,所以黑客是很難進入錢包得到私鑰的,但它也不是絕對安全的,隨機數不安全也會致使這個冷錢包不安全,此外硬件損壞、丟失也有可能形成數字貨幣的損失,所以須要作好密鑰的備份。web

(三)熱錢包 (Hot Wallet)熱錢包(Hot Wallet)是一種須要網絡鏈接的在線錢包,在使用上更加方便。但因爲熱錢包通常須要在線使用,我的的電子設備有可能因誤點釣魚網站被黑客盜取錢包文件、捕獲錢包密碼或是破解加密私鑰,而部分中心化管理錢包也並不是絕對安全。所以在使用中心化交易所或錢包時,最好在不一樣平臺設置不一樣密碼,且開啓二次認證,以確保本身的資產安全。算法

(四)公鑰(Public Key)公鑰(Public Key)是和私鑰成對出現的,和私鑰一塊兒組成一個密鑰對,保存在錢包中。公鑰由私鑰生成,可是沒法經過公鑰倒推獲得私鑰。公鑰可以經過一系列算法運算獲得錢包的地址,所以能夠做爲擁有這個錢包地址的憑證。數據庫

(五)私鑰(Private Key)私鑰(Private Key)是一串由隨機算法生成的數據,它能夠經過非對稱加密算法算出公並經過私鑰對區塊鏈的資產擁有絕對控制權,所以,區塊鏈資產安全的核心問題在於私鑰的存儲鑰,公鑰能夠再算出幣的地址。私鑰是很是重要的,做爲密碼,除了地址的全部者以外,都被隱藏。區塊鏈資產實際在區塊鏈上,全部者實際只擁有私鑰,,擁有者需作好安全保管。和傳統的用戶名、密碼形式相比,使用公鑰和私鑰交易最大的優勢在於提升了數據傳遞的安全性和完整性,由於二者——對應的關係,用戶基本不用擔憂數據在傳遞過程當中被黑客中途截取或修改的可能性。同時,也由於私鑰加密必須由它生成的公鑰解密,發送者也不用擔憂數據被他人僞造。瀏覽器

(六)助記詞(Mnemonic)因爲私鑰是一長串毫無心義的字符,比較難以記憶,所以出現了助記詞(Mnemonic)。助記詞是利用固定算法,將私鑰轉換成十多個常見的英文單詞。助記詞和私鑰是互通的,能夠相互轉換,它只是做爲區塊鏈數字錢包私鑰的友好格式。因此在此強調:助記詞即私鑰!因爲它的明文性,不建議它以電子方式保存,而是抄寫在物理介質上保管好,它和Keystore做爲雙重備份互爲補充。安全

(七)Keystore Keystore主要在以太坊錢包 App 中比較常見(比特幣相似以太坊Keystore機制的是:BIP38),是把私鑰經過錢包密碼再加密得來的,與助記詞不一樣,通常可保存爲文本或 JSON 格式存儲。換句話說,Keystore須要用錢包密碼解密後纔等同於私鑰。所以,Keystore須要配合錢包密碼來使用,才能導入錢包。當黑客盜取Keystore後,在沒有密碼狀況下, 有可能經過暴力破解Keystore密碼解開Keystore,因此建議使用者在設置密碼時稍微複雜些,好比帶上特殊字符,至少 8 位以上,並安全存儲。
因爲區塊鏈技術的加持使得區塊鏈數字錢包安全係數高於其餘的數字錢包,其中最爲關鍵的就是兩點:防盜和防丟。相比於盜幣事件緣由的多樣化,形成丟幣事件發生的緣由主要有五個類型:沒有備份、備份遺失、忘記密碼、備份錯誤以及設備丟失或損壞。所以,咱們在備份一個區塊鏈數字錢包的時候,對私鑰、助記詞、Keystore必定要進行多重、屢次備份,把丟幣的風險扼殺在搖籃之中。
爲你們提供一份來自imToken總結的錢包安全「十不原則」:1.    不使用未備份的錢包;2.    不使用郵件傳輸或存儲私鑰;3.    不使用微信收藏或雲備份存儲私鑰;4.    不要截屏或拍照保存私鑰;5.    不使用微信、QQ 傳輸私鑰;6.    不要將私鑰告訴身邊的人;7.    不要將私鑰發送到羣裏;8.    不使用第三方提供的未知來源錢包應用;9.    不使用他人提供的 Apple ID;10.  不要將私鑰導入未知的第三方網站。服務器

(八)公有鏈(Public Blockchain)公有鏈(Public Blockchain)簡稱公鏈,是指全世界任何人均可隨時進入讀取、任何人都能發送交易且能得到有效確認的共識區塊鏈。公鏈一般被認爲是徹底去中心化的,鏈上數據都是公開透明的,不可更改,任何人均可以經過交易或挖礦讀取和寫入數據。通常會經過代幣機制(Token)來鼓勵參與者競爭記帳,來確保數據的安全性。微信

(九)交易所 Exchange與買賣股票的證券交易所相似,區塊鏈交易所即數字貨幣買賣交易的平臺。數字貨幣交易所又分爲中心化交易所和去中心化交易所。去中心化交易所:交易行爲直接發生在區塊鏈上,數字貨幣會直接發回使用者的錢包,或是保存在區塊鏈上的智能合約。這樣直接在鏈上交易的好處在於交易所不會持有用戶大量的數字貨幣,全部的數字貨幣會儲存在用戶的錢包或平臺的智能合約上。去中心化交易經過技術手段在信任層面去中心化,也能夠說是無需信任,每筆交易都經過區塊鏈進行公開透明,不負責保管用戶的資產和私鑰等信息,用戶資金的全部權徹底在本身手上,具備很是好的我的數據安全和隱私性。目前市面上的去中心化交易全部WhaleEx、Bancor、dYdX等。中心化交易所:目前熱門的交易所大多都是採用中心化技術的交易所,使用者一般是到平臺上註冊,並通過一連串的身份認證程序(KYC)後,就能夠開始在上面交易數字貨幣。用戶在使用中心化交易所時,其貨幣交換不見得會發生在區塊鏈上,取而代之的可能僅是修改交易所數據庫內的資產數字,用戶看到的只是帳面上數字的變化,交易所只要在用戶提款時準備充足的數字貨幣可供匯出便可。當前的主流交易大部分是在中心化交易所內完成的,目前市面上的中心化交易全部幣安,火幣,OKEx等。websocket

(十)節點 Node在傳統互聯網領域,企業全部的數據運行都集中在一箇中心化的服務器中,那麼這個服務器就是一個節點。因爲區塊鏈是去中心化的分佈式數據庫,是由千千萬萬個「小服務器」組成。區塊鏈網絡中的每個節點,就至關於存儲全部區塊數據的每一臺電腦或者服務器。全部新區塊的生產,以及交易的驗證與記賬,並將其廣播給全網同步,都由節點來完成。節點分爲「全節點」和「輕節點」,全節點就是擁有全網全部的交易數據的節點,那麼輕節點就是隻擁有和本身相關的交易數據節點。因爲每個全節點都保留着全網數據,這意味着,其中一個節點出現問題,整個區塊鏈網絡世界也依舊可以安全運行,這也是去中心化的魅力所在。網絡

(十一) RPC 遠程過程調用(Remote ProcedureCall,縮寫爲 RPC)是一個計算機通訊協議。以太坊 RPC 接口是以太坊節點與其餘系統交互的窗口,以太坊提供了各類 RPC 調用:HTTP、IPC、WebSocket 等等。在以太坊源碼中,server.go是核心邏輯,負責 API 服務的注入,以及請求處理、返回。http.go實現 HTTP 的調用,websocket.go實現 WebSocket 的調用,ipc.go實現 IPC 的調用。以太坊節點默認在 8545 端口提供了 JSON RPC 接口,數據傳輸採用 JSON 格式,能夠執行 Web3 庫的各類命令,能夠向前端(例如imToken、Mist 等錢包客戶端)提供區塊鏈上的信息。

(十二)以太坊黑色情人節漏洞 ETH Black Valentine's Day2018 年 3 月 20 日,慢霧安全團隊觀測到一塊兒自動化盜幣的攻擊行爲,攻擊者利用以太坊節點Geth/Parity RPCAPI 鑑權缺陷,惡意調用eth_sendTransaction盜取代幣,持續時間長達兩年,單被盜的且還未轉出的以太幣價值就高達現價 2 千萬美金(以當時 ETH 市值計算),還有代幣種類 164 種,總價值難以估計(不少代幣還未上交易所正式發行)。

(十三)共識 Consensus共識算法主要是解決分佈式系統中,多個節點之間對某個狀態達成一致性結果的問題。分佈式系統由多個服務節點共同完成對事務的處理,分佈式系統中多個副本對外呈現的數據狀態須要保持一致性。因爲節點的不可靠性和節點間通信的不穩定性,甚至節點做惡,僞造信息,使得節點之間出現數據狀態不一致性的問題。經過共識算法,能夠將多個不可靠的單獨節點組建成一個可靠的分佈式系統,實現數據狀態的一致性,提升系統的可靠性。
區塊鏈系統自己做爲一個超大規模的分佈式系統,但又與傳統的分佈式系統存在明顯區別。因爲它不依賴於任何一箇中央權威,系統創建在去中心化的點對點網絡基礎之上,所以分散的節點須要就交易的有效與否達成一致,這就是共識算法發揮做用的地方,即確保全部節點都遵照協議規則並保證全部交易都以可靠的方式進行。由共識算法實如今分散的節點間對交易的處理順序達成一致,這是共識算法在區塊鏈系統中起到的最主要做用。區塊鏈系統中的共識算法還承擔着區塊鏈系統中激勵模型和治理模型中的部分功能,爲了解決在對等網絡中(P2P),相互獨立的節點如何達成一項決議問題的過程。簡而言之,共識算法是在解決分佈式系統中如何保持一致性的問題。

(十四)工做量證實PoW(Proof of Work)PoW(Proof of Work)是歷史上第一個成功的去中心化區塊鏈共識算法。工做量證實是大多數人所熟悉的,被比特幣、以太坊,萊特幣等主流公鏈普遍使用。
工做量證實要求節點參與者執行計算密集型的任務,可是對於其餘網絡參與者來講易於驗證。在比特幣的例子中,礦工競相向由整個網絡維護的區塊鏈帳本中添加所收集到的交易,即區塊。爲了作到這一點,礦工必須第一個準確計算出「nonce」,這是一個添加在字符串末尾的數字,用來建立一個知足開頭特定個數爲零的哈希值。不過存在採礦的大量電力消耗和低交易吞吐量等缺點。

(十五)權益證實PoS(Proof of Stake)PoS(Proof of Stake)——權益證實機制,一種主流的區塊鏈共識算法,目的是爲了讓區塊鏈裏的分佈式節點達成共識,它每每和工做量證實機制(Proof of Work)一塊兒出現,兩種都被認爲是區塊鏈共識算法裏面的主流算法之一。做爲一種算法,它經過持幣人的贊成來達成共識,目的是肯定出新區塊,這過程相對於PoW,不須要硬件和電力,且效率更高。
PoS共識中引入了 Stake 的概念,持幣人將代幣進行 Staking,要求全部的參與者抵押一部分他們所擁有的 Token 來驗證交易,而後得到出塊的機會,PoS共識中會經過選舉算法,按照持幣量比例以及 Token 抵押時長,或者是一些其餘的方式,選出打包區塊的礦工。礦工在指定高度完成打包交易,生成新區塊,並廣播區塊,廣播的區塊通過PoS共識中另一道"門檻",驗證人驗證交易,經過驗證後,區塊獲得確認。這樣一輪PoS的共識過程就進行完成了。權益證實經過長期綁定驗證者的利益和整個網絡的利益來阻止不良行爲。鎖定代幣後,若是驗證者存在欺詐性交易,那麼他們所抵押的 Token 也會被削減。

(十六)委託權益證實DPoS(Delegate Proof of Stake)
委託權益證實,其雛形誕生在 2013 年 12 月 8 日,Daniel Larimer 在bitsharetalk首次談及用投票選擇出塊人的方式,代替PoS中可能出現的選舉隨機數被操縱的問題。在DPoS中,讓每個持幣者均可以進行投票,由此產生必定數量的表明 ,或者理解爲必定數量的節點或礦池,他們彼此之間的權利是徹底相等的。持幣者能夠隨時經過投票更換這些表明,以維繫鏈上系統的「長久純潔性」。在某種程度上,這很像是國家治理裏面的代議制,或者說是人大表明制度。這種制度最大的好處就是解決了驗證人過多致使的效率低下問題,固然,這種制度也有很明顯的缺點,因爲 「表明」制度,致使其一直飽受中心化詬病。

(十七)多籤(Multi-sig)多籤(Multi-sig)指的是須要多個簽名才能執行的操做(這些簽名是不一樣私鑰生成的)。這可用於提供更高的安全性,即便丟失單個私鑰的話也不會讓攻擊者取得賬戶的權限,多個值得信賴的各方必須同時批准更新,不然無效。咱們都知道,通常來講一個比特幣地址對應一個私鑰,動用這個地址中的資金須要私鑰的持有者發起簽名才行。而多重簽名技術,簡單來講,就是動用一筆資金時須要多個私鑰簽名纔有效。多籤的一個優點就是能夠多方對一筆付款一塊兒達成共識,才能支付成功。

(十八)軟分叉(Soft-fork)軟分叉(Soft-fork)更多狀況下是一種協議升級,當新共識規則發佈後,沒有升級的舊節點並不會意識到代碼已經發生改變,而繼續生產不合法的區塊,就會產生臨時性分叉,但新節點能夠兼容舊節點,即新舊節點始終在同一條鏈上工做。

(十九)硬分叉(Hard-fork)硬分叉(Hard-fork)是區塊鏈發生永久性分歧,在新共識規則發佈後,已經升級的節點沒法驗證未升級節點產生的區塊,未升級節點也沒法驗證已經升級的節點產生的區塊,即新舊節點互不兼容,一般硬分叉就會發生,原有正常的一條鏈被分紅了兩條鏈(已升級的一條鏈和未升級的一條鏈,且這兩條鏈互不兼容)。

(二十)智能合約(Smart Contract)並非一個新的概念,早在 1995 年就由跨領域法律學者 Nick Szabo 提出:智能合約是一套以數字形式定義的承諾(Promises),包括合約參與方能夠在上面執行這些承諾的協議。在區塊鏈領域中,智能合約本質能夠說是一段運行在區塊鏈網絡中的代碼,它以計算機指令的方式實現了傳統合約的自動化處理,完成用戶所賦予的業務邏輯。

2、攻擊方法介紹
(一)惡意挖礦攻擊(Cryptojacking)惡意挖礦攻擊(Cryptojacking)是一種惡意行爲,指未經受權的狀況下劫持用戶設備挖掘加密貨幣。一般,攻擊者會劫持受害者設備(我的 PC 或服務器)的處理能力和帶寬,因爲加密貨幣挖掘須要大量算力,攻擊者會嘗試同時感染多個設備,這樣他們可以收集到足夠的算力來執行這種低風險和低成本的挖礦活動。通常惡意挖礦軟件會誘導用戶在計算機上加載挖礦代碼,或經過使用相似網絡釣魚的方法,如惡意連接、電子郵件或是在網站裏植入挖礦腳本等方式,使系統無心中被隱藏的加密挖礦程序感染進而完成攻擊行爲。近年來,隨着加密貨幣價格的上漲,更加複雜的惡意軟件被開發出來,使惡意挖礦攻擊事件層出不窮。
在此咱們爲你們提供幾條建議防範惡意挖礦攻擊:一、注意設備性能和 CPU 利用率;二、在 Web 瀏覽器上安裝挖礦腳本隔離插件,例如MinerBlock,NoCoin和 Adblocker;三、當心電子郵件附件和連接;四、安裝一個值得信賴的殺毒軟件,讓軟件應用程序和操做系統保持最新狀態。

(二)無利益攻擊(Nothing at Stake Attack)無利益攻擊(Nothing at Stake Attack),是在PoS共識機制下一個有待解決的問題,其問題的本質能夠簡單歸納爲「做惡無成本,好處無限多」。當PoS共識系統出現分叉(Fork)時,出塊節點能夠在「不受任何損失」的前提下,同時在兩個分叉上出塊;不管哪個分叉後面被公認爲主鏈,該節點均可以得到「全部收益」且不會有任何成本損失。這就很容易給某些節點一種動力去產生新的分叉,支持或發起不合法交易,其餘逐利的出塊節點會同時在多條鏈(窗口)上排隊出塊支持新的分叉。隨着時間的推移,分叉愈來愈多,非法交易,做惡猖狂。區塊鏈將再也不是惟一鏈,全部出塊節點沒有辦法達成共識。爲了預防這樣的狀況發生,許多類PoS共識機制對此的解決方法是引入懲罰機制,對做惡的節點進行經濟懲罰(Slashing),以創建更加穩定的網絡。DPoS實際上也是無利益攻擊的解決方案之一,由上文咱們可知DPoS這個機制由持幣人選出出塊節點來運營網絡,出塊節點會將一部分獎勵分給投票者。

(三)雙花攻擊(Double Spend Attack)雙花攻擊(Double Spend Attack)即一筆錢花了兩次,雙重支付,利用貨幣的數字特性兩次或屢次使用「同一筆錢」完成支付。雙花不會產生新的 Token,但能把本身花出去的錢從新拿回來。簡單說就是,攻擊者將一筆 Token 轉到另一個地址,一般是轉到交易所進行套現,而後再利用一些攻擊手法對轉帳交易進行回滾。目前有常見的幾種手法可以引起雙花攻擊:1. Race Attack這種攻擊主要經過控制礦工費來實現雙花。攻擊者同時向網絡中發送兩筆交易,一筆交易發給本身(爲了提升攻擊成功的機率,他給這筆交易增長了足夠的礦工費),一筆交易發給商家。因爲發送給本身的交易中含有較高的手續費,會被礦工優先打包進區塊的機率比較高。這時候這筆交易就會先於發給商家的那筆交易,那麼發給商家的交易就會被回滾。對於攻擊者來講,經過控制礦工費,就實現了同一筆 Token 的「雙花」。2. Finney Attack攻擊者主要經過控制區塊的廣播時間來實現雙花,攻擊對象針對的是接受 0 確認的商家。假設攻擊者挖到區塊,該區塊中包含着一個交易,即 A 向 B 轉了必定數量的 Token,其中 A 和 B 都是攻擊者的地址。可是攻擊者並不廣播這個區塊,而是當即找到一個願意接受 0 確認交易的商家向他購買一個物品,向商家發一筆交易,用 A 向商家的地址 C 支付,發給商家的交易廣播出去後,攻擊者再把本身以前挖到的區塊廣播出去,因爲發給本身的交易先於發給商家的交易,對於攻擊者來講,經過控制區塊的廣播時間,就實現了同一筆 Token 的「雙花」。3. Vector76attackVector76 Attack 又稱「一次確認攻擊」,也就是交易確認一次後仍然能夠回滾,是 Finney Attack 和 Race Attack 的組合。攻擊者建立兩個節點,節點 A 鏈接到商家節點,節點 B 鏈接到區塊鏈網絡中的其餘節點。接着,攻擊者用同一筆 Token 發起兩筆交易,一筆交易發送給商家地址,咱們稱爲交易 1;一筆交易發送給本身的錢包地址,咱們稱爲交易 2。與上面說的 Race Attack 同樣,攻擊者對交易 2 添加了較高的礦工費從而提升了礦工的打包機率,此時,攻擊者並無把這兩筆交易廣播到網絡中去。接着,攻擊者開始在交易 1 所在的分支上進行挖礦,這條分支咱們命名爲分支 1。攻擊者挖到區塊後,並無廣播出去,而是同時作了兩件事:在節點 A 上發送交易 1,在節點 B 上發送交易 2。因爲節點 A 只鏈接了商家節點,因此當商家節點想把交易 1 傳給其它對等節點時,鏈接了更多節點的節點 B,已經把交易 2 廣播給了網絡中的大部分節點。因而,從機率上來說,交易 2 就更有可能被網絡認定爲是有效的,交易 1 被認定爲無效。交易 2 被認爲有效後,攻擊者當即把本身以前在分支 1 上挖到的區塊,廣播到網絡中。這時候,這個接受一次確認就支付的商家,會確認交易成功,而後攻擊者就能夠當即變現並轉移資產。同時,因爲分支 2 鏈接的更多節點,因此礦工在這個分支上挖出了另外一個區塊,也就是分支 2 的鏈長大於分支 1 的鏈長。因而,分支 1 上的交易就會回滾,商家以前支付給攻擊者的交易信息就會被清除,可是攻擊者早已經取款,實現了雙花。4. 51% attack攻擊者佔有超過全網 50% 的算力,在攻擊者控制算力的這段時間,他能夠創造一條高度大於原來鏈的新鏈。那麼舊鏈中的交易會被回滾,攻擊者可使用同一筆 Token 發送一筆新的交易到新鏈上。

(四)異形攻擊(Alien Attack)異形攻擊(Alien Attack)其實是一個全部公鏈均可能面臨的問題,又稱地址池污染,是指誘使同類鏈的節點互相侵入和污染的一種攻擊手法,漏洞的主要緣由是同類鏈系統在通訊協議上沒有對不一樣鏈的節點作識別。這種攻擊在一些參考以太坊通訊協議實現的公鏈上獲得了復現:以太坊同類鏈,因爲使用了兼容的握手協議,沒法區分節點是否屬於同個鏈,利用這一點,攻擊者先對以太坊節點地址進行收集並進行惡意握手操做,經過跟節點握手達成污染地址池的目的,使得不一樣鏈的節點互相握手並把各自地址池裏已知的節點推送給了對方,致使更多的節點互相污染,最終擴散致整個網絡。遭受異形攻擊的節點一般會通訊性能降低,最終形成節點阻塞、主網異常等現象。相關公鏈須要注意持續保持主網健康狀態監測,以避免出現影響主網穩定的攻擊事件出現。

(五)釣魚攻擊(Phishing)所謂「釣魚攻擊(Phishing)」,指的是攻擊者假裝成能夠信任的人或機構,經過電子郵件、通信軟件、社交媒體等方式,以獲取收件人的用戶名、密碼、私鑰等私密信息。隨着技術的發展,網絡釣魚攻擊不只能夠託管各類惡意軟件和勒索軟件攻擊,並且更糟糕的是這些攻擊正在呈現不斷上升的趨勢。建議用戶保持警戒,經過即時通信 App、短信或電子郵件獲取到的每條信息都須要謹慎對待,不要在經過點擊連接到達的網站上輸入憑據或私鑰,在交易時儘量的使用硬件錢包和雙因素認證(2FA),生態中的項目方在攻擊者沒有確切告知漏洞細節以前,不要給攻擊者轉帳,若項目方沒法準確判斷和獨自處理,能夠聯繫安全公司協助處理。

(六)木馬攻擊(Trojan Horse Attack)木馬攻擊(Trojan Horse Attack)是指攻擊者經過隱藏在正常程序中的一段具備特殊功能的惡意代碼,如具有破壞和刪除文件、發送密碼、記錄鍵盤和 DDoS 攻擊等特殊功能的後門程序,將控制程序寄生於被控制的計算機系統中,內外夾攻,對被感染木馬病毒的計算機實施操做。可用來竊取用戶我的信息,甚至是遠程控制對方的計算機而加殼製做,而後經過各類手段傳播或者騙取目標用戶執行該程序,以達到盜取密碼等各類數據資料等目的。在區塊鏈領域,諸如勒索木馬、惡意挖礦木馬一直是行業內使人頭疼的安全頑疾,據幣世界報道,隨着比特幣的飆升,推進整個數字加密貨幣價格回升,與幣市密切相關的挖礦木馬開始新一輪活躍,僅 2019 年上半年挖礦木馬日均新增 6 萬個樣本,經過分析發現某些新的挖礦木馬家族出現了快速、持續更新版本的現象,其功能設計愈來愈複雜,在隱藏手法、攻擊手法方面不斷創新,與殺軟廠商的技術對抗正在不斷加強。

(七)供應鏈攻擊(Supply Chain Attack)供應鏈攻擊(Supply Chain Attack)是一種很是可怕的攻擊方式,防護上很難作到完美規避,因爲如今的軟件工程,各類包/模塊的依賴十分頻繁、常見,而開發者們很難作到一一檢查,默認都過於信任市面上流通的包管理器,這就致使了供應鏈攻擊幾乎已經成爲必選攻擊之一。把這種攻擊稱成爲供應鏈攻擊,是爲了形象說明這種攻擊是一種依賴關係,一個鏈條,任意環節被感染都會致使鏈條以後的全部環節出問題。供應鏈攻擊防不勝防且不計代價,建議全部數字加密貨幣相關項目(如交易所、錢包、DApp等)都應該強制至少一名核心技術完整審查一遍全部第三方模塊,看看是否存在可疑代碼,也能夠經過抓包查看是否存在可疑請求。

(八)交易回滾攻擊(Roll Back Attack)交易回滾攻擊(Roll Back Attack),故名思義,指的是能對交易的狀態進行回滾。回滾具體是什麼意思呢?回滾具體指的是將已經發生的狀態恢復成它未發生時候的樣子。那麼,交易回滾的意思就是將已經發生的交易變成未發生的狀態。即攻擊者原本已經發生了支付動做,可是經過某些手段,讓轉帳流程發生錯誤,從而回滾整個交易流程,達到交易回滾的目的,這種攻擊手法多發於區塊鏈上的的智能合約遊戲當中,當用戶的下注動做和合約的開獎動做在一個交易內的時候,即內聯交易。攻擊者就能夠經過交易發生時檢測智能合約的某些狀態,獲知開獎信息,根據開獎信息選擇是否對下注交易進行回滾。建議開發者們不要將用戶的下注與開獎放在同一個交易內,防止攻擊者經過檢測智能合約中的開獎狀態實現交易回滾攻擊。

(九)交易排擠攻擊(Transaction Congestion Attack)交易排擠攻擊(Transaction Congestion Attack)是針對 EOS 上的使用 defer 進行開獎的遊戲合約的一種攻擊手法,攻擊者能夠經過某些手段,在遊戲合約的 defer 開獎交易前發送大量的 defer 交易,惡意侵佔區塊內的 CPU 資源,使得智能合約內本應在指定區塊內執行的 defer 開獎交易因資源不足沒法執行,只能去到下一個區塊才執行。因爲不少 EOS 上的遊戲智能合約使用區塊信息做爲智能合約自己的隨機數,同一個 defer 開獎交易在不一樣區塊內的執行結果是不同的。經過這樣的方式,攻擊者在獲知沒法中獎的時候,就經過發送大量的 defer 交易,強行讓智能合約從新開獎,從而達到攻擊目的。建議智能合約開發者對在不一樣區塊內執行結果不一樣的關鍵的操做不要採用 defer 交易的方式,下降合約被攻擊的風險。

(十)隨機數攻擊(Random Number Attack)隨機數攻擊(Random Number Attack),就是針對智能合約的隨機數生成算法進行攻擊,預測智能合約的隨機數。目前區塊鏈上不少遊戲都是採用的鏈上信息(如區塊時間,將來區塊哈希等)做爲遊戲合約的隨機數源,也稱隨機數種子。使用這種隨機數種子生成的隨機數被稱爲僞隨機數。僞隨機數不是真的隨機數,存在被預測的可能。當使用可被預測的隨機數種子生成隨機數的時候,一旦隨機數生成的算法被攻擊者猜想到或經過逆向等其餘方式拿到,攻擊者就能夠根據隨機數的生成算法預測遊戲即將出現的隨機數,實現隨機數預測,達到攻擊目的。建議智能合約開發者不要使用不安全的隨機數種子生成隨機數,下降合約被攻擊的風險。

(十一)hard_fail狀態攻擊hard_fail Attackhard_fail是什麼呢?簡單來講就是出現錯誤可是沒有使用錯誤處理器(error handler)處理錯誤,比方說使用onerror捕獲處理,若是說沒有onerror捕獲,就會hard_fail。EOS 上的交易狀態記錄分爲  executed,soft_fail, hard_fail, delayed 和 expired 這 5 種狀態,一般在鏈上大部分人觀察到的交易,都是 executed 的,或者 delayed 的,而沒有失敗的交易,這就致使大部分開發者誤覺得 EOS 鏈上沒有失敗的交易記錄,從而忽略了對交易狀態的檢查。攻擊者利用這個細節,針對鏈上游戲或交易所進行攻擊,構造執行狀態爲hard_fail的交易,欺騙鏈上游戲或交易所進行假充值攻擊,從而獲利。在此提醒交易所和 EOS DApp遊戲開發者在處理轉帳交易的時候須要嚴格校驗交易狀態,確保交易執行狀態爲 executed。

(十二)重放攻擊 Replay Attack重放攻擊(Replay Attack),是針對區塊鏈上的交易信息進行重放,通常來講,區塊鏈爲了保證不可篡改和防止雙花攻擊的發生,會對交易進行各類驗證,包括交易的時間戳,nonce,交易 id 等,可是隨着各類去中心化交易所的興起,在智能合約中驗證用戶交易的場景愈來愈多。這種場景通常是須要用戶對某一條消息進行簽名後上傳給智能合約,而後在合約內部進行驗籤。但因爲用戶的簽名信息是會上鍊的,也就是說每一個人都能拿到用戶的簽名信息,當在合約中校驗用戶簽名的時候,若是被簽名的消息不存在隨着交易次數變化的變量,如時間戳,nonce 等,攻擊者就能夠拿着用戶的簽名,僞造用戶發起交易,從而獲利。這是一種最先出現於DApp生態初期的攻擊形態,因爲開發者設計的開獎隨機算法存在嚴重缺陷,使得攻擊者可利用合約漏洞重複開獎,屬於開發者較爲容易忽略的錯誤。所以,開發者們在鏈上進行驗籤操做的時候,須要對被簽名消息加上各類可變因子,防止攻擊者對鏈上簽名進行重放,形成資產損失。

(十三)重入攻擊 Reentrancy Attack重入攻擊(Reentrancy Attack)首次出現於以太坊,對應的真實攻擊爲 The DAO 攻擊,這次攻擊還致使了原來的以太坊分叉成以太經典(ETC)和如今的以太坊(ETH)。因爲項目方採用的轉帳模型爲先給用戶發送轉帳而後纔對用戶的餘額狀態進行修改,致使惡意用戶能夠構造惡意合約,在接受轉帳的同時再次調用項目方的轉帳函數。利用這樣的方法,致使用戶的餘額狀態一直沒有被改變,卻能一直提取項目方資金,最終致使項目方資金被耗光。提醒智能合約開發者在進行智能合約開發時,在處理轉帳等關鍵操做的時候,若是智能合約中存儲了用戶的資金狀態,要先對資金狀態進行修改,而後再進行實際的資金轉帳,避免重入攻擊。

(十四)假充值攻擊 False Top-up假充值攻擊(False Top-up),分爲針對智能合約的假充值攻擊和對交易所的假充值攻擊。在假充值攻擊中,不管是智能合約仍是交易所自己,都沒有收到真實的 Token,可是用戶又確實獲得了真實的充值記錄,在這種狀況下,用戶就能夠在沒有真正充值的狀況下從智能合約或交易所中用假資產或不存在的資產竊取真實資產。1.  智能合約假充值攻擊針對智能合約的假充值主要是假幣的假充值,這種攻擊手法多發於 EOS 和波場上,因爲 EOS 上代幣都是採用合約的方式進行發行的,EOS 鏈的系統代幣一樣也是使用這種方式發行,同時,任何人也能夠發行名爲 EOS 的代幣。只是發行的合約賬號不同,系統代幣的發行合約爲"eosio.token",而其餘人發行的代幣來源於其餘合約賬號。當合約內沒有校驗 EOS 代幣的來源合約的時候,攻擊者就能經過充值攻擊者本身發佈的 EOS 代幣,對合約進行假充值攻擊。而波場上的假充值攻擊主要是 TRC10 代幣的假充值攻擊,因爲每個 TRC10 都有一個特定的tokenid進行識別,當合約內沒有對tokenid進行校驗的時候,任何人均可以以 1024 個 TRX 發行一個 TRC10 代幣對合約進行假充值。2.  交易所假充值攻擊針對交易所的假充值攻擊分爲假幣攻擊和交易狀態失敗的假充值攻擊。以 EOS 和以太坊爲例。針對 EOS 可使用名爲 EOS 的假幣的方式對交易所進行假充值攻擊,若是交易所沒有嚴格校驗 EOS 的來源合約爲"eosio.token",攻擊就會發生。同時,區別於 EOS,因爲以太坊上會保留交易失敗的記錄,針對 ERC20 Token,若是交易所沒有校驗交易的狀態,就能經過失敗的交易對交易所進行 ERC20 假充值。除此以外,hard_fail狀態攻擊也是屬於假充值攻擊的一種。建議交易所和智能合約開發者在處理轉帳的時候要充分校驗交易的狀態,若是是 EOS 或波場上的交易,在處理充值時還要同時校驗來源合約是不是"eosio.token" 或tokenid是否爲指定的tokenid。

(十五)短地址攻擊 Short Address Attack短地址攻擊(Short Address Attack)是針對以太坊上 ERC20 智能合約的一種攻擊形式,利用的是 EVM 中的對於輸入字節碼的自動補全機制進行攻擊。通常而言,針對 ERC20 合約中的 transfer 函數的調用,輸入的字節碼位數都是 136 字節的。當調用 ERC20 中的 transfer 函數進行 ERC20 Token 轉帳時,若是攻擊者提供的地址後有一個或多個 0,那麼攻擊者就能夠把地址後的零省去,提供一個缺位的地址。當對這個地址轉帳的時候,比方說轉帳 100 的 A Token,而後輸入的地址是攻擊者提供的缺位地址,這時候,通過編碼輸入的數據是 134 字節,比正常的數據少了 2 字節,在這種狀況下,EVM 就會對缺失的字節位在編碼數據的末尾進行補 0 湊成 136 字節,這樣原本地址段缺失的 0 被數據段的 0 補齊了,而因爲給地址段補 0,數據段會少 0,而數據段缺失的 0 由 EVM 自動補齊,這就像數據段向地址段移動補齊地址段缺失字節位,而後數據段缺失的字節位由 EVM 用 0 補齊。這種狀況下,轉帳金額就會由 100 變成 100 * 16 的 n 次方,n 是地址缺失的 0 的個數。經過這種方式,攻擊者就能對交易所或錢包進行攻擊,盜竊交易所和錢包的資產。建議交易所和錢包在處理轉帳的時候,要對轉帳地址進行嚴格的校驗,防止短地址攻擊的發生。

(十六)假幣攻擊 Fake Token Attack假幣攻擊(Fake Token Attack),是針對那些在建立官方 Token 時採用通用建立模版建立出來的代幣,每一個 Token 的識別僅根據特定的標記進行識別,如 EOS 官方 Token 的識別標記是"eosio.token"合約,波場的 TRC10 的識別標記是tokenid,以太坊的 ERC20 是用合約地址做爲識別標記。那麼這樣就會出現一個問題,若是收款方在對這些 Token 進行收款的時候沒有嚴格校驗這些 Token 特有的標記,攻擊就會發生,以 EOS 爲例子,因爲 EOS 官方 Token 採用的是合約來發行一個名爲 EOS 的 Token,標記 EOS 自己的標識是"eosio.token" 這個發行賬號,若是在接受轉帳的時候沒有校驗這個標識,攻擊者就能用其餘的賬號一樣發行一個名爲 EOS 的 Token,對交易所或錢包進行假幣充值,換取真的代幣。建議交易所和錢包在處理轉帳的時候,切記要嚴格檢驗各類代幣各類標識,防止假幣攻擊。

(十七)整型溢出攻擊 Integer Overflow Attack數據的存儲是區塊鏈上重要的一環。可是每一個數據類型自己是存在邊界的,例如以太坊中 uint8 類型的變量就只能存儲 0~255 大小的數據,超過了就存不下了。那麼若是要放一個超過數據類型大小的數字會怎樣呢?例如把 256 存進 uint8 的數據類型中,數據顯示出來會變成 1,而不是其餘數值,也不會報錯,由於 uint8 自己能存一個 8 位二進制數字,最大值爲 11111111,若是這個時候加 1,這個二進制數就變成了 100000001,而由於數據邊界的關係,只能拿到後 8 位,也就是 00000001,那麼數字的大小就變成 1 了,這種狀況咱們稱爲上溢。有上就有下,下溢的意思就是一個值爲 0 的 uint8 數據,若是這個時候對它進行減 1 操做,結果會變成該數據類型所能存儲的最大值加 1 減去被減數,在這個例子中是 255,也就是該數據類型所能存儲的最大值。那麼若是上述兩種狀況發生在智能合約當中的話,惡意用戶經過下溢的操做,操縱本身的賬號向其餘賬號發送超過本身餘額數量的代幣,若是合約內沒有對餘額進行檢查,惡意用戶的餘額就會下溢出變成一個超大的值,這個時候攻擊者若是大量拋售這些代幣,就能瞬間破壞整個代幣的價值系統。建議全部的智能合約開發者在智能合約中對數據進行操做的時候,要嚴格校驗數據邊界,防止整形溢出攻擊的發生。

(十八)條件競爭攻擊 Race Condition條件競爭(Race Condition)攻擊的方式不少樣,可是核心的本質無非是對某個條件的狀態修改的競爭。條件競爭的例子:著名的 Edgeware 鎖倉合約的拒絕服務漏洞,這個漏洞問題的本質在於對新建的鎖倉合約的餘額的這個條件進行競爭。攻擊者能夠監控全部鏈上的鎖倉請求,提早計算出鎖倉合約的地址,而後向合約地址轉帳,形成鎖倉失敗。在官方沒有修復以前,要防止這種攻擊,只能使用比攻擊者更高的手續費讓本身的鎖倉交易先行打包,從而與攻擊者造成競爭避免攻擊。最後,官方修復方案爲不對鎖倉合約的餘額進行強制性的相等檢查,而是採用大於等於的形式,避免了攻擊的發生。建議智能合約的開發者在智能合約中對某些狀態進行修改的時候,要根據實際狀況充分考慮條件競爭的風險,防止遭受條件競爭攻擊。

(十九)越權訪問攻擊 Exceed Authority Access Attack和傳統安全的定義同樣,越權指的是訪問或執行超出當前帳戶權限的操做,如原本有些操做只能是合約管理員執行的,可是因爲限制作得不嚴謹,致使關鍵操做也能被合約管理員之外的人執行,致使不可預測的風險,這種攻擊在以太坊和 EOS 上都曾出現過屢次。以 EOS 上著名的BetDice遊戲爲例,因爲在遊戲合約內的路由(EOS 內可自定義的事件轉發器)中沒有對來源帳號進行嚴格的校驗,致使普通用戶能經過 push action 的方式訪問到合約中的關鍵操做 transfer 函數,直接繞過轉帳流程進行下注,從而發生了越權攻擊,過後雖然BetDice官方緊急修復了代碼,並嚴格限制了來源帳號,但這個漏洞已經讓攻擊者幾乎無成本薅走BetDice獎池內將近 5 萬 EOS。又如在以太坊使用 solidity 版本爲 0.4.x 進行合約開發的時候,不少合約開發者在對關鍵函數編寫的時候不只沒有加上權限校驗,也沒有指定函數可見性,在這種狀況下,函數的默承認見性爲 public,惡意用戶能夠經過這些沒有進行限制的關鍵函數對合約進行攻擊。建議智能合約開發者們在進行合約開發的時候要注意對關鍵函數進行權限校驗,防止關鍵函數被非法調用形成合約被攻擊。

(二十)交易順序依賴攻擊 Transaction-Ordering Attack在區塊鏈的世界當中,一筆交易內可能含有多個不一樣的交易,而這些交易執行的順序會影響最終的交易的執行結果,因爲在挖礦機制的區塊鏈中,交易未被打包前都處於一種待打包的 pending 狀態,若是能事先知道交易裏面執行了哪些其餘交易,惡意用戶就能經過增長礦工費的形式,發起一筆交易,讓交易中的其中一筆交易先行打包,擾亂交易順序,形成非預期內的執行結果,達成攻擊。以以太坊爲例,假如存在一個 Token 交易平臺,這個平臺上的手續費是經過調控合約中的參數實現的,假如某天平臺項目方經過一筆交易請求調高交易手續費用,這筆交易被打包後的全部買賣Token的交易手續費都要提高,正確的邏輯應該是從這筆交易開始日後全部的 Token 買賣交易的手續費都要提高,可是因爲交易從發出到被打包存在必定的延時,請求修改交易手續費的交易不是當即生效的,那麼這時惡意用戶就能夠以更高的手續費讓本身的交易先行打包,避免支付更高的手續費。建議智能合約開發者在進行合約開發的時候要注意交易順序對交易結果產生的影響,避免合約因交易順序的不一樣遭受攻擊。

(二十一)女巫攻擊 Sybil Attack傳聞中女巫是一個會魔法的人,一我的能夠幻化出多個本身,令受害人覺得有多人,但其實只有一我的。在區塊鏈世界中,女巫攻擊(Sybil Attack)是針對服務器節點的攻擊。攻擊發生時候,經過某種方式,某個惡意節點能夠假裝成多個節點,對被攻擊節點發出連接請求,達到節點的最大連接請求,致使節點沒辦法接受其餘節點的請求,形成節點拒絕服務攻擊。建議在搭建全節點的狀況下,服務器須要在系統層面上對網絡鏈接狀況進行監控,一旦發現某個IP鏈接異常就調用腳本配置 iptables 規則屏蔽異常的 IP,同時鏈開發者在進行公鏈開發時應該在 P2P 模塊中對單 IP 節點鏈接數量添加控制。

(二十二)假錯誤通知攻擊 Fake Onerror Notification AttackEOS 上存在各類各樣的通知,只要在 action 中添加require_recipient命令,就能對指定的賬號通知該 action,在 EOS 上某些智能合約中,爲了用戶體驗或其餘緣由,通常會對onerror通知進行某些處理。若是這個時候沒有對onerror通知的來源合約是不是eosio進行檢驗的話,就能使用和假轉帳通知一樣的手法對合約進行攻擊,觸發合約中對onerror的處理,從而致使被攻擊合約資產遭受損失。建議智能合約開發者在進行智能合約開發的時候須要對onerror的來源合約進行校驗,確保合約賬號爲eosio賬號,防止假錯誤通知攻擊。

(二十三)粉塵攻擊 Dusting Attack粉塵攻擊(Dusting Attack)最先發生於比特幣網絡當中,所謂粉塵,指的是交易中的交易金額相對於正常交易而言十分地小,能夠視做微不足道的粉塵。一般這些粉塵在餘額中不會被注意到,許多持幣者也很容易忽略這些餘額。可是因爲比特幣或基於比特幣模型的區塊鏈系統的帳本模型是採用 UTXO 模型做爲帳戶資金系統,即用戶的每一筆交易金額,都是經過消費以前未消費的資金來產生新的資金。別有用意的用戶,就能經過這種機制,給大量的帳戶發送這些粉塵金額,令交易粉塵化,而後再經過追蹤這些粉塵交易,關聯出該地址的其餘關聯地址,經過對這些關聯地址進行行爲分析,就能夠分析一個地址背後的公司或我的,破壞比特幣自己的匿名性。除此以外,因爲比特幣網絡區塊容量大小的限制,大量的粉塵交易會形成區塊的擁堵,從而使得交易手續費提高,進而產生大量待打包交易,下降系統自己的運行效率。對於如何避免粉塵攻擊,能夠在構造交易的過程當中,根據交易的類型,計算出交易的最低金額,同時對每一個輸出進行判斷,若是低於該金額,則不能繼續構造該筆交易。特別的,若是這個輸出恰好發生在找零上,且金額對於你來講不太大,則能夠經過捨棄該部分的粉塵輸出,以充做交易手續費來避免構造出粉塵交易。其次,爲了保護隱私性,建議能夠在構造交易時把那些金額極小的 UTXO 捨棄掉,使用大額的 UTXO 組成交易。

(二十四)C2 攻擊 C2 AttackC2 全稱 Command and Control,翻譯過來就是命令執行與控制,在傳統的網絡攻擊中,在經過各類漏洞進入到目標服務器後,受限於空間,一般經過網絡拉取二段 exploit 進行駐留,實現後滲透流程。因此,C2 架構也就能夠理解爲,惡意軟件經過什麼樣的方式獲取資源和命令,以及經過什麼樣的方式將數據回傳給攻擊者。在傳統的攻擊手法中,攻擊者通常經過遠程服務器拉取命令到本地執行,可是這種方式也有很明顯的缺點,就是一旦遠程服務器被發現,後續滲透活動就沒法正常進行。可是區塊鏈網絡提供了一個自然且不可篡改的大型數據庫,攻擊者經過把攻擊荷載(payload)寫進交易中,並經過發送交易把該命令永久的刻在區塊鏈數據庫中。經過這種方法,即便攻擊命令被發現,也沒法篡改鏈上數據,無需擔憂服務器被發現而後下線的風險。新技術不斷髮展,舊有的攻擊手法也在隨着新技術的變換而不斷迭代更新。在區塊鏈的世界中只有在各方面都作好防範,才能避免來自各方面的安全攻擊。

(二十五)洗幣 Money Launderin洗幣和洗錢是同樣的,只是對象不一樣,洗錢指的是將一筆非法獲得的金錢經過某些操做後變成正當、合法的收入。而洗幣也是同樣,指的是將非法獲取的代幣,如經過黑客攻擊、攜帶用戶資產跑路或經過詐騙等手段獲取的代幣,經過某些手段,將其來源變成正當、合法的來源。如經過交易所進行洗幣、智能合約中洗幣或經過某些攪拌器進行中轉、經過匿名幣種如門羅幣,Zcash等,令非法所得的資金沒法被追蹤,最後成功逃過監管達到洗幣的目的,而後經過把代幣轉換成法幣離場,完成洗幣的流程。建議各交易所應增強 KYC 策略,加強風控等級,及時監控交易所大資金進出,防範惡意用戶經過交易所進行洗幣,除此以外,能夠經過與第三方安全機構進行合做,及時攔截非法資產,阻斷洗錢的可能。

(二十六)勒索 Ransom勒索是傳統行業中常見的攻擊行爲,攻擊者經過向受害者主機發送勒索病毒對主機文件進行加密來向受害者進行資金勒索。隨着區塊鏈技術的發展,近年來,勒索開始呈現新的方式,如使用比特幣做爲勒索的資金支付手段或使用匿名性更高的門羅幣做爲資金支付手段。如著名的GandCrab病毒就是比特幣勒索病毒,受害者須要向攻擊者支付必定量的比特幣換取解密私鑰。經過這種勒索手段,GandCrab勒索病毒一年就勒索了超過 20 億美金。值得一提的是,就算向攻擊者發送比特幣,也不必定能換取解密私鑰,形成「人財兩空」的局面。建議,當資產已經因勒索病毒而形成損失時,不要慌張,更不要向攻擊者支付比特幣或其餘加密貨幣,同時,交易所在收到這些勒索郵件時需額外警戒,千萬不能向攻擊者支付比特幣或其餘加密貨幣,必要時可尋求第三方安全公司的協助。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息