騰訊上半年的報告統計,因區塊鏈自身問題導致的損失達到12.5億,其中智能合約的問題占了較大的比重。
9月13日晚,Armors Labs研究院院長劉鵬作為主講嘉賓參與到獵云財經空中課堂第十四期的分享當中,本期課題:智能合約安全問題的分析與警示。
以下為分享實錄(經編輯刪改):
主持人好,諸位幣圈兒的兄弟姐妹們,大家晚上好。歡迎大家參與獵云財經的分享會,我是劉鵬,來自Armors Labs研究院。
Armors Labs作為全球頂級的區塊鏈安全實驗室,從智能合約全生態平臺延展到整體的區塊鏈安全平臺,致力于打造一整套完整的智能合約防御、監測、故障阻斷以及升級體系,實驗室提供開源的智能合約引擎,并逐步適配所有流行的底層公有鏈。
01、區塊鏈安全
區塊鏈安全大致涉及到三個大的方面。
第一個,區塊鏈自身機制,這里包含了智能合約、51%攻擊、雙花攻擊等。
第二個,區塊鏈生態,包括交易所被盜、拒絕服務攻擊、交易所被釣魚等。
第三個,使用安全,包括賬號失竊、用戶被釣魚、私鑰泄露等。
我們今天要討論的重點內容是區塊鏈自身機制中智能合約安全的相關話題。
02、區塊鏈發展的路徑
區塊鏈的發展劃分為三個時代,分別定義為區塊鏈1.0、2.0和3.0。
2.0時代的典型代表是以太坊,我們現在正處于2.0時代,大家都在以數字貨幣為出發點,研究區塊鏈的發展,尋找具體業務的落地方式。
3.0時代的定義叫可編程社會,這個時代將是區塊鏈真正落地的時代,我們目前就是在向3.0時代大步邁進。
鏈塔數據BlockData發布了《2018年8月以太坊DApp數據分析報告》,報告顯示,以太坊上的DApp數量多達775個,累計交易筆數多達3億,累計交易金額超過59億ETH。
隨著越來越多的Dapp出現,生態的逐漸發展,區塊鏈將會真正進入到高速發展期。
03、DAPP與智能合約
智能合約是部署在區塊鏈上的一段代碼,目前所有的Dapp都需要通過智能合約來實現,像發行數字貨幣、投票等功能都離不開智能合約。
由于智能合約被部署到公鏈上以后,難以被修改,所以才具有了一定的公信力。
現在的智能合約大部分都與數字幣有關,因其對應的市場價值非常龐大,成為了攻擊者眼中的蛋糕。
騰訊上半年的報告統計,因區塊鏈自身問題導致的損失達到12.5億,其中智能合約的問題占了較大的比重。
04、智能合約問題導致區塊鏈安全事件頻發
FOMO3D是一款主要基于以太坊智能合約開發的區塊鏈游戲,這款游戲包含了閃拍、分紅機制、戰隊功能、邀請好友等功能,整體看起來還是比較全面的一款博弈類游戲。
FOMO3D游戲中的隨機糖果被攻擊者大量獲取,攻擊者通過攻擊合約生成的臨時合約不斷對FOMO3D的主合約進行攻擊,這是攻擊者利用智能合約的隨機數漏洞發起攻擊的一個典型代表。
由于FOMO3D的源代碼是公開的,在合約中可以看到,產生隨機數的種子是通過當前塊信息和msg.sender一起計算出來的,攻擊者可以在攻擊之前預先計算出結果,這樣就能增大自己中獎的概率,從而達到少投入、多獲益的目的。
另外一個是GOD.GAME被盜事件,2018年8月22日,GOD.GAME官方發布消息,因合約遭到攻擊,所有投注的ETH被盜走。
這個游戲被攻擊的原因與FOMO3D不同。
FOMO3D可以認為是攻擊者利用了以太坊的規則進行合理的操作,而GOD.GAME完全就是人為原因造成的了。
通過代碼分析發現GOD.GAME是由于類型轉換操作不當,導致dividends異常增加,攻擊者通過調用reinvest方法購買大量token,最后賣出token,獲利離場。
這是典型的由于智能合約代碼有漏洞導致的合約被攻擊事件。該游戲造成的損失比較小,有200多ETH。
對于有交易屬性的游戲合約,安全漏洞出現的情況非常普遍,除了類型轉換漏洞,還有可能有存在后門的情況。投資者在參與的時候一定要謹慎,投資有風險,出手需謹慎。
另一種常見攻擊叫溢出漏洞攻擊。
溢出漏洞是指當要表示的數據超出計算機所使用數據的表示范圍時,產生的數據的溢出。
我們用一個比較通俗的例子解釋一下溢出漏洞。上圖的這個算盤,很老的物件,大概民國時期的,叫5檔算盤,這個算盤能表示的最大數字是99999。
99999是這個算盤的極限了,思考一下,當我們在99999的時候再加1會怎么樣呢?
結果就是所有的算珠恢復原位,只能表示0了。
多出來的一位去哪兒了呢?多出來的一位溢出了。這個漏洞造成的第一個危險就是“歸零”,它可以讓一個賬戶的代幣瞬間變成或者是極小的一個數字。
而且當你反查交易記錄時,一切都是正常的。攻擊者利用這個漏洞,使判斷條件成立。
曾經BEC批量轉賬漏洞事件就是利用了沒有使用安全函數計算乘法,導致計算機結果超出范圍造成溢出事件,使判斷條件成立,然后就可以進行大量的轉賬了,最終BEC蒸發了60多億的市值,不僅僅是給投資者,也給項目方造成了極大的損失。
圖中紅框的地方是我們為了避免溢出漏洞而使用的安全數學函數。
在這種寫法里,我們除了做正向計算外,還要做一次逆向計算,以保證運算結果可逆,這樣的計算結果才是正確的。
也就是說做一個加法,我們計算a + b = c,安全函數在計算完之后一定要再計算一遍c >= a,這個結果成立,我們會認為這是一次有效的計算。雖然這樣增加了計算量,但是由于智能合約部署以后不可變更并且不可升級的特性,我們犧牲一點點效率,換來的是安全正確的計算結果,也是值得的。
所以在投資的時候一定要找開源代碼的來投,開源代碼一定要檢查是不是用了安全函數,但是要注意,有了安全函數,不代表用了安全函數。
前不久有這樣一個案例合約,項目方定義了安全函數,但是只有個別地方使用了。Transfer的操作里面沒有使用,這個時候我們給項目方提供了風險提示,項目方根據我們的指導,逐一將安全函數應用到位,最終才通過審核。
對于投資者來說,我們給出幾點建議。
第一,合約沒有開源的產品不要碰,風險太大;
第二,沒有經過安全機構審計的產品不要碰,可能存在潛在問題;
第三,投資風險,要謹慎操作,不要貪心。
Armors Labs為了幫助項目方規避智能合約中的問題,提供了基于以太坊的開源標準庫Armors Solidity和基于EOS的開源標準庫Armors EOSCpp。這兩個標準庫可以幫助項目方在以太坊和EOS上快速開發自己的代幣合約。使用標準庫的代碼,可以降低合約出問題的概率。在一定程度上,保障合約的安全。
我今天要分享的內容,就到這里,謝謝大家。
精彩問答:
Q1:劉老師,以太坊在2016年的時候,被The DAO攻擊,黑客盜取350萬個以太幣,結果是硬分叉成ETH和ETC,再結合現在的以太坊瀑布行情,以太坊為代表的智能合約設計是不是存在漏洞?區塊鏈的網絡是開放的,理論上無法阻止更多的計算機資源成為節點,若控制大部分計算機資源,就能重改賬本,實現51%雙花攻擊。
劉鵬:這個世界沒有完美的系統,51%的雙花攻擊也早就成現過。現在大量的算力被各大礦場占據,個人想掌握夠大的算力不實際。雙花攻擊本身是底鏈的安全問題,而智能合約的安全問題和它是兩種情況,不能一起討論。智能合約出問題,主要是項目方的開發團隊失誤造成的。這種情況,通過測試和安全審計可以很好地降低發生問題的可能。而51%是底鏈本身的機制造成的。隨著行業的發展,會有新的算法出現,進一步的優化這個問題。
Q2:劉老師,區塊鏈3.0是什么現在還不是十分確定,但終歸會出來。等到3.0落地的時候,基于以太坊上的2.0會怎么演變?消亡嗎?那伴隨的以太坊價格會不會非常低?