導讀
繼上篇對當前數字資產領域的安全形勢進行了深度分析後,本文將介紹區塊鏈數字資產領域的安全措施與相關的解決方案。
區塊鏈技術是數字資產的新興載體。相較傳統互聯網,區塊鏈因其不可篡改、不滅失的特徵,對安全性的事先驗證等程序機制提出了極高要求。
智能合約是新一代區塊鏈技術的標誌性設計,它利用事先定義的接口和協議自動完成合約步驟。以太坊圖靈完備的特點在給了智能合約廣闊舞臺的同時,也揹負了巨大的安全壓力。如何保證合約本身的可控性、可調度性,以及執行過程中的可信性,成爲軟件安全和資產安全層面亟待解決的問題。
智能與安全無關
智能合約(smart contract)這個術語由密碼學家尼克·薩博(Nick Szabo)在上世紀九十年代中期首次提出。他將其定義爲:能夠自動執行合約條款的計算機程序。
合約語言的圖靈完備意味着,理論上,智能合約可以具備任何功能,執行所有計算。對合約功能的寬鬆限制不可避免地引入了更多危險。
先回放一段經典案例。
The DAO 事件可以說是智能合約發展史上的一場狂風暴雨。截止到 2016 年 6 月 17 日被攻擊之前,該衆籌合約已經募集了一億五千萬美金,攻擊者利用合約漏洞發動攻擊,導致 300 多萬以太幣資產被分離出 The DAO 資產池。
這一切,都源於 TheDAO 智能合約中一個 splitDAO 函數的小小漏洞 , 攻擊者通過該漏洞,不斷的從資金池中分離資產給自己。
在該案例中,攻擊者僅利用了智能合約的不完備性,就成功竊取了資金池內近三分之一的資產。可見,在智能合約框架下,事先檢查合約本身是否存在機制漏洞,是安全問題的關鍵。
一份安全、完備的智能合約應該具備如下功能:
編制模板框架,確定編程人員,保證代碼的準確性。最重要的是,技術層面的內容如何獲得合約雙方認可;
合約驗證。任何程序都有 bug,如果合約內容明顯有利於其中一方,需要進行修復,保證合約邏輯正確;
合約定製。根據不同場景定製適配的智能合約模板,根據需求對合約進行組合,形成複合合約;
合約一致性。檢驗智能合約的執行代碼與文本是否一致,不一致的合約可信度不高;
執行過程中的可控性、可調度性和安全性。
形式化方法的引入
爲了達到智能合約的理想狀態,Certik 等行業先行者從硬件設計領域引入了形式化方法,即:用數學工具進行定義、開發和驗證。
硬件電路和軟件工程歸根結底都是數學問題。如果所有的設計開發都能按照嚴密的數理邏輯進行,那麼開發出來的系統就會像數學本身一樣完美:永遠正常工作。
通俗地說,形式化方法就像一套完備的法律,規定了每個角色能做什麼和不能做什麼,並對角色之間的關係進行界定。類似於社會系統架構對不同角色進行分類,在承認個體天性的同時,使系統的複雜程度降低了多個維度。
形式化方法包括形式規約和形式化驗證兩個層面。
形式規約使用具有精確語法和語義的形式語言來刻畫系統行爲和特性。在形式化的過程中對對象進行分類、識別和擬合。形式規約約束了系統的代碼組成,從系統設計流程上確保了輸入組合的有窮性。同時,它也是驗證系統正確性的依據。
形式化驗證則在形式規約的基礎上,建立系統行爲及其與性質的關係,從而驗證該系統是否滿足預期的關鍵性質。這一過程可以和立法、司法程序類比,即:在對被審判人的權利、義務和其行爲進行規範後,總是可以對他進行合理的判斷。
形式化方法應用於智能合約的整個生命週期。
傳統的合約開發並沒有成體系地引入形式化方法,因此,一般先用非正式規範來設計合約,然後用形式化規範力求準確地描述合約,並將合約引入形式化的空間。再通過模型檢驗工具(可以理解爲合約模板)檢查合約,或使用演繹法證明合約可被正常執行。最後,通過模型工具,將形式化空間中抽象的合約生成代碼,通過不斷測試生成序列,確保文本和程序代碼的一致性。
形式化的規約旨在理解合約代碼中內容的抽象本質,相當於對合約進行解讀。在驗證安全之後,通過使用可執行模型,將較高級別的抽象模型轉換爲較低級別的代碼。
形式化方法使智能合約的生成和執行有了規範性約束,保證了合約的可信性,使智能合約的生產過程和執行效果得到了保障。
智能合約形式化驗證的原理
形式化驗證本身就是使用數學方法嚴格證明一個程序正確性的過程。
傳統的驗證方法主要是模擬和測試,即通過實驗對系統進行查錯。一般的方法是,在一端按系統要求或者自定義輸入,觀察在另一點的輸出。這種方法耗費大量的時間,而且由於實驗所能涵蓋的系統行爲有限,很難找出所有的潛在錯誤。
馮 . 諾伊曼 (Von Neumann) I948 年發表的相關論文就對這一問題有所觸及,但未能提供解決方案。
1969 年,託尼·霍爾(Tony Hoare)提出了將程序正確性驗證形式化的命題。
形式化驗證方法可以檢查程序的各種屬性,如公平性、可達性、有界性和無狀態二義性等,從理論上對程序做了全面檢驗,合格即被認爲安全。
在從理論到實踐的漫長過程中,形式化驗證演化出了很多不同的操作方法。目前一線的技術公司多采用模型檢測法,步驟如下:
建模。選擇合適的建模語言和建模工具,使用模型檢測工具能夠接受的形式語言來描述合約。
描述。闡明所要驗證的合約性質,包括合約的狀態可達性、死鎖、活鎖、有界性等。
驗證。對合約的狀態空間進行搜索,發現問題並進行修改,對合約進行迭代驗證。
模型檢測是對有窮狀態系統的一種形式化確認方法,其理論邏輯爲:給定一個合約和規約,按照規約生成對應的合約模型,通過證明合約在模型中成立,以此證明合約滿足約定規則。
有窮狀態模型在建模時有一定難度,需要採集大量樣本,並在其中提取邏輯,但因爲狀態是可窮的,可以保證搜索過程及時終止,因此,在工程上是實際的。
一些一線的技術公司已經將上述方法和流程應用到了區塊鏈智能合約的安全驗證上,但效果仍有待檢驗。
結論
形式化驗證理論過去一直服務於集成電路的功能驗證,發展多年,已經非常成熟。
智能合約是區塊鏈系統發展應用的重要內容,也是目前傳統網絡安全公司尚未觸及的安全盲區。市場已經發現了形式化驗證對於智能合約安全的重要性。然而,安全機制的建立從數學理論變成現實,仍然需要時間。