2018年4月28日,成都鏈安科技向巴比特透露,其研發的面向區塊鏈形式化驗證平臺VaaS(Verification as a Service)檢測發現,基于EOS區塊鏈的代幣合約同樣可能存在BEC代幣合約類似的整數溢出漏洞。
最近BEC代幣被盜事件,由于一行代碼的安全漏洞引發其市值幾乎歸零。該漏洞是由于合約開發者在一段代碼中未使用safeMath保證計算的安全性,從而導致黑客利用batchTransfer函數出現了整型溢出的漏洞,黑客利用該漏洞盜走
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平臺開發類似智能合約同樣可能出現整型溢出漏洞。
以下為鏈安科技向巴比特提供的其設計的一個通過向多人轉賬的智能合約核心函數transfer實例,演示EOS智能合約漏洞:
源代碼如圖1所示:
假設攻擊者調用該合約的transfer函數同時向4個人進行轉賬操作,并將balance參數的值設為263,函數調用過程如圖2所示:
接著,查詢以上地址余額可發現,被轉賬人(tester)的余額(100)沒有減少,而接收者(tester1、tester2、tester3、tester4)的賬戶余額由于amount變量的溢出產生了非常大的數目(263),如圖3所示:
漏洞分析:balance是uint64數據類型,當取值為263時,由于小于uint64可取值的最大值,于是繞過了對balance的溢出邊界檢查;但是,當amount=balance*4計算時,amount便發生了溢出,使其值等于0,由于amount此時繞過了被減數大于減數的檢查,從而實現不消耗被轉賬人的balance的情況下,讓轉賬人的balance獲取非常大的值(263)。
針對此類問題,鏈安科技也提出解決方案:在智能合約部署前進行安全性和功能正確性的形式化驗證,事先預防這類問題的發生;針對EOS、以太坊等平臺開發安全的智能合約開發模板,規范智能合約的開發,提高合約安全性,同時降低合約開發門檻和難度;合約開發者使用EOS區塊鏈平臺提供的智能合約編程Math API接口可防止該類型溢出漏洞。如合約開發者可將uint類型的數據,先轉換成doule類型的數據,然后再使用EOS區塊鏈平臺提供的Math API中的double_add、double_mult等函數進行運算,最后將計算結果再轉換成uint類型數據輸出。但Math API接口沒有對負數情況進行檢查,如果double運算的結果為負數,再將其強制轉換成uint類型時,將同時返回一個錯誤的較大的數值,針對此問題開發者需謹慎使用。
EOS官方做出了如下回復:
Thomas在回復中對形式化驗證用于智能合約安全檢測表示稱贊,認為這一問題的出現主要表明智能合約開發者不夠仔細。同時還指出,核心的EOS原生令牌合約不會受到這種形式的攻擊。
本文轉載自《EOS智能合約存在溢出漏洞可能》,版權屬于原作者,已獲得授權轉載