EOS智慧合約的一些問題總結和建議

FLy_鵬程萬里發表於2018-08-24

近期,鏈安科技利用VaaS-EOS自動化合約審計工具對多個EOS合約進行了安全審計,發現存在整型溢位等問題,部分合約實現不夠嚴謹。為了便於大家在EOS平臺寫出更加安全的智慧合約,我們將發現的一系列問題進行了分析和總結,並給出了建議。

主要存在的問題包括:

一、存在整型溢位錯誤;
二、許可權檢查不嚴謹;
三、API函式的不規範使用;

 

四、常規程式碼錯誤。

EOS合約存在不嚴謹之處

我們通過對已稽核的EOS合約分析,發現存在如下主要問題: 

1、存在整型溢位錯誤

使用自己的資料結構描述代幣,對代幣數值進行算數運算時未進行安全檢查。在誤操作時容易產生整型溢位錯誤,可能導致代幣量歸零甚至變成負數的嚴重結果!

 

2、許可權檢查不嚴謹

許可權檢查不嚴謹,造成邏輯漏洞。部分代幣合約設定了凍結賬戶和代幣的功能,然而使用者將檢查 “凍結” 的程式碼僅僅放在transfer(轉賬)函式中,從而導致執行issue(發行代幣)的時候不受“凍結”狀態影響,可以任意增發代幣。

 

3、API函式的不規範使用

注意EOS API函式的引數型別。如 string_to_symbol(uint8_t , const char *),第一個引數傳入的整型變數需要小於256,若使用該API前未對輸入進行檢查,則可能導致整型溢位,從而導致操作了錯誤型別的代幣,帶來嚴重後果。

 

 

4、常規程式碼錯誤

資料庫API使用不嚴謹,如multi_index中提供的get和find。其中get會檢查資料是否查詢成功,資料未找到則斷言退出,而find不會檢查資料查詢情況,需要使用者自行判斷,如果缺少判斷直接使用將會導致指標使用問題。

 

 

如何避免將會導致的風險

既然EOS代幣合約存在不嚴謹之處,那麼作為專案方應該如何去防範後期可能造成的風險呢?我們給出下面三種建議方法:

1.合約中使用官方提供的 asset 資料結構描述代幣,對代幣的算數運算同樣利用asset完成。

 

2.在使用multi_index的find函式時,一定要進行返回值的檢查。

 

3.對所有輸入都通過斷言檢查有效性,呼叫API函式前,檢查引數型別和大小。

 

最後,建議代幣合約參照EOS官方給出的eosio.token示例進行實現,避免疏忽從而導致安全檢查不完備。

專案方應該引起足夠的重視

EOS代幣合約雖然目前還沒有上線,但是專案方一定不能掉以輕心,避免再次重蹈整型溢位等問題引發的代幣被盜事件。

總體而言,我們認為從目前審計EOS代幣合約所遇到的問題來看,開發者在合約敏感程式碼(如操作代幣數額)前後,一定要做好引數限制和許可權檢查,使用EOS API時一定要搞清楚該函式的輸入限制和返回值形式,同時多多參考官方的示例實現。

另一方面,智慧合約安全作為一個關鍵的鏈上交易程式,一旦部署將無法撤銷。因此,專案方合約開發完成後除了自己做好測試外,選擇專業的第三方單位進行安全審計也是很有必要的,因為安全審計公司能多角度分析合約程式碼,找出開發者容易忽略的問題,做到事先預防安全事件的發生。

 

相關文章