◆張春峰 王國一
(沈陽智能機器人創新中心有限公司 遼寧 110000)
隨著數字化時代的到來,區塊鏈技術作為關鍵的數字經濟支持技術,成為新的社會經濟發展引擎。其中,憑借去中心化、不可篡改等優點,區塊鏈技術已經廣泛應用于多種場景。隨著應用場景不斷豐富,智能合約越來越復雜多變,這樣導致對應的安全漏洞越來越多,直接制約著區塊鏈技術發展。隨著關于智能合約的攻擊行為不斷增加,安全性能讓整個區塊鏈行業備受詬病,做好安全漏洞檢測越來越重要。
智能合約本質為一個程序模塊,被部署于區塊鏈技術,從而實現各種服務于智能合約的豐富的業務功能。當前隨著區塊鏈技術的快速發展,業務功能也趨近復雜化,可執行的操作也豐富多樣。在智能合約的輔助下,用戶可以不通過對區塊鏈的結構修改而實現整個邏輯操作的嵌入,以此實現區塊鏈的功能化拓展。作為一類程序化模塊,通常采用定制化程序來實現,例如應用于以太網的Solidity 語言和Libra中的Move 語言,并且可通過設置程序化接口來對接不同編程語言。
為了實現節點安全管控,智能合約和節點之間不再融合在一起,而是以分治的方式作用于區塊鏈節點中的沙盒中。程序和數據的智能合約分割不是馮諾依曼系統的傳統體系結構,因此,安全威脅在一定程度上不同于普通計算機。執行智能合約往往會導致狀態變化,對此可在區塊鏈的不同環節之間達成協議并在達成共識后納入區塊。智能化合同和區塊特性帶來了新的安全問題。
重復輸入是智能合約過程中發生的最危險的安全漏洞之一,當它調用其他智能合約時。被調用的智能合約可以通過重新調用原始合約來改變原始智能合約的流量和狀態,實現惡意重復翻譯等。轉移到智能合約后,將進行控制轉移,執行返回(fallback)功能,這一特點使反復攻擊更加頻繁。在這種情況下,攻擊過程中,其會采用惡意錯誤的方式復制式攻擊。當出現業務變更時,智能合約則會因對用的條件不匹配而引發定位偏差,由此造成程序的紊亂。
整數溢出作為一種漏洞攻擊主的重要方式,通常采用幾種編程語言。在執行智能合約過程中,數字業務自身的轉換同計算之間的強大關聯,使得整數溢出引發系統安全狀況。例如以太坊,當對應的無符號整數計算的結果超出表示范圍就會采用截斷數位的方式引發數據偏差問題。為此,可通過設置安全庫來處理該問題。具體而言,即通過庫中的數值計算來對溢出情況進行評估,從而為出現該問題提供應急預案,以此預防溢出問題。
在區塊鏈業務執行中,對應的交易順序和時間對形成的交易結果產生直接影響。當出現交易順序和時間漏洞的時候,通過對交易順序的控制,利用時間戳容限誤差可實現攻擊,導致交易出現問題。由于這一漏洞的存在,且存在致命的缺陷,導致潛在的攻擊更加精準,也更容易出現。對此通常需要設計智能化時間戳管理來避免對區塊鏈中時間戳檢測和打包環節的攻擊,以實現對智能合約的有效保護。
該漏洞即DoS,本質上即干擾原有代碼的執行邏輯,導致其無法被執行,從而引發以太幣和GAS 的消耗,由此進一步制約合約的運行。目前而言,導致該攻擊的漏洞存在形式如下所示:
(1)細微化的智能合約編碼方式容易被攻擊者利用而形成有效攻擊,其會通過錯誤操作引導來實現服務終止運行。
(2)對應的區塊鏈執行代碼控制權被集中于某一單一變量上,這樣當有用戶切入,就會對整個使用功能進行帶來聯動反應,當出現不執行或者丟失密鑰的情況下,系統則無法得以正常運行,甚至會導致智能合約的癱瘓。
(3)DoS 漏洞攻擊會導致諸如以太坊的每個模塊一樣,由于存在gas limit 上限,當出現外部操控數組發生訪問時,可在攻擊下引發gas 的枯竭,導致無空間來運行智能合約。
該問題主要發生于Solidity 的調用中,其所涵蓋的send()、call()、delegatecall(),callcode()等函數調用異常時,此時返回false,此時不將拋出異常指示。在外部調用過程中,由于沒有異常提示,導致合約運行繼續,這會隨著運行的繼續而引發邏輯錯誤。例如,圖1中,對應的第7 行中,send()操作后,盡管出現異常,但是沒有進行拋出操作而導致交易繼續,然后運行到第9 行則發生邏輯錯誤,導致系統異常,引發連鎖反應。

圖1 未檢查call 返回值漏洞代碼段
對于靜態程序分析而言,主要內容在于結合統計特性,對所執行的方案的特點,特別是符號實現、語義分析等進行分析,以從中發掘其中的漏洞和隱患。
(1)符號執行
該方法主要通過對所執行的程序的每個運行的路徑進行分析,對每個路徑所滿足的條件進行分析和匹配,從而以通過約束規則,利用求解器來確定可能的條件。具體而言,當滿足某一路徑條件時,則會將該路徑設置為可實現路徑,否則將其設置為不可訪問,并將該路徑刪除。通過這一分析方法可有效地發掘可能存在的安全漏洞,其具體方法如下:在執行智能合約的過程中,對應執行的指令下發前,須對可能執行的路徑進行檢索,并由此發出相應的路由指令,以進一步分析是否滿足該路徑路由條件。如果此時還是滿足所需條件,那么對應的執行代碼可以被重復執行。此時會存在一定的安全風險。
為了進一步分析,通常需要采用Oyente 等基于符號執行的智能合同分析工具。在符號執行分析方法采用的基礎上,依托Oyente 分析工具可有效生成智能合約控制流程圖,并對可能的路由路徑進行分析,并通過分析原則和路由規則來檢測路由路徑中是否存在異常,并做進一步驗證以確定是否需要播報。
(2)語義分析
語義分析方法作為另一類關鍵分析方法,通常對智能合約的語義特征進行分析,通過分析來獲取相關的語義特征,并通過挖掘的語義特征來分析是否存在漏洞或者異常等。通常,為了有效提升漏洞分析的效率,需要采用相應的靜態工具來予以輔助分析,例如采用Securify 即為當前進行語義分析的關鍵工具,這是因為該工具是一種基于語義和靜態分析的智能合約安全分析工具。采用該工具的過程中,通常需要將經過智能合約編碼處理的信息作為輸入,并通過對應的語義特征依賴關系,進行分析,通過匹配的方式來驗證是否存在對應的漏洞,從而以高精度的挖掘潛在的風險。對于該分析工具而言,其存在很大的好處在于其挖掘的語義特征信息,通常能夠滿足特征的信息規則,并且可以通過邏輯語言datalog 定義,然后在該引擎框架下,進行安全漏洞的檢測和修補。為了能夠有效提升發掘安全漏洞的效率,其同DSL 來對安全模式進行描述,并且提供用戶以安全模式進行登錄,以及擴展內置模式集,由此提升整個分析方法的靈活性和良好的可擴展性。
(1)模糊測試
模糊測試是指發現智能合約中的安全漏洞、構建大量輸入數據以及監控智能合約的實施過程。合約模糊器是一種基于模糊測試的智能合約不在場證明工具。首先,分析了智能合約中的所有功能,并分析了智能合約中不提供ABI 的所有外部功能。然后,他使用智能合約ABI 生成輸入數據,并使用EVM 記錄的執行軌跡進行漏洞分析。fuzzer 合同中定義了七種測試原語,以支持多個安全漏洞的檢測。針對合約間交互鏈接引起的返回問題,建立攻擊合約,并利用其保留函數完成返回檢測。在模糊測試中,經常會出現一些問題,比如指數輸入數據和低代碼覆蓋率。
(2)污點的動態監檢測分析
動態應變分析方法通常將輸入數據標記為應變和傳播,并在智能合約操作期間分析應變。區塊鏈分析側重于輸入參數的行為,并確定染料傳播路徑上是否存在安全漏洞。
Easyflow 是一種基于動態染色不在場證明評估以太坊智能合約中是否存在整體轉運漏洞的方法。通過修改EVM,每個輸入參數都設計為一個陰影。當有數字操作時,請注意操作員。如果操作不是污漬,且計算中沒有轉運,則應證明操作是安全的;如果操作員受到污染,則會生成事務嘗試以使操作過載。如果超額流量成功激活,則應指示轉運漏洞;如果未激活過量流量,則報告潛在的過量流量漏洞。此外,Easyflow 還可以識別數學安全性及其可能的變體,從而有效降低誤報率。
形式化方法是驗證程序修正的常用方法。當定義某些公理、建立特定的邏輯推理系統并證明代碼的邏輯推理時,可以驗證智能合約功能的更正。通過正式驗證的代碼可以確保它在所有條件下都顯示正確的功能。然而,復雜的證明過程使得形式化方法難以在邏輯復雜的大型程序中使用。
形式化驗證方法當前備受網絡安全問題專家所關注的方法之一,其通過嚴謹的數學理論對整個安全漏洞進行演算,實現對安全漏洞的高效檢索和發掘,但是由于數學理論參與度高而提升應用門檻。對此為了提升其應用范圍,針對不同應用目標進行定制化的研究和規范化描述和驗證,從而削減應用成本,降低使用門檻,從而提升其大規模應用價值。
對于區塊鏈而言,進行交易的過程中需要選擇可執行的路由路徑來執行該事件,從而完成交易過程。一般而言,攻擊者攻擊的目標即采用非法手段,來竊取對應的加密貨幣。在這一背景下,需要通過對當前的智能合約審計經驗和已曝漏洞分析,對出現的或者可能出現漏洞的路由路徑中所執行的指令進行分析,提取其中可能的高危指令SUICIDE、CALL、ORIGIN、ASSERT_FAIL 等,對其路由的路徑進行重點關注,并打上重視標簽。為了進一步提升安全漏洞挖掘的效果和檢測精度,在實際運行中,不必對所有的路由路徑進行分析,只需要重點關注高危漏洞驗證工作,以此削減路由路徑檢索時間和存儲空間,提升路由和檢測效率。
對于安全漏洞檢測而言,一個重要的方式就是模糊測試,易提升安全漏洞檢測效率和定位效果,為精準檢測提供技術支撐。但是由于技術的不夠完善,現有的模糊測試工具業務功能不足,且精度不足成為當前用于檢測漏洞中存在的關鍵問題。對此進行優化處理是關鍵,例如可以考慮用多目標優化算法。此外,綜合其他技術來輔助提升檢測效果,如可采用靜態方法、符號執行、模糊測試等多個測試策略的聯合應用,能夠在靜態分析方法框架下來獲取對應的可執行的路由路徑,并在符號執行分析技術下,結合生成種子測試用例,來測試該項綜合測試技術,提升模糊測試效果。
智能合約在執行中,由于缺乏足夠的漏洞檢索庫,導致安全漏洞的發掘效率受到影響。為了改善該局面,提升漏洞挖掘的效率,檢驗相關工具的有效性能,并為安全化處理提供技術思路,需要根據當前出現的漏洞情況,進行分析、整理和總結,將其納入規范化記錄存檔,并綜合在一起形成具有特性特征分類的數據庫,并結合處理經驗和基本技術理論,以及社會設置的規則對,設定評估體系,充分考慮漏報率、誤報率、檢測時間、支持漏洞類型和漏洞的危害等級等因素,提升整個安全漏洞的檢測和修補提供建設性建議。
智能合約作為區塊鏈業務中重要的功能集成,對區塊鏈交易提供了更多的便捷性和高質量的服務業務。然而智能合約作為一類程序化模塊存在很多安全性問題,尤其是大量存在的安全漏洞,引起高效的嵌入效能而被帶入到各類區塊鏈應用服務之中,導致區塊鏈在交易過程中面臨安全風險。為了解決這些問題,本文在深入分析了智能合約的基本概念的基礎上,進一步分析了可能存在的安全漏洞,最后探討了安全漏洞檢測的基本措施,從而為當前的智能合約的應用以及區塊鏈技術的發展提供技術參考。