大家都還記得,前一段時間發生的BEC智慧合約的安全漏洞問題。近日,智慧合約安全問題再次上演,火幣Pro釋出公告,暫停EDU衝提幣業務,隨後EDU智慧合約被爆出存在嚴重漏洞!
在智慧合約漏洞頻出的背景下,我們利用形式化驗證工具對上百個智慧合約進行深入分析,又發現一個存在嚴重安全漏洞的智慧合約——RMC代幣合約!
這一漏洞造成的影響是,直接把曾經市值300多萬美元的RMC和一度飆到0.08美元的UET(UselessEthereumToken),變得一文不值!
RMC漏洞發現細節
下圖是RemiCoin (RMC)代幣中的一段程式碼:
這段程式碼實現了ERC20 代幣規範中的transferFrom函式,該函式的功能是使用者(_from)向另外一個使用者(_to)轉賬一定數量的代幣,但是在該函式中卻使用了錯誤的邏輯,在紅色框中要求只有:
allowed[from][msg.sender]
的值小於value時,程式碼才能繼續執行,而下面卻進行了:
allowed[from][msg.sender] -= value的操作,
造成了溢位錯誤,讓該函式具有嚴重的漏洞。
而攻擊者就可以利用這個漏洞,不需要私鑰即可無限制的將任意賬戶的RMC幣轉到指定的賬戶(_to),從而導致所有持有RMC幣的賬戶都有可能被盜取,嚴重危害了使用者的財產安全。
RMC代幣自去年7月進入交易所以來,代幣價格最高時達到近2美元,市值300多萬美元。12月,有攻擊者對該合約進行攻擊,並被爆出漏洞,隨後,代幣價格一路暴跌,跌至4月份的不到0.02美元。
此時,由於該漏洞導致不需要使用者的私鑰即可對賬戶餘額進行操作,這使得使用者手中的RMC代幣也變得毫無價值。
無獨有偶,與此類似的是,據悉名為UselessEthereumToken的代幣,號稱世界上第一個100%誠實的以太坊ICO,也出現了嚴重的安全漏洞:
上圖紅框中的邏輯是:
balances[_from] <= _value
且:allowed[_from][msg.sender] <= _value
且:balances[_to] + _value <= balances[_to]
才能進行轉賬操作,而接下來的運算導致:balances[_to]、balances[_from]、allowed[_from][msg.sender]均產生溢位。
攻擊者無需任何私鑰,只需呼叫該函式時,把傳入的引數_value設定得足夠大,即可操縱_from和_to的賬戶餘額。
最終,這個漏洞使得UselessEthereumToken就像其名字一樣,變得毫無價值。
截至發稿前,仍有攻擊者利用上述漏洞對兩個智慧合約進行攻擊,下圖為攻擊者利用漏洞大量盜取RMC幣:
下圖為攻擊者利用漏洞大量盜取UET幣:
不容忽視的安全問題
在這些漏洞的背後,往往是由於智慧合約開發者的經驗欠缺。而如何有效地防止此類漏洞的發生,成為了區塊鏈智慧合約開發中工作中的一個難題。安全是這場競賽的核心賽道,對各方而言,都不容忽視。
那麼這類安全事件該如何防範呢?各方又該如何避免漏洞的發生呢?
開發者應該提高自己的安全意識。現在發現的漏洞中,大多是因為直接使用普通的加減乘除符號,但卻沒有對可能溢位的情況作判斷,這就造成了資料溢位的隱患,而解決方法也很簡單,使用安全的運算庫library SafeMath就可以徹底避免資料溢位的問題。
專案方也應建立自己統一的安全標準,並對照安全標準嚴格執行,進行逐一檢查。在完成代幣的智慧合約編寫後,請專業的智慧合約審計公司,對合約程式碼用形式化驗證的方法進行審計,並由審計公司給出詳細的審計報告。
形式化驗證方法是基於數學的特種技術,適合於軟體和硬體系統的描述、開發和驗證。將此方法應用於智慧合約的驗證,能以邏輯推演的方式來進行系統性的快速審查,高效地解決智慧合約安全漏洞問題,避免了存在漏洞的合約釋出後,所造成的嚴重經濟損失。
交易平臺應該做好對專案方的稽覈工作和自身安全防護。對交易平臺中的專案,應要求其能提供智慧合約安全憑證,避免有漏洞的代幣對交易平臺的信譽產生不良影響。
普通使用者該如何選擇代幣
短短几個月以來,多個智慧合約被曝出存在安全漏洞,除了眾所周知的BEC、SMT、EDU、BAI之外,多個在交易平臺交易的智慧合約代幣,依舊存在安全隱患。
對廣大普通使用者來講,選擇有公信力的交易所在一定程度上可以降低風險;但更為重要的是,在投資代幣時要擦亮自己的眼睛,對不熟悉的代幣在購買時也要更為謹慎,選擇透過專業的程式碼審計平臺審計過的代幣合約才能有效地保障自己的數字資產的安全,不然就真的一夜回到解放前了。