警惕智能合約漏洞:區塊鏈上的“空氣”幣
發布時間 2018-07-13
背景
區塊鏈是近年來最具革命性的新興技術之一,以其去中心化、不可篡改等特點,顛覆了金融等諸多行業的原有規則。區塊鏈現已進入3.0階段,“代幣合約”作為區塊鏈智能合約中應用最廣泛的一類,也成為攻擊者們的重要攻擊對象。
由于技術發展時忽略了安全先行的理念,導致眾多技術存在大量安全問題,與傳統程序一樣,代幣合約無法避免地存在安全漏洞。攻擊者可以利用漏洞隨心所欲地控制市場上的貨幣總量或任意賬戶的貨幣量,這樣使本來就無錨的貨幣徹底失去信用,成為“空氣”幣。
智能合約審計
啟明星辰ADLab近年來持續關注區塊鏈技術安全問題,通過對以太坊主鏈[1]智能合約進行研究,發現了400多個CVE漏洞。
智能合約漏洞會帶來諸多惡性結果,ADLab結合實際的安全事件,以及自主發現的漏洞,對其中的三個類別的漏洞給大家做了剖析。
重入漏洞
2016年6月,DAO攻擊事件在區塊鏈歷史上留下了沉重的一筆,黑客利用重入漏洞,直接導致以太坊的硬分叉。啟明星辰ADLab經過研究發現,以太坊的智能合約里面仍然存在重入漏洞。下面以BANK_SAFE合約為例進行舉例說明。
● 漏洞示例
BANK_SAFE合約中存在典型的代碼重入漏洞,當普通用戶賬戶調用Collect函數時,Collect函數的邏輯沒有任何問題,用戶可以順利的執行取款操作;但是當另一個智能合約調用BANK_SAFE合約的Collect函數時,會產生嚴重的安全隱患。
● 預防技術[2]
1. 使用內置的transfer()函數進行轉賬。由于tranfer()函數只發送2300gas,因此不足以合約之間的循環調用。
2. 采用check-effects-interactions模式的編碼。在BANK_SAFE合約中,[49]行的資金扣除操作應該放到[47]行之前。
3. 引入互鎖機制。添加一個狀態變量鎖定合約,預防重入調用。
超額鑄幣
2018年2月初,基于以太坊的Monero Gold(XMRG) Token在交易所的價格先猛漲787%,后迅速暴跌至崩盤,造成大量用戶經濟損失,其背后就是管理團隊利用預留的整數溢出漏洞進行超額鑄幣,并在交易所拋售造成惡性通貨膨脹,最后價值幾乎歸零。ADLab使用自動化審計工具發現大量智能合約仍然存在同類漏洞。下面以Genesis Vision合約進行舉例說明。
● 漏洞示例:CVE-2018-11335
Genesis Vision智能合約雖然引入了OpenZepplin的SafeMath數學運算庫,但其發行貨幣的函數mint()卻沒有使用安全運算函數,而是直接使用數學運算符。如果精心構造輸入參數value,在[188]行發生整數溢出,溢出后運算結果小于TOKEN_LIMIT,就可以繞過token發行上限,實現超額鑄幣,最終導致惡性通貨膨脹。這類鑄幣函數的執行一般需要管理員權限,因此可以看作是一種后門漏洞。
● 預防技術
禁止使用數學運算符,使用SafeMath運算庫[3]。
批量轉賬
2018年4月,黑客利用BEC智能合約漏洞攻擊美鏈BEC(美蜜幣),成功向兩個地址轉出了天量級別的 BEC代幣,導致海量BEC被拋售,使得當日BEC的價值幾乎歸零,64億人民幣瞬間蒸發。2018年7月,AMR合約中的漏洞被黑客惡意利用,導致AMR大量增發。這兩次攻擊事件都是由于批量轉賬函數中存在整數溢出漏洞,經ADLab研究發現,下表中的智能合約仍然存在同類漏洞。
● 漏洞示例:CVE-2018-13836
Rocket Coin (XRC)合約中的multiTransfer函數存在整數溢出漏洞,由于該函數的屬性是public,任意用戶可以調用該函數進行批量轉幣操作,不需要管理員權限。
從Rocket Coin代幣的TokenHolders列表可以看出黑客攻擊成功的痕跡。
從etherscan.io可以查看黑客攻擊時交易記錄:
https://etherscan.io/tx/0x606316fc06922ae34e6be865e64b23598d74a5e94712447dca37a7ac4c8b30a8#decodetab
從Input Data可以看出攻擊者精心構造了_amounts數組,數組中包含兩個元素,元素值皆為極大值,當執行到[72]行時將發生整數溢出。因此攻擊者只花費了極少的token,便完成批量大額轉賬。
● 預防措施
禁止使用數學運算符,使用SafeMath運算庫[3]。
總結
由于智能合約是一次性發布上鏈的,一旦出現漏洞將難以直接修補。
對于開發者而言,發現漏洞后只能發布新的智能合約然后做手動映射,在時間、人力、財力上會付出很大的代價。
對于投資者而言,智能合約上的漏洞很可能會使相應的代幣變成“空氣”幣,帶來更為直接的財產損失。
溫馨提示:
1、區塊鏈是新興技術,還需加強對其安全審計和監管能力的重視。
2、炒幣有風險,入市需謹慎,了解對行情,拒絕做“韭菜”。
3、重視國家法律法規,合理投資,健康理財。
參考鏈接
[1]
https://etherscan.io/contractsVerified
[2]
https://blog.sigmaprime.io/solidity-security.html
[3]
https://github.com/OpenZeppelin/zeppelin-solidity