分析、整理2011年至2019年之間160個典型的區塊鏈安全事件。
目錄
一、高級可持續威脅
1、描述
高級可持續威脅問題往往出現在區塊鏈領域的中心化團隊中,如:交易所、錢包、礦池等。主要是因爲區塊鏈團隊在基礎安全建設和安全運行上的欠缺,導致基礎設施出現安全漏洞,被攻擊者利用,實施數字貨幣的盜竊和破壞。
2、危害
該漏洞會導致區塊鏈系統被入侵,權限被控制,最終導致資金被竊取,敏感數據泄露等問題。
3、修復
重視基礎設施、辦公安全、內部風險管理等安全方面的建設。遊戲開發者應該持續分析數據,評估存在的風險,及時作出防護。
二、失控的幣值膨脹
1、描述
比特幣等虛擬貨幣吸引人的一個主要原因是限定了鑄幣總數,從而使這些幣有價值。但是如果鑄幣的程序設計和實現有漏洞,就可能導致鑄幣總數失控,導致幣值失控膨脹。
2、危害
該漏洞佔整個區塊鏈安全事件損失的29.55%。其中智能合約層案件最爲突出。主要是由於幣值控制代碼出現了整數溢出的漏洞,導致出現無限鑄幣的可能性。
3、修復
對於整數溢出漏洞,應該使用安全的的算術函數做加減乘除處理。
https://ethereumdev.io/safemath-protect-overflows/
三、失效的權限控制
1、描述
主要是由於在設計或編碼的過程中,導致本該限制使用範圍的重要函數或權限沒有控制好範圍,被攻擊者利用,從而實施攻擊。如以太坊錢包Parity的庫權限沒有控制好,被越權調用初始化函數,重置了錢包的所有者。
2、利用方式
(1)開發者將初始化函數設置爲public,讓其他合約可以調用,但這也導致攻擊者可以利用這個漏洞進行修改;
(2)編譯器漏洞,因爲如果在編寫構造函數時不注意也會導致越權調用。如小於0.4.22版本中,合約構造函數必須和合約名字相同,而在之後的版本中,需要constructor關鍵字作爲構造函數的聲明,如果沒按照要求,構造函數就會被編譯成一個普通函數,被任意調用。
(3)Call是最常用的調用方式,調用後內置變量 msg 的值會修改爲調用者,但執行環境爲被調用者的運行環境。,如果合約中有函數以 msg.sender爲關鍵變量的代碼邏輯(如向msg.sender轉賬),那麼就有可能導致越權操作,引發安全問題。
3、修復
(1)對初始化等重要函數不要設置爲pubic權限,以致可以被外部調用。
(2)要注意構造函數編寫方式,以免被編譯成普通函數,可以被任意調用。
(3)注意call等的調用對msg的改變,以免導致繞過驗證環節,被越權執行函數。
四、不安全的共識協議
1、描述
主要是由於存在共識協議在設計之初未考慮的漏洞,被攻擊者識別和利用,從而損害鏈上參與者的利益。
在共識類案例中,以51%攻擊最爲常見。而不同類型的共識協議在面對51%攻擊的抵抗力又有所差別,雖然POW和POS兩種共識協議在規模較小時都容易被攻擊,但是POW類共識協議比POS類更容易被攻擊。
2、利用方式
利用51%攻擊導致出現雙花交易。
51%算力攻擊中還有一個重要概念:網絡重組(block reorganization)
網絡重組:網絡中六到八個塊甚至更長的塊都已經被礦工挖出來了,但是這些塊突然全部被移除,產生了一些新的塊去代替這些已經被確認過的塊。
3、修復
51%的攻擊會讓交易所等參與交易的機構損失慘重。針對交易所,建議提升提款前的確認次數。對於小規模的數字貨幣,根據具體業務謹慎選擇共識協議。
五、考慮不充分的程序邏輯
1、描述
主要由於軟件設計和編碼的錯誤原因,存在沒有考慮到的異常分支,導致程序邏輯被攻擊者利用,陷入設計者未預期的流程,造成損失。如The Dao事件。
2、利用方式
以The Dao事件爲例。
ETH智能合約中發送以太幣,常見的兩種方式:一是調用send函數,比如:msg.sender.send(100);二是使用message call,msg.sender.call.value(100)。兩個方式不同的是發送的gas數量。當調用send方法時,只會發送一部分gas,一般是2300gas,一旦gas耗盡就可能拋出異常。而使用message call的時候,則是發送全部的gas,執行完之後剩餘的gas會退還給發起調用的合約。
fallback函數,智能合約中可以有唯一的一個未命名函數,稱爲fallback函數。該函數不能有實參,不能返回任何值。如果其他函數都不能匹配給定的函數標識符,則執行fallback函數。當合約接收到以太幣但是不調用任何函數的時候,就會執行fallback函數。
存在漏洞的合約Bank和攻擊合約Attack
攻擊實施流程:
(1)假設Bank合約中有100wei,攻擊者Attack合約中有10wei;
(2)Attack合約先調用deposit方法向Bank合約發送10wei;
(3)之後Attack合約調用withdraw方法,從而調用Bank的withdrawBalance;
(4)Bank的withdrawBalance方法發送給了Attack合約10wei;
(5)Attack收到10wei之後,又會觸發調用fallback函數;
(6)這時,fallback函數又調用了兩次Bank的withdrawBalance,從而轉走了20wei;
(7)之後Bank合約才修改Attack合約的balance,將其置爲0。
出問題的地方在4-7這幾個步驟,開發者原本預期步驟4完成後就會到步驟7,沒有預料到中間還有5-6的fallback處理這個流程,以至於攻擊者可以構造編寫fallback代碼,讓處理流程走入異常分支,實現遞歸調用,直到gas耗盡。
3、修復
注意代碼中向fallback一類的隱形函數,避免出現邏輯異常錯誤。在編寫智能合約進行以太幣發送時,使用send或transfer,不要使用message call方式。
六、不嚴謹的業務策略
1、描述
該威脅主要是利用高額的以太費用和技術手段讓以太坊堵塞,從而獲得遊戲中的大獎。這根據場景不一樣,也會有不一樣的業務問題。
2、利用方式
目前區塊鏈遊戲比較火,因爲去中心化特性,確保了遊戲公平,但如果業務策略設計存在漏洞,就會導致遊戲獎勵被特定的人利用漏洞來獲得。
以FOMO3D遊戲爲例,遊戲規則如下:
(1)規則1:最後一個購買KEY的人獲得獎池中的大獎;
(2)規則2:每有人購買一個KEY,倒計時時間會增加30秒;
(3)規則3:遊戲啓動後從24小時開始倒計時。
曾經,大部分都認爲這是一個不可能結束的遊戲,因爲一旦快到倒計時就會很多人去購買KEY。
最終這個遊戲結束是因爲有一個黑客在自己購買KEY後,使用高額的以太費用和技術手段讓以太坊堵塞了3分鐘,進而使得其他玩家無法打包購買KEY的交易,最終等到倒計時結束,獲得了最後的大獎。
這就是業務策略沒有考慮到以太坊網絡是有可能被人爲堵塞的後果。
3、修復
目前的幾個公鏈性能都較差,使用很少的成本就能讓交易網絡堵塞,因此在設計業務策略時要考慮這個因素,攻擊可以讓交易出現阻塞和回滾。
七、校驗不嚴格的交易邏輯
1、描述
交易校驗不嚴格,攻擊者僞造假的交易行爲,但被校驗方驗證通過,誤認爲真的交易;或者提交了真交易,但是通過時間差、黑名單等,讓交易發生回滾,實際交易並沒有發生,而商家只驗證是否有交易行爲的話,就會發生損失。
2、利用方式
主要是假轉賬類問題和回滾類問題。主要是因爲校驗方的校驗邏輯存在問題,從而被攻擊者繞過,以假的充值行爲卻獲得真實的數字貨幣入賬;;或者通過時間差,黑名單等因素讓之前的交易操作回滾,從而欺騙商戶獲得商品。
3、修復
(1)關鍵邏輯不僅要校驗是否真實的轉賬消息,還需要校驗轉賬的目標賬戶是否正確。
(2)不僅要確認支付是否成功提交,還需要等待一定時間,看支付是否回滾,再確認支付是否成功。
(3)遊戲的獎勵機制應該同下注機制緊密相關。一旦發現下注交易產生問題發生回滾,則獎勵交易也應該一起回滾。
八、脆弱的隨機數機制
1、描述
這裏不僅僅指僞隨機函數的問題,而是整個僞隨機數生成機制不夠安全,導致可以被攻擊者提前獲取或猜測到隨機數的結果,以實施攻擊。
2、利用方式
隨機數威脅一般出現在智能合約類遊戲中,隨機數保證了遊戲的公平
隨機數seed由timestamp、difficulty、coinbase、gaslimit、msg、sender、number構成。因此,只要知道這幾個數據,我們就可以預測出是否可以獲得空投獎勵。其中msg.sender是可以由用戶或攻擊者控制,因此攻擊者可以不斷嘗試構造出滿足空投獎勵條件的msg.sender以獲得比正常用戶高很多的空投獎勵。
3、修復
1) 一般來說隨機數的構成元素不應該可以被用戶控制;
2) 不應該在開獎前讓用戶可以預測到開獎結果。
九、存在缺陷的激勵機制
1、描述
激勵機制是區塊鏈的重要環節,但若開發者設計的激勵機制存在可以被利用的漏洞,就可能會給開發者或用戶帶來損失。
2、利用方式
攻擊方利用了礦池激勵機制的漏洞,參與分紅,但是不做貢獻,挖到了礦就自己藏起來,給一起挖礦的礦工和礦池都帶來了損害。
3、修復
在設計激勵機制時千萬不要假設所有的參與者都是誠實的,一定要防範惡意者的攻擊,以保護大家的利益。
十、日誌記錄和監控不足
1、描述
日誌記錄和監控的問題對區塊鏈團隊和公司來說非常很重要。如果沒有足夠的日誌記錄和監控,被攻擊的過程中,你會不知道。當發生安全事件後,你沒有辦法調查,也沒有辦法改進以避免再犯同樣的錯誤。所以日誌記錄和監控不足的問題也很嚴重。
2、利用方式
缺少日誌和監控會讓黑客攻擊變得更肆無忌憚,因爲你無法發現攻擊行爲,無法知道是哪裏存在安全漏洞,也就沒有辦法找到修復的方案,整體的安全風險處於失控的狀態。
3、修復
要確保所有登錄、訪問控制失敗、輸入驗證失敗都能夠被記錄到日誌中去,並保留足夠的用戶上下文信息,以識別可疑或惡意帳戶,併爲後期取證預留足夠時間;
確保高額交易有完整性控制的審計信息,以防止篡改或刪除,例如審計信息保存在只能進行記錄增加的數據庫表中;
建立有效的監控和告警機制,使可疑活動在可接受的時間內被發現和應對,或採取一個應急響應機制和恢復計劃。