■高楓
最近區塊鏈平臺EOS智能合約漏洞事件再次把區塊鏈安全推上了風口浪尖。攻擊者可以通過發布包含惡意代碼的“智能合約”,經過一系列的操作之后,控制區塊鏈網絡中的所有節點,從而為所欲為。從The DAO到BEC,SocialChain,Hexagon,再到這幾天的EOS漏洞,“智能合約”已經成為區塊鏈安全的重災區。
那么什么是智能合約,智能合約的漏洞究竟給安全帶來了什么樣的新挑戰,我們應該如何應對?本文中360代碼衛士團隊的安全專家將結合自身在區塊鏈智能合約漏洞方面的研究成果和心得體會,從這幾個方面進行深入解讀。
智能合約 (smart contract)這個術語是在1994年由Nick Szabo提出的,后來經過幾次在不同環境下的重新定義。我們現在通常所說的區塊鏈智能合約以以太坊為代表,以太坊的作者Vitalik Buterin意識到,在區塊鏈系統中,交易邏輯是可以和底層系統機制分離的。
底層系統負責交易塊的創建和驗證,記賬者的共識達成等基礎功能,而交易本身到底做什么事情是可以通過二次編程的方式來定義的。因此他設計了一種交易代碼執行的虛擬環境EVM,使用者可以開發自定義的交易邏輯,發布到鏈上,當交易進行時,鏈上所有的節點都執行相同的代碼,從而同步改變鏈上數據的狀態。他為這種代碼使用了“智能合約”這個名字,這是我們目前通常所說的智能合約的內涵。
智能合約本質是一段運行在區塊鏈網絡中的代碼,它完成用戶所賦予的業務邏輯。以以太坊體系的代幣為例,其業務邏輯是代幣發幣和交易。以太坊在設計之初,將智能合約設計成了一旦部署就不能修改的模式。這種設計有可能是為了提高智能合約的可信性。
但是我們知道,只要是由人編寫的程序,就一定會出現錯誤和缺陷。以太坊這種設計本身就違背了程序設計的一般規律,在智能合約出現漏洞的時候可能會造成無法彌補的損失。我們可以看到,近期出現的以太坊體系智能合約的漏洞,造成了巨大的影響,有的代幣也因此毀滅。

目前以太坊體系區塊鏈智能合約的機制設計,加之漏洞可能帶來的毀滅性影響,使得已上線智能合約的漏洞的報告和處理變得非常棘手。
360代碼衛士團隊在近期的研究中發現了以太坊體系下多個已上市交易的代幣的智能合約安全漏洞,并已第一時間報告廠商,但到目前為止廠商尚未作出任何回應。對于廠商來說,由于智能合約不可修改的特性,要對上線后發現的漏洞進行有效修復,只能選擇重新部署新的合約,這將付出巨大的代價,因此有的廠商可能會選擇不響應不處理。
而對于安全研究者來說,也面臨左右為難的尷尬境地。在廠商修補漏洞前公開漏洞細節對于廠商不利,有悖漏洞披露的一般原則,但如果廠商遲遲不修補漏洞,公眾對于漏洞的存在不知情,風險會隨著時間的增長迅速膨脹,漏洞一旦爆發可能會造成更大的危害,波及更大的人群,可能會造成很多人的投資瞬間化為烏有。
在一些聯盟鏈中,智能合約的設計是可以在部署之后更新的,當然這種更新需要一定的線下協商流程。要應對區塊鏈智能合約的安全漏洞問題,未來需要普遍考慮設計相應的智能合約協商更新機制,降低漏洞修復的成本。
但現在,我們需要面對現實,做出幾乎唯一可行的、切實有效地努力——在智能合約上線之前,對其進行全面深入的代碼安全審計,盡可能的消除漏洞,降低安全風險。
360代碼衛士團隊安全專家表示,當前區塊鏈智能合約中可能出現的漏洞至少有20余種。以下列舉一些常見的區塊鏈智能合約的漏洞類型及其可能造成的風險,這些漏洞在智能合約上線之前,都應該進行詳細的排查。
1.整數溢出
智能合約中危險的數值操作;
可能導致合約失效、無限發幣等風險。
2.越權訪問
智能合約中對訪問控制處理不當;
可能導致越權發幣風險。
3.信息泄露
硬編碼地址等;
可能導致重要信息的泄露。
4.邏輯錯誤
代理轉賬函數缺失必要校驗;
可能導致基于重入漏洞的惡意轉賬等風險。
5.拒絕服務
循環語句、遞歸函數、外部合約調用等處理不當;
可能導致無限循環、遞歸棧耗盡等拒絕服務風險。
6.函數誤用
偽隨機函數調用和接口函數實現問題;
可能導致可預測隨機數、接口函數返回異常等風險。
漏洞永遠都會存在。未來區塊鏈行業一定會出現更多的安全問題,之前傳統互聯網領域里面遇到的安全問題,區塊鏈行業里面一定也會遇到。區塊鏈行業要能夠與網絡安全行業做到協同開放,才能使行業更加健康穩定安全地發展。