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