EOS智慧合約的一些問題總結和建議
近期,鏈安科技利用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時一定要搞清楚該函式的輸入限制和返回值形式,同時多多參考官方的示例實現。
另一方面,智慧合約安全作為一個關鍵的鏈上交易程式,一旦部署將無法撤銷。因此,專案方合約開發完成後除了自己做好測試外,選擇專業的第三方單位進行安全審計也是很有必要的,因為安全審計公司能多角度分析合約程式碼,找出開發者容易忽略的問題,做到事先預防安全事件的發生。
相關文章
- 3.06 EOS智慧合約(上)
- 3.08 EOS智慧合約(下)
- 3.10 EOS智慧合約案例實踐
- EOS系統合約總體介紹
- 【許曉笛】 EOS 智慧合約案例解析(3)
- 【許曉笛】 EOS 智慧合約案例解析(2)
- 【許曉笛】 EOS智慧合約案例解析(1)
- EOS開發完全解析(六):手摸手實現第一個EOS智慧合約——Hello EOS
- 【劉文彬】【精解】EOS智慧合約演練
- EOS智慧合約與DApp開發入門教程APP
- EOS基礎全家桶(十三)智慧合約基礎
- 【許曉笛】開發第一個 EOS 智慧合約
- EOS基礎全家桶(十五)智慧合約進階2
- 【原】深度學習的一些經驗總結和建議 | To do v.s Not To Do深度學習
- JS/JSP學習的一些問題總結JS
- 回溯問題Python框架總結——排列組合問題Python框架
- Kotlin知識點總結與初寫時的一些建議Kotlin
- 2021敏捷軟體工程需求評審答辯問題總結與建議敏捷軟體工程
- EOS.CYBEX孵化團隊鏈安科技發現EOS智慧合約可能出現溢位漏洞
- WKWebView的一些問題彙總WebView
- 智慧合約Dapp專案如何開發構建?智慧合約開發原始碼示例APP原始碼
- 總結 90 條寫 Python 程式的建議Python
- 一些小問題彙總
- Python Requests庫文件連結404問題解決及防止重複問題的建議Python
- NFT鑄造智慧合約平臺開發方案部署原始碼建議參考原始碼
- 問題總結
- EOS系統合約鏈賬戶介紹
- USACO 比賽指導建議和常見問題
- EOS開發(1.3-1.4)以上版本 智慧合約DAPP全棧使用指南APP全棧
- 工作總結!日誌列印的11條建議
- 實施PLM系統的總結及建議
- 前端面試題總結——綜合問題(持續更新中)前端面試題
- Git常用命令總結及一些問題思考Git
- 智慧合約從入門到精通:智慧合約的前世今生
- EOS原始碼解析 eosio賬號預設合約原始碼
- 兩個流程鏈路問題的排查和總結
- 2020年的一些思考和總結
- redo log 和 binlog 的一些總結