
4月22日中午,有黑客利用以太坊 ERC-20智能合約中BatchOverFlow漏洞攻擊BEC(美鏈的代幣“美蜜”)智能合約,成功向兩個地址轉出了天量級別的 BEC代幣,導致市場上海量BEC被拋售。此事使得當日BEC的價值幾乎歸零。64億人民幣瞬間蒸發。
4月25日,僅僅三天后,另一個智能合約SmartMesh(SMT)曝出漏洞,交易所表示,因SMT出現異常交易,各交易平臺暫停SMT的充提和交易。
這已經不是以太坊第一次被曝出智能合約漏洞問題。雖然以太坊僅僅誕生了四年,但是隨著人們越來越多地了解區塊鏈技術,以太坊的熱度逐漸增加。然而,最新的研究顯示,基于以太坊架構,被稱作是“最安全、最可靠、最方便”的智能合約技術卻漏洞百出。
2016年6月17日,發生了在區塊鏈歷史上沉重的一次攻擊事件。由于以太坊的智能合約存在著重大缺陷,區塊鏈業界最大的眾籌項目The DAO(被攻擊前擁有1億美元左右資產)遭到攻擊,導致300多萬以太幣資產被分離出The DAO 資產池。
同年11月,同樣基于以太坊的電子錢包服務商Parity,也出現了嚴重的安全問題,大約有1.5億美元的用戶資金遭到影響,突然無法正常使用和交易。
2017年7月21日,智能合約編碼公司Parity警告1.5版本及之后的錢包軟件存在漏洞,據Etherscan.io的數據確認有價值3000萬美元的15萬以太幣被盜。
2017年11月8日,以太坊Parity錢包再出現重大bug,多重簽名漏洞被黑客利用,導致上億美元資金被凍結。
為何智能合約漏洞頻出?難道就沒有辦法解決了嗎?
智能合約現在是區塊鏈中最為大家熟知的概念。但智能合約究竟是什么?很多人還是一知半解。智能合約就是一種儲存在區塊鏈中的計算機程序。

區塊鏈從本質上來說,就是一種共享的會計分類賬簿,可以利用虛擬加密貨幣和計算機網絡來追蹤與記錄各種資產的狀態,同時有效保證分類賬簿的安全,以防出現一些惡意篡改現象。
第一代區塊鏈技術就是比特幣。它能為互不相識的交易雙方提供牢固保障,保證雙方資金能夠按照合同規定順利完成轉賬。簡單地說,就是保證交易雙方不會受到欺詐等負面事件影響。
第二代區塊鏈技術就是以太坊。有了智能合約,交易雙方可以創建一個系統,從某一方的賬戶中取錢再存進余額不足的另一方賬戶中。從理論上來說,智能合約能夠用于各種各樣金融協議的代碼編寫,其中包括衍生合同、拍賣合同以及各種基于區塊鏈的第三方保管賬戶合同等等。
以太坊是一個開源的區塊鏈底層系統,就像安卓一樣,提供了非常豐富的API和接口,讓許多人在上面能夠快速開發出各種區塊鏈應用。目前已經有超過200多個應用在以太坊上開發。
而以太坊很大的特色就是能夠實現智能合約。所謂智能合約(Smart Contract),是密碼學家Nick Szabo在1994年首次提出以數字形式定義的一系列承諾(promises) ,包括合約參與方可以在上面執行這些承諾的協議。
智能合約的智能在英語中對應的單詞是Smart,和智能手機(Smart Phone)中的Smart意義相同,表示非常靈活的意思,并不是指人工智能(AI)。智能合約一旦設立指定后,能夠無需中介的參與自動執行,并且沒有人可以阻止它的運行。
以太坊去中心化的核心是其可以運行圖靈完備的腳本語言,而開發以太坊智能合約則有四種語言:Serpent、Solidity、Mutan、LLL。這些語言都是面向底層設計的語言。目前來看,Solidity 是首選語言,這是由于它內置了 Serpent 語言的所有特性,語法類則似于使用廣泛的 JavaScript。再加上 Solidity 的語言特性較少,該語言則可以更簡單地實現完備的智能合約體系。
以太坊是一個開源的有智能合約功能的公共區塊鏈平臺。區塊鏈上的所有用戶都可以看到基于區塊鏈的智能合約。但是,這會導致包括安全漏洞在內的所有漏洞都可見。智能合約語言 Solidity 自身與合約設計都可能存在漏洞。如果智能合約開發者疏忽或者測試不充分,而造成智能合約的代碼有漏洞的話,就非常容易被黑客利用并攻擊。并且越是功能強大的智能合約,就越是邏輯復雜,也越容易出現邏輯上的漏洞。
根據倫敦大學學院計算機科學系副教授伊利亞?謝爾蓋最新的研究論文中顯示,通過基于以太坊平臺的近100 萬份智能合約進行每份合約/10秒的分析后發行,有大34200份智能合約很容易遭到黑客攻擊。
此外,他們還通過3759份智能合約抽樣調查,發現其中3686份合約有89%的概率含有漏洞。以太坊作為一個分布式應用平臺,如此高的漏洞產生概率,不知道V神對此做何感想。

那么問題來了,以太坊智能合約為何充滿漏洞?
區塊鏈為智能合約提供可信執行環境,智能合約為區塊鏈擴展應用。而在以太坊上的智能合約,能夠控制區塊鏈上各種數字資產進行復雜的操作,隨著智能合約開始獲得越來越多的使用,人們也發現,就像現實世界的合同一樣,如果沒有認真審核的話,其中就有可能出現漏洞,并且被壞人利用。
開發智能合約需要一個全新的工程思維,它不同于我們以往項目的開發。因為它犯錯的代價是巨大的,并且很難像傳統軟件那樣輕易的打上補丁。就像直接給硬件編程或金融服務類軟件開發,相比于web開發和移動開發都有更大的挑戰。
據有關調查統計,以太坊主要漏洞情況描述如下表:



(本圖為雷鋒網設計并整理)
但其實究其根本,之所以如此多的智能合約出現同類漏洞,其背后是混亂的數字代幣發行現狀。
一些ICO(數字貨幣發行)通過智能合約發行代幣的代價,成本已經低之又低。業內人士指出,一個程序員只要花5分鐘,從網上抄一些智能合約代碼,稍做修改,就可以發行一個代幣。如果再寫個白皮書,找幾個知名顧問站臺,就可以在數字貨幣交易所里發行幾千萬甚至上億的項目。既沒有交易所的監管,又抱著“一夜暴富”的期待,這些發幣團隊的技術實力、對安全的防范意識,自然很難得到保證。
內參君還是要提醒的是,在數字貨幣的世界里,各種漏洞都潛伏其中,投資者需要做好漏洞隨時暴露的心理準備,同時,平臺自身的資質,也是投資者需要仔細考慮的重要因素。
據騰訊玄武實驗室的信息安全人員宋凱透露,其實很多虛擬貨幣交易在過程中都出現過安全問題,事后的解決方案大多是回滾,也就是將交易數據回溯到攻擊之前的狀態。這樣的補救措施只能使用戶賬戶中擁有同樣數量的新幣,但因為攻擊導致BEC幣價大跌,事實上,用戶并沒能真正挽回損失。
近日,以太坊基金會(Ethereum Foundation)開發者Alex Van de Sande公布了的一項有關“保險池”的提議,他認為這個方案能夠降低網絡分裂的風險——由于智能合約代碼漏洞造成資金凍結的事故,在尋找解決方案的過程中可能產生分歧,從而帶來分裂網絡的風險。
Van de Sande是以太坊Mist瀏覽器團隊的領導者,他在一篇文章中提到,創建一個存有專用保險資金的“贖回合約”(recovery contract)能夠降低個人或組織通過爭議性硬分叉來獲得部分或全部因為代碼漏洞而失去的資金。最典型的例子就是,在Parity的多重簽名錢包合約代碼庫爆出漏洞之后,錢包中價值3.2億美元的以太坊(ETH)被凍結,維持在無法花費的狀態。
不過,Van de Sande的提議最具爭議性的部分應該是其涉及了為超過51.3萬ETH發行贖回代幣的計劃,即因合約代碼庫錯誤鎖定在Parity多種簽名錢包中的以太坊數量。
Parity團隊表示無意通過爭議性硬分叉的方式取回資金,因此,Van de Sande認為他的這項計劃將會讓受害者(包括大多數以太坊核心開發者)成為這個新基金的利益相關者。這樣一來,這個保險池的創立將更有機會引起更多人的關注。
文 | 內參君