安全|一行代碼就能逆轉人生,智能合約漏洞該注意了
來自專欄共享區塊鏈
導語:還記得BEC是怎樣從神壇上跌落的嗎?4個月前,因為一行智能合約代碼的漏洞,與美圖合作的公司美鏈 BEC遭受黑客攻擊,向兩個地址轉出了天量級別的 BEC 代幣,導致市場上海量 BEC 被拋售,該數字貨幣價值幾近歸零,給 BEC 市場交易帶來了毀滅性打擊。
智能合約漏洞的危害不容小看,作為區塊鏈2.0的核心,向來缺乏正規專業的安全監測體系。今日聞訊,騰訊正在開發智能合約安全檢測系統,一舉進軍區塊鏈安全領域。作為老牌的BAT三大巨頭之一,騰訊能否承擔起「守衛」智能合約安全的重任呢?
全文字數: 3328
閱讀時間: 5 分鐘
據不完全統計,2011年至2018年4月30日,因各類區塊鏈安全事件造成的損失達到20多億美金。其中因為智能合約漏洞而引發的安全事件損失金額達12.4億美元,佔比達6成,形勢可謂嚴峻。
騰訊於今年8月發布的《2018上半年區塊鏈安全報告》顯示,今年上半年,區塊鏈因自身機制安全、生態安全和使用者安全三個方面造成的經濟損失分別為12.5億美元、14.2億美元和0.56億美元,共計高達27億美元。僅上半年區塊鏈行業的安全問題損失金額就趕超前7年的總數據。
伴隨著區塊鏈熱潮,安全問題一併爆發。經整理分析,攻擊事件可大致分為四類安全事件:共識機制、智能合約、交易平台和用戶自身。
今天區塊鏈安全事件第1期,首先來談談因為智能合約導致的安全問題。
智能合約重大安全事件回顧
事件一:Bitfinex漏洞爆發,資金損失36%
Bitfinex在8月2日凌晨發布公告,發現了安全漏洞。該漏洞導致bitfinex全面停止交易,這將導致每位用戶的賬戶平均損失36%。
攻擊手法:利用熱錢包安全機制漏洞
事件二:The DAO被黑,損失超5000萬美元
黑客利用智能合約存在的漏洞攻擊The Dao,造成價值逾5000萬美元的損失。ETH市場價格從記錄高位21.50美元跌至15.28美元。
攻擊手法:利用遞歸調用(recursive calling)的漏洞
事件三:BEC智能合約漏洞爆出,一行代碼蒸發了6447277680人民幣
4月22日,OKEx暫停BEC交易和提現。因為BEC美蜜合約出現重大漏洞,攻擊者可以通過代幣合約的批量轉賬方法無限生成代幣,BEC價值瞬間歸零。
攻擊手法:利用整數乘法溢出漏洞
除了以上三個遭受重大損失的智能合約安全事件外,還有大量基於以太坊平台開發的代幣也接連被曝其智能合約存在漏洞。黑客利用漏洞入侵系統對智能合約用戶造成巨大損失,缺乏對智能合約基本的安全監測,出現的大部分漏洞都很低級。
智能合約安全漏洞類型
(1)隱私泄露
智能合約對區塊鏈上的所有用戶可見,包括但不限於標記為 private 的資源,或可造成隱私信息泄露。
解決方案:
函數可見性審核
敏感函數繼承許可權檢測
函數調用許可權檢測
(2)交易溢出與異常
由於智能合約本身的約束條件,如條件競爭、交易順序依賴等,造成的交易溢出與異常。
解決方案:
合約限制繞過審核
使合約失效,刪除地址位元組碼;
將所有合約資金髮送到一個目標地址。
(3)合約故障
由於智能合約代碼中可能存在的不合理故障處理機制,造成的異常行為。
解決方案:
調用棧耗盡審核
檢測棧高度限制,是否出現棧耗盡情況。
(4)拒絕服務
由於各種原因可能導致的拒絕服務風險。
解決方案:
拒絕服務審核
過多貨幣交易發生異常,導致交易回滾,最終導致合約拒絕服務。
智能合約漏洞具體舉例
(1)BatchOverFlow(批量溢出)漏洞
特點:自己「印」的Token也能用
BatchOverFlow漏洞中,當用戶輸入轉賬的數值超過設定的最大值,只要用戶賬戶餘額大於0,就可以直接將巨額的幣轉走,並且賬戶中收到的Token可以正常地轉入交易所進行交易,與真的Token無差別。
(2)ProxyOverflow(代理溢出)漏洞
特點:Token想發多少發多少
攻擊者調動向多用戶轉賬的函數觸發漏洞,由於做安全運算的函數簇沒有設計溢出判斷,攻擊者便能轉入 tokens,導致 totalTokensToTransfer 溢出,隨意增發代幣。加減乘除採用安全函數的合約只佔少數,實現轉賬功能的基本每個合約都有。
例子:
SMT整數加法溢出漏洞:proxyTransfer函數存在一個經典的整數溢出問題,攻擊者利用該漏洞不需要任何Token,就可以向一個地址轉入大量的Token。
BEC整數乘法溢出漏洞:BEC的某一段代碼忘記使用safeMath方法,導致系統產生了整數溢出漏洞,黑客可以通過轉賬手段生成大量原本合約中不存在的代幣。
EDU缺乏Safemath漏洞:在一個名為transferFrom 函數中,缺少 Safemath 驗證,利用溢出攻擊可以讓攻擊者從任何一個 EDU 餘額不為 0 的賬號內向另外一個賬號轉出 任意數量的EDU Token。
RMC代幣合約:transferFrom函數的錯誤邏輯產生溢出漏洞,攻擊者不需要私鑰即可無限制的將任意賬戶的RMC幣轉到指定的賬戶(_to),從而導致所有持有RMC幣的賬戶都有可能被盜取。
UselessEthereumToken:和RMC類似,因為溢出漏洞攻擊者無需任何私鑰,只需調用該函數時,把傳入的參數_value設置得足夠大,即可操縱_from和_to的賬戶餘額。
(3)transferFlaw(轉移錯誤)漏洞
特點:空手套白狼
攻擊者利用代碼編寫邏輯錯誤,攻擊者可以在在自己賬戶Token為零的情況下,把這些代幣從你的錢包里全部轉走。
(4)ownerAnyone(所有者任何人)漏洞
特點:冒名頂替,用你的身份花你的錢
攻擊者可利用此漏洞擁有某些基於ERC20的智能合同,甚至可能引發受影響智能合約的拒絕訪問。以下是典型的一類:
隱形Owner漏洞:此類漏洞的出現源於設計時,允許該項目團隊擁有最高許可權,從而黑客利用該缺陷獲取項目許可權後,通過修改地址方式將這部分任意資金轉出,導致該項目蒙受巨大損失。
例子:
Bancor(BNT):Bancor的管理員賬戶被竊取, 導致了暫存在Bancor合約里價值千萬的虛擬貨幣被提取到了一個私人地址。
(5) multiOver?ow(多重溢出)漏洞
特點:自由增發幣
multiOverflo中的每次交易都可能有比較高的交易費用,這個函數的作用是把多筆的單筆交易組成一個批處理,批處理有兩個參數,就是轉入方和轉入的數值,這裡面擁有多筆交易,它做成數組,代碼行227和228數值長度是一樣的,才是個有效的數據,數值長度就變成當前有多少個單個交易,代碼行249-251相當於把這些要轉出的交易的數值做了一個加法,獲取總值之後判斷轉出方有足夠的餘額去授權管理,但因為這個漏洞存在,所以能夠感覺到這個變樣有可能溢出,有可能變成零。
與代理溢出相似。
(6)代碼調用漏洞
特點:就是不置0,又雙叒叕……操作
在調用其他函數的操作完成之前,這個被調的函數可能會多次執行。這可能會導致智能合約中的幾個函數以破壞性的方式進行交互。
合約編程和一般的編程不一樣,更注重安全可靠,盡量不要用遞歸。合約代碼盡量是封閉的,既不調用未知的代碼,也不被未知的代碼調用(通過加某些特殊判斷語句)。
例子:
The DAO:因為用戶的餘額一直沒有被置0,直到函數執行的結束。第二次(之後一次)調用其他函數的操作仍會成功,並且會一次一次地取消對賬戶餘額的置0操作。調用withdrawBalance()時調用transfer() 函數,由於他們的餘額在此時還未被置0,所以即使他們已經收到退款,他們也還能轉移通證,這個漏洞也被用在了The DAO事件中。
(7)allowAnyone(允許任何人)漏洞
特點:黑客可是被「授權」偷的啊
該漏洞可允許攻擊者盜取他人代幣。
(8)ceoAnyone(控制任何人)漏洞
特點:我掙的錢怎麼進了你的口袋
在多個加密遊戲智能合同中識別出新的控制任何人(ceoAnyone)漏洞,利用該漏洞,攻擊者可以替換並控制管理員的許可權。可被人以調用方調用的DrugDealer()函數,允許調用者修改收益地址——ceoAddress。
其他:燃燒溢出 (burnOver?ow),allowFlaw(允許錯誤)漏洞,tradeTrap(交易陷阱)漏洞和evilRe?ex漏洞。
智能合約安全審計要做什麼?
安全審計模塊針對的漏洞包括代碼編程規範漏洞、代碼邏輯漏洞、函數調用漏洞、整型溢出漏洞、可重入攻擊漏洞、執行順序依賴漏洞、時間戳依賴漏洞、平台介面誤用漏洞。
針對這些漏洞,安全審計可以從3個時間段採取行動:
事前防護:代碼編寫過程中的規範化與代碼發布的漏洞檢測;
事中驗證:在智能合約虛擬機中完成代碼的執行與動態安全檢測;
事後彌補:對智能合約執行結果進行審計,確保執行不會出現偏差,執行結果在可信範疇。利益關聯方能夠及時發起申述,並進行裁決。
建立安全防護體系,可以從以下4點考慮:
代碼定型與發布時的驗證與檢查。無論設計者是否願意,每個發布的代碼將接受自動規則驗證檢查,從而確保靜態代碼審查通過,那些典型的溢出漏洞規則將無處藏身;
節點在執行合約中的動態驗證。該動態驗證將涵蓋本合約、關聯合約的驗證,並對執行過程中的狀態進行審查,從而實現各種執行漏洞進行彌補,即使黑客造出漏洞,各個合約執行者也會嚴密審視,並掛起可以執行操作;
合約執行完畢的合理性判斷。合約執行完畢的結果將通過一定的規則進行評判,同時引入人工智慧,對合約執行的合理區間進行分析,從而決定最終的結果輸出;例如對賬目進行複式審查或更高維度進行審查;
相關利益方的申訴機制與自動判決技術。在智慧合約部署的節點上,每個節點都內置基於規則的判決機制以及人工智慧審核機制,支持自動投票表決,從而保證一定的機會挽回損失。
以太坊不適合發行Token
基於ERC20協議的數字貨幣(以下簡稱為ERC20貨幣)實際上是以太坊上運行的智能合約。
以太坊只是一個記錄 dapp 執行結果的區塊鏈,其本身並沒有加密貨幣複式記賬所需的 utxo 模型。重要的 token 資產本身是需要貨幣級別的安全程度,以太坊目前的設計更適合遊戲積分之類的合約運行結果。
重要的 token 資產不適合構建在 ERC20 體系基礎之上。通過以太坊智能合約「發幣」容易,若不做好嚴格的代碼審計和安全防護,億級資金的損失只在一瞬間。
推薦閱讀:
※智能合約中的隨機數生成演算法
※truffle編譯部署以太坊智能合約
※美鏈BEC合約漏洞技術分析
TAG:智能合約 |