區塊鏈 — 智慧合約的安全性
本文主要讓讀者了解區塊鏈的智慧合約的基本操作,與其主要的資安疑慮還有對智慧合約的稽核策略。
智慧合約的基本介紹
智慧合約是“在區塊鏈上”運行的程序。它們是完全分佈式和去中心化的應用程序,並且能夠"自我執行"。智慧合約的代碼會是編碼中協議的最終決定者,這意味著任何合約有效的執行都被認為是“合理使用(fair use)”,包括利用合約中的邏輯或程序缺陷。由於智慧合約可以在區塊鏈上存儲和操縱資料和敏感資料,因此它們對駭客來說是有吸引力的目標,所以安全性至關重要。
智慧合約平台被設計成有一個區塊,而這個區塊的整個交易由執行指令組成。區塊鏈網路中的每個節點(電腦)都運行一模一樣的區塊鏈虛擬機並執行交易中所包含的代碼。這建立了一個平行化(而不是加速處理)但效率極低的分佈式網路的電腦架構,因為平行化用於"保持同步"(每個節點以相同的順序運行相同的代碼)。
智慧合約的設計就像標準的電腦程式開發一樣。它們可以運行命令(encoded in transactions)、access memory(分散式帳本)、與使用者交互(通過呼叫帳號或被帳號呼叫)以及與其他程序交互(運行其他智慧合約)。智慧合約平台被設計是圖靈完備的(Turing-complete),這意味著電腦上的程序可能可以做的任何事情都應該在智慧合約中成為可能。
智慧合約的資安疑慮
智慧合約被設計為在區塊鏈上運行的全功能程序。 這產生了一些在設計區塊鏈解決方案時應該考量的資安注意事項。
圖靈完備
智慧合約的圖靈完備功能意味著它們具有與標準電腦程序相同的功能。 這種非常方便,但也有潛在的危險。 智慧合約主要在運作公開的、不可變帳本中的敏感或有價值的資料。 因為智慧合約的“代碼即法律(code as law)”意味著由寫程式的錯誤引起的攻擊不太可能被逆轉(私有鏈較可能做這件事)。 開發人員在建立智慧合約來存儲敏感或有價值的資料時應該非常謹慎。
不被信任的代碼
智慧合約的目的是讓開發人員在區塊鏈上建立和運行代碼。 這些開發人員不一定是被信任的,並且可能是惡意的。 區塊鏈的設計意味著區塊鏈網路中的每個節點都將定期在其電腦上運行不受信任的代碼。
讓智慧合約之間能交互,這意味著智慧合約開發人員本質上是為“電腦”開發的,“使用者”在其中運作他們遇到的任何程序,包括惡意軟體。 如果這樣做會使駭客受益,那麼任何智慧合約漏洞都可以並且很有可能會被利用。
智慧合約在區塊鏈軟體的snadboxed Virtual machine中運行。 雖然這應該會保護使用者的電腦,但 VM escapes可能而且確實會發生。 最好將區塊鏈軟體視為不受信任,因為它會定期運行不受信任(並且可能是惡意)的代碼。
智慧合約的生命週期
大多數軟體在過時並被淘汰或更新時都會“終止”。 而智慧合約是不可變動的區塊鏈的一部分,因此是永久性的。 雖然開發人員可以為智慧合約建立“kill switch”或update機制,但代碼永遠存在。 如果駭客找到繞過這些機制的方法,即使使用休眠中的智慧合約,他們也可以利用並造成損害。
外部介面
智慧合約的主要用途之一是允許外部組件與區塊鏈交互。 雖然這大大提高了區塊鏈的能力,但也意味著這些外部組件也會是區塊鏈的安全考量範圍內,並且也是資安威脅面的一部分。 易受攻擊的外部組件可能會危及它們連接的智慧合約,反之亦然。
智慧合約的代碼稽核
智慧合約的價值和潛力意味著保護它們很重要; 然而,這是一個大問題。 智慧合約的技術的問世並沒有很久,這意味著目前它沒有與傳統網路安全相同水準的專業知識和資安研究。這個技術的新穎性和潛力激發了大批追隨者,資安研究已經確定並修正了幾個問題,但肯定還會有更多問題發生。
保護智慧合約的主要問題之一是該技術是如此新穎。 一些智慧合約平台,如以太坊,已經為智慧合約開發建立了自己的開發語言(Solidity)。 這意味著智慧合約開發人員用一種新的開發語言開發,而沒有人在這個語言是專家。 儘管 Solidity 開發人員和專家的數量在增加,但仍遠遠落後於傳統開發語言。所以企業用的Hyperledge Fabric區塊鏈由此而生,這是可以用開發人員使用一般性的傳統程式進行開發,如JAVA,NodeJs或Go等。更多Hyperledge Fabric可以參考本篇文章。
智慧合約的稽核
資安稽核是智慧合約開發的重要組成部分。 它們的價值和威脅暴露使得它們成為攻擊者的目標。 然而,缺乏該領域的專業知識使得尋找這一類的專家變得困難或昂貴。
智慧合約稽核有幾種不同的策略。 最好盡可能最大化執行稽核作業減少漏洞。 幾個潛在的測試和有用的工具(用於以太坊)包括:
- Expert Code Analysis:由一群智慧合約專家來審核
- Control Flow Analysis: 產生"程序控制流圖"並查找異常情況(例如以太坊常用的Mythril與Solgraph工具)
- Dynamic Code Analysis: 直接運行程式以查看代碼是如何作業並尋找異常情況(Manticore工具就有這一個功能)
- Manual Code Analysis: 人工方式一行一行的檢查程式
- Vulnerability-based Scanning:使用Oyente這一類的工具進行弱掃
- Symbolic Execution: 確定input執行後是不是我們要的output.Mythril工具可以進行此作業.
- Taint Analysis:檢查智慧合約中的哪些變量可以由執行它的人或智慧合約控制.Mythril工具可以進行此作業.
- Test Coverage:確保Unit test可以涵蓋所有智慧合約的代碼.可以使用solidty-coverage
- Linting:確保智慧合約符合樣式要求並且沒有語法錯誤.使用Solium, Solcheck, Solint