EOS.CYBEX孵化團隊鏈安科技發現EOS智能合約可能出現溢出漏洞

翻譯:鉛筆盒

據成都鏈安科技消息,其研發的面向區塊鍊形式化驗證平臺VaaS發現,如果合約開發者不夠仔細,則基於EOS區塊鏈的代幣合約也同樣可能存在BEC代幣合約類似的整數溢出漏洞。

眼下Beauty Chain 美蜜/BEC代幣被盜事件,由於一行代碼的安全漏洞引發其市值一夜歸零。該漏洞,由於合約開發者經驗不足導致合約代碼中的bathTransfer函數出現了整型溢出的漏洞,使黑客利用該漏洞盜走

57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 個BEC代幣。

針對此漏洞,成都鏈安科技通過其研發的VaaS形式化驗證平臺對EOS區塊鏈平臺的智能合約進行了整型溢出漏洞檢查和安全驗證,發現基於EOS平臺開發類似智能合約同樣可能出現整型溢出漏洞。下面以EOS代幣合約為例對該類型漏洞進行描述,該實例中設計並實現了一個向多人轉賬的智能合約核心函數transfer,其源代碼如圖1所示:

EOS.CYBEX孵化團隊鏈安科技發現EOS智能合約可能出現溢出漏洞

圖1 transfer函數源碼,同時向4個人轉賬

假設攻擊者調用該合約的transfer函數同時向4個人進行轉賬操作,並將balance參數的值設為2的63次方,函數調用過程如圖2所示,

EOS.CYBEX孵化團隊鏈安科技發現EOS智能合約可能出現溢出漏洞

圖2 黑客調用transfer函數同時向4人轉賬

接著,查詢以上地址餘額可發現,被轉賬人(tester)的餘額(100)沒有減少,而接收者(tester1、tester2、tester3、tester4)的賬戶餘額由於amount變量的溢出產生了非常大的數目(2的63次方),如圖3所示,

EOS.CYBEX孵化團隊鏈安科技發現EOS智能合約可能出現溢出漏洞

漏洞分析:balance是uint64數據類型,當取值為2的63次方時,由於小於uint64可取值的最大值,於是繞過了對balance的溢出邊界檢查;但是,當amount=balance*4計算時,amount便發生了溢出,使其值等於0,由於amount此時繞過了被減數大於減數的檢查,從而實現不消耗被轉賬人的balance的情況下,讓轉賬人的balance獲取非常大的值(2的63此方)。

為此,成都鏈安科技提示基於EOS的智能合約開發者,在開發智能合約的時候,應警覺整數溢出漏洞可能帶來的嚴重後果,對於每一步運算操作均進行邊界檢查。

針對此類問題,我們提出如下四種解決方案:

1. 在智能合約部署前,通過VaaS平臺進行安全性和功能正確性的形式化驗證,事先預防這類問題的發生;目前VaaS平臺已經支持以太坊,EOS,Fabric等主流區塊鏈平臺智能合約的形式化驗證,提供了高度自動化的智能合約漏洞檢查,安全性、功能正確性的形式化驗證。

2. 我們正在針對EOS,以太坊等平臺開發安全的智能合約開發模板,規範智能合約的開發,提高合約安全性,同時降低合約開發門檻和難度;

3. 向社區提供經過VaaS平臺驗證的合約核心模塊,用戶通過調用這些模塊開發自己的智能合約,以減少合約安全漏洞和邏輯漏洞的發生。如,我們正在基於EOS開發經過VaaS平臺形式化驗證的安全運算模塊(如類似太坊SafeMath模塊),以防止運算中導致的溢出和零除等漏洞。後續,我們將繼續為EOS、以太坊等多個社區開發更多的合約功能模塊,供合約開發者使用。

4. 建議合約開發者使用EOS區塊鏈平臺提供的智能合約編程Math

API接口則可防止該類型溢出漏洞。如,合約開發者可將uint類型的數據,先轉換成doule類型的數據,然後再使用EOS區塊鏈平臺提供的Math API中的double_add、double_mult等函數進行運算,最後將計算結果再轉換成uint類型數據輸出。通過我們的實驗和測試,發現該函數在進行大數相乘出現溢出的時候,會返回較大的值,無溢出出現,於是可以有效避免上述整型溢出的漏洞。但是VaaS同時也檢測出,Math API接口沒有對負數情況進行檢查,如果double運算的結果為負數,在將其強制轉換成uint類型時,將同時返回一個錯誤的較大的數值,針對此問題開發者需謹慎使用。

VaaS平臺將為建立安全的EOS社區不斷貢獻自己的力量。


分享到:


相關文章: