岳勇 郭仲勇 艾陽



摘 要:隨著區塊鏈技術應用范圍越來越廣泛,也面臨著諸多方面的安全威脅,智能合約引發的安全問題已經成為區塊鏈安全性的主要問題。本文通過對智能合約安全性分析,提出相應的解決方案;通過合約安全審計方法、合約安全監測工具等措施對智能合約進行安全管理,保障信息系統安全。
關鍵詞:區塊鏈;智能合約;隱私保護;安全漏洞;安全審計
中圖分類號: TP309
0 引言
智能合約是部署在區塊鏈上的代碼,利用協議和用戶接口完成合約過程。在智能合約層,通過在智能合約上添加能夠與用戶交互的前臺界面,并能與其它外部IT系統進行數據交互和處理,形成去中心化的應用(DAPP),實現各種行業應用。智能合約具有事件驅動、自動執行及價值轉移等特點,通過智能合約處理各種事務,減少了人為干預的風險,能夠在任何時刻響應用戶需求,這樣能夠大大提升效率,節約時間和成本。由于智能合約整體處于初期階段,需要重視其安全性、擴展性、以及與現實世界的法律體系的對接等問題,尤其是安全性問題得不到有效解決,將會嚴重阻礙價值互聯網的推進步伐。
1? 技術原理
1.1? 智能合約的執行環境
目前以太坊和超級賬本的智能合約技術相對更為成熟,在以太坊中合約代碼在虛擬機中執行,超級賬本中合約代碼在容器中執行。虛擬機和容器都創造了一個封閉的沙箱環境,在封閉隔離的情況下執行合約代碼。
以太坊虛擬機是一種圖靈完備的,基于棧的后進先出特性設計的虛擬機,它可以將智能合約代碼編譯成可以在以太坊上執行的機器代碼,并為智能合約提供一個完全封閉的運行環境,在以太坊中每個節點都創建了一個EVM虛擬機,當出現調用合約交易時,所有節點都會執行一遍合約并對結果進行共識。
超級賬本采用了容器(docker)作為智能合約的執行環境,和虛擬機相比容器沒有采用虛擬化技術,而是直接運行在底層操作系統上之上,因此在容器中合約的執行效率很高。但相較于虛擬機而言,容器的啟動和執行過于消耗資源,這也成為了制約超級賬本性能的關鍵因素。
1.2 智能合約的運行機制
在一個智能合約內一般包含合約值和合約狀態兩個屬性, 在智能合約代碼中寫明了合約的應用場景和觸發規則, 一旦外部輸入數據符合觸發條件,可以就會開始執行并返回相應的結果。如下圖1所示,由于區塊鏈種類及運行機制的差異,不同平臺上智能合約的運行機制也有所不同。智能合約的生命周期可以簡單的分為開發、部署、執行三個階段。
(1)開發階段:合約開發階段,主要是由多方協商,根據現實世界的合同規則編寫相應的程序代碼,編寫過程中需要開發者熟悉合約代碼的編寫思維,盡可能簡潔以防止代碼出錯。
(2)部署階段:合約開發完成后,發起方用戶對合約簽名并發起一條交易,交易經過網絡廣播和節點驗證后,跟這一時間戳內的其他交易一同保存在當前區塊中,合約部署成功后將返回合約地址和相關接口信息,用戶可以通過合約地址和接口信息對部署成功的合約進行調用。
(3)執行階段:調用合約需要用戶通過合約地址和接口信息發起交易,區塊鏈內的其他節點為了獲得系統預設的獎勵會幫助新區塊的產生。節點收到調用合約的相關交易后將在一個本地沙箱環境中執行合約(如以太坊虛擬機EVM),執行過程中,合約代碼根據外部輸入數據和合約狀態信息判斷當前合約狀態是否滿足合約觸發條件以執行合約內的操作,符合條件的更新操作,在經過共識算法的驗證后會進入區塊鏈新的區塊中。
2? 智能合約安全性分析
智能合約的安全性通??梢詮拇a編寫、合約虛擬機和區塊鏈特性這三個維度展開,以下分別對這三個方面的安全性漏洞進行了分析,針對其中可能出現的問題也提出了相應的解決方案。
2.1? 合約隱私泄露
即使在聯盟鏈中,由于區塊鏈交易信息公開,合約代碼完全開源,合約從創建、部署到執行的整個過程都會被廣播到參與聯盟鏈的全部節點,導致合約參與者的真實身份有很大可能會被有意的攻擊方識破。一些機密合約的隱私內容,有時不便公開,如果依然采用原先的部署、執行方式,將導致合約參與者的重要信息受到威脅。
解決方案:
(1) 采用盲簽名。盲簽名技術即簽名者在不知道所簽文件內容的情況下進行簽署,而發送者卻可以從簽名者對盲化后的文件簽名中提取出有效簽名,這體現了盲簽名技術所具有的盲性和不可偽造性的特點。
(2)采用環簽名。環簽名是一種簡化的類群簽名,它是指環中的成員用他自己的私鑰和其他環成員的公鑰進行簽名,這一過程并不需要征得其他成員的同意,簽名的驗證者可以知道簽名來自這個環,但無法定位準確的環成員,這也是一種對合約參與者身份安全的保護方式。
(3)采用同態加密。同態加密是一種特殊的加密方法,對密文進行數據處理得到的結果跟對明文進行數據處理再加密的結果相同,即同態性。在區塊鏈上應用同態加密技術可以對公開的數據進行加密,再進行數據處理,這種方式可以在保證區塊鏈信息公開的情況下保證信息安全。
(4)采用零知識證明(ZKPs)。 零知識證明是指證明者在不向驗證者提供任何有用信息的情況下證明某個事件是真實的,即可以在不泄露數據本身情況下證明某些數據運算。在區塊鏈中使用零知識證明技術可以在不泄露交易數據的情況下證明交易已經正確完成。
2.2? 合約主體漏洞
智能合約的代碼編寫不同于以往的項目開發,智能合約在部署后一旦出現問題,所付出的代價是巨大的,對于多種區塊鏈來說都難以簡單的解決,因此我們在編寫合約代碼時要提升安全思維,做好安全準備。
2.2.1函數可重入性
智能合約執行過程中當一個合約調用另一個合約時,當前的執行過程會暫停等待另一個合約的返回值。這會導致一個很嚴重的問題,如果程序可以在執行過程中被中斷,則可以在其先前的調用完成執行之前安全地再次調用,這被稱為可重入計算機程序。在調用其他外部函數的操作完成前,這個被調用的函數很有可能會被多次執行,這種多次調用可能會造成難以想象的問題。
解決方案:
避免外部調用:調用外部合約的函數,造成等待返回結果這種情況,很容易引發重入問題,外部合約中還可能會有其他惡意代碼、安全威脅,在編寫合約代碼時應該盡量少的調用外部合約。
處理外部調用錯誤:在調用外部合約時,需要注意調用函數的返回值,當出現異常或返回錯誤結果時一定要針對返回的錯誤結果進行及時處理。
合約狀態檢查:有效防止函數重入的另一種方法是在合約代碼需要進行外部調用之前更新狀態并在合約中檢查,以確保當前狀態代表接下來會執行的事務。
2.2.2 函數可見性
以Solidity為例,在使用Solidity編寫合約代碼時,共提供了4種函數可見性修飾符,在開發者沒有指明的情況下,默認為public。當開發者沒有明確指明函數可見性時,可能導致部分關鍵函數的可見性為公開的,這使得任何外部用戶都可以調用這一函數,可能會造成巨大損失。
解決方案:在編寫合約代碼時,明確指明函數可見性,以免造成意想不到的損失。
2.2.3 誤操作異常
在以太坊中,允許一個合約通過send指令或者直接調用的方式去調用另一個合約內的函數。然而在調用過程中可能會出現錯誤,例如gas不足、超出調用棧限制,調用就會終止,合約就會回退到之前的狀態。調用者很可能并未獲知調用過程中出現的異常,這主要取決于調用的方式。使用這條指令調用合約后,必須檢查返回值驗證合約是否正確執行。根據數據統計,現有合約中約28%的合約在調用后不會檢查異常返回值,這在一定程度上會造成許多問題。
解決方案:
避免使用不檢查異常和錯誤返回值的調用方式,針對可能出現的錯誤情況,做好錯誤處理和返回值檢查。
2.3 虛擬機安全漏洞
合約虛擬機運行在區塊鏈的各個節點之上,虛擬機為合約代碼提供了一個沙箱式的執行環境,如果合約虛擬機存在漏洞或不完善的地方,則很由可能會受到攻擊者的攻擊,虛擬機系統相比較于傳統的計算機運行環境具有更多的攻擊安全隱患,以下列出常見的幾種:
(1)逃逸漏洞:虛擬機在運行中,一般進程只能在沙盒的限制中執行相應的代碼,逃逸漏洞指的是進程越過虛擬機范圍,進入到宿主機的操作系統中,這種漏洞會使攻擊者退出沙盒環境,執行其他本不能執行的代碼。
(2)邏輯漏洞:虛擬機在發現數據或代碼不符合規范時,可能會對數據做一些“容錯處理”,這就導致可能會出現一些邏輯問題,最典型的是“以太坊短地址攻擊”。
(3)堆棧溢出漏洞:虛擬機的調用棧有確定的最大深度,在一些攻擊者的惡意調用下,有可能導致棧的深度超過虛擬機允許的最大深度,或不斷占用系統內存導致內存溢出。
(4)資源濫用漏洞:指的是攻擊者在虛擬機中執行惡意代碼,估計消耗系統的網絡資源、存儲資源、計算資源、內存資源。所以在虛擬機系統中必須要有一些限制機制來防止系統的資源被濫用。
解決方案:
1、為虛擬機設置安全域和安全域之間的訪問規則,如果虛擬機有添加或刪除等破壞規則的操作時則刪除該虛擬機所屬的網絡。
2、為區塊鏈虛擬機,設計一種安全監測機制,這項機制可以做到對資源的收集、分析和監測,根據實時獲取到的虛擬機信息對有異常情況的虛擬機進行處理。
3、采用基于大數據與機器學習的虛擬機安全防護方法,從虛擬機的中提取文件,接著識別普通文件中的惡意特征,將識別的惡意特征與惡意文件特征庫中的特征進行比對,判斷該文件是否為惡意文件,若為惡意文件則進行清理。
4、采用于KVM虛擬機系統的安全防護方法,可以周期性地獲取虛擬機系統的中斷描述符表、系統調用表和系統調用數據,將獲取到的虛擬機系統中的數據與備份的相應數據進行比較,當發現異常時用備份的數據對虛擬機系統中狀態異常的內核對象進行恢復。
2.4 區塊鏈特性導致的漏洞
2.4.1交易順序依賴
在區塊鏈中一個區塊包含多條交易,而一筆交易從被廣播出去到被確認并包含在一個區塊內需要一定的時間。我們假設有一個區塊鏈目前處于狀態σ,新區塊中包括兩條調用相同合約的交易(deg:Ti,Tj),在這種情況下,用戶無法確定合約在執行調用時是什么狀態。當合約處于σ[Ti]時執行Tj的調用和處于σ[Tj]時執行Ti的調用可能會造成截然不同的結果,這取決于Ti和Tj之間的順序,而只有挖掘這一區塊的節點才能決定這些交易的順序,從而決定合約被調用的順序。如果有攻擊者在監聽到網絡中對應合約的交易后,發出他自己的交易來改變當前的合約狀態,則有一定幾率使這兩筆交易包含在同一個區塊下面,并且有可能排在另一個交易之前,完成攻擊。合約的最終狀態實際上取決節點在確認時的交易順序, 我們將此類合約稱為交易依賴合約或TOD合約。
解決方案:
針對交易順序依賴,開發者對于交易的獎勵機制要進行合理的設置,以防止通過調整獎勵金額來改變交易決定順序的情況出現,對于一些關鍵事務的交易頻率要做限制,防止短時間內大量交易出現。
2.4.2 時間戳依賴
另一個很重要的安全問題是,合約有時會用區塊時間戳作為執行一系列關鍵操作的觸發條件。我們把這樣的合約稱為時間戳依賴合約,在許多合約游戲中都會使用隨機數來決定誰贏得頭獎,這些合約使用了之前的區塊哈希作為隨機種子來挑選冠軍,區塊的選擇則取決于當前區塊的時間戳。通常來說,當節點確認一個區塊時,它會為這個區塊設置一個時間戳,這個時間一般是節點的本地系統時間。但是,節點可以在900s的范圍之內隨意改變這個時間戳,與此同時其他節點仍然會接受并確認它。節點處理一個新的區塊時,如果新的區塊的時間戳大于上一個區塊,并且時間戳之差小于900秒,那么這個新區塊的時間戳就是合法的。因此有一些攻擊者就可以通過改變時間戳來控制合約的輸出結果 。
解決方案:
時間戳依賴的問題相對來說較難解決,只要在智能合約中使用了隨機數,就很難保證節點在區塊驗證過程中不作弊,因為智能合約中的隨機數通常情況下只能根據節點的本地時間計算, 而本地時間又是可以被惡意偽造的,因此這種方法并不安全。通常的解決方案是使用鏈外的安全可信的第三方提供的服務來獲取隨機數。
3 智能合約安全管理
3.1 合約安全審計方法
智能合約的安全審計就是指將合約部署到區塊鏈上之前對合約代碼進行全面審查的過程,安全審計可以很大程度上減少合約代碼中存在漏洞和問題,避免合約部署后出現可能會出現的損失。
目前智能合約的安全審計分為人工審計和自動化審計,隨著智能合約的發展人工審計的方法已經基本被自動化審計所取代,目前市面上有三種主流的自動化審計方法。
1、特征代碼匹配,智能合約的特征代碼匹配與傳統的特征代碼匹配類似,都是對常見的一些會導致問題出現的代碼進行提取、抽象,然后形成固定的匹配模塊對待檢測源碼進行檢測。這種檢測方法優速度快、迅速響應新漏洞,缺點則是使用范圍有限、漏報率高。
2、基于形式化驗證的自動化審計方法,這種方法采用 F-framework 和 K framework,將 EVM 轉化為一個 Formal? model。其中Formal 是航空航天領域常見的一種形式化驗證框架, K framework 則是一個語義的轉化框架。
3、基于符號執行和符號抽象自動化審計。這也是目前最常用的方法,這種方法是指分析智能合約時,首先通過編譯源碼,可以形成 EVM OPCODE,然后輸入到自動化分析引擎轉化成 CFG,再利用這兩種方法進行分析。比較典型的是 Detente 和 Secured 系統,這種方法可以降低誤報率和漏報率,但是也存在繁瑣和耗時的缺點。
自動化的審計方法可以很大程度上減少代碼問題造成的安全漏洞,但是目前現存的集中分析方法仍然存在流程繁瑣和耗時的問題。
3.2 合約安全監測工具
目前市面上已經有許多針對智能合約安全監測方面的工具出現,以下對較為常見的監測工具做了簡要的介紹:
Mythril是一個針對以太坊智能合約的安全分析工具,Mythril可以檢測出包括整數溢出等一系列的常見安全問題,但Mythril針對合約內的業務邏輯卻無能為力。
Oyente提供了一系列針對EVM漏洞檢測的啟發式引擎驅動,它不僅可以準確地找出代碼中的安全隱患,還能保證較低的誤報率。Oyente是一種符號執行工具,可以直接運行在以太坊虛擬機(EVM)字節代碼上。
Manticore是一種符號化的執行引擎, 包括EVM在內的多種模式, 支持具體程序方案、符號化執行驅動和斷言檢測等.
REMIX是一種基于瀏覽器的智能合約編寫和漏洞修補的IDE JavaScript應用, 內嵌的靜態分析工具可以針對已知的預定義漏洞進行檢測.
F*是一種用于程序驗證的通用函數式編程工具,支持驗證工具的自動執行和基于依賴類型證明的表達, 可以對實際智能合約的語義正確性和運行過程的安全性進行驗證。但是, 現有的形式化驗證和程序分析工具多是針對已知漏洞的檢測和驗證.未來的研究將更加關注現有的智能合約的反模式, 構造動態檢測的程序分析工具。
4 總結
本文對區塊鏈智能合約的安全性做了一定分析,針對合約代碼編寫過程中可能會出現的一些問題和漏洞,提出了一些改進建議。針對本文的建議和方案,已經在供應鏈金融、金融交易等項目中應用,使用智能合約實現存證與查證、數據安全共享與交換、風險控制等執行并寫入區塊鏈,為更多的區塊鏈項目中智能合約的安全使用提供參考。
參考文獻
[1]? Lou L, Ch D H, Frolicked H, ET AL. Making Smart Contracts Smarter[C]// A cm Issac Conference on Computer & Communications Security. 2016.
[2]? Mossback A, Miller A, Chi E, ET AL. Hawk: The Block chain Model of Cryptography
and Privacy-Preserving Smart Contracts[C]// Security & Privacy. 2016.
[3] 胡凱, 白曉敏, 高靈超,等. 智能合約的形式化驗證方法[J]. 信息安全研究, 2016, 2(12):1080-1089.
[4] 朱巖, 甘國華, 鄧迪, 姬菲菲, 陳愛平 -區塊鏈關鍵技術中的安全性研究[J].信息安全研究, 2016
[5] 賀海武,延安,陳澤華. 基于區塊鏈的智能合約技術與應用綜述[J]. 計算機研究與發展, 2018, 55(11):2452-2466.
[6] 楊茜,黃曉芳. 一個基于盲簽名技術的智能合約模型[J]. 西南科技大學學報, 2018, v.33;No.130(02):99-103.
[7] 楊茜. 基于區塊鏈的智能合約研究與實現[D]. 西南科技大學, 2018.
[8] 馬春光, 安婧, 畢偉, et al. 區塊鏈中的智能合約[J]. 信息網絡安全, 2018, 215(11):13-22.
[9] 畢曉冰, 馬兆豐, 徐明昆. 區塊鏈智能合約安全開發技術研究與實現[J]. 信息安全與通信保密, 2018(12):63-73.
[10] 孫煒. 淺談區塊鏈虛擬機[J]. 信息通信技術與政策, 2018, No.289(07):41-43.
[11] 馬昂, 潘曉, 吳雷, et al. 區塊鏈技術基礎及應用研究綜述[J]. 信息安全研究, 2017, 3(11).
[12] 邢少敏, 馮維, 王泉景. 基于區塊鏈技術的涉密電子文檔保護方案研究[J]. 信息安全研究, 2017(10):22-30.
[13] 邵義勇. 兩種特殊性質的代理簽名方案研究[D]. 華東師范大學, 2008.
[14] 黃潔華. 眾籌區塊鏈上的智能合約設計[J]. 信息安全研究, 2017, 3(3):211-219.