以太坊再爆高危漏洞!黑客增發(fā)ATN 1100萬枚token事件始末
5月11日,ATN Token遭受惡意攻擊,攻擊者利用DSAuth庫與ERC223搭配使用具有的混合漏洞,竊取了ATN的所有權。之后,攻擊者進行了竊取代幣操作。
這是一起嚴重的黑客攻擊事件,可以導致Token的供應總量發(fā)生變化。
歸根結底,黑客這次又是沖著智能合約的編寫漏洞來的。我們今天就來給大家從技術上揭底這次事件,并透過這次事件,奉上實用的合約編寫建議。在此鳴謝成都鏈安科技CEO楊霞提供的獨家資料。
事情發(fā)生在5月中旬,ATN技術人員發(fā)現(xiàn)Token合約由于存在漏洞受到攻擊。不過ATN基金會隨后透露,將銷毀1100萬個ATN,并恢復ATN總量,同時將在主鏈上線映射時對黑客地址內的資產予以剔除,確保原固定總量不變。
以下是事件還原。
事件回顧
2018年5月11日中午,ATN技術人員收到異常監(jiān)控報告,顯示ATN Token供應量出現(xiàn)異常,迅速介入后發(fā)現(xiàn)Token合約由于存在漏洞受到攻擊。以下是黑客的攻擊操作以及利用合約漏洞的全過程。
攻擊
這次攻擊主要分為4步。首先,黑客利用ERC223方法漏洞,獲得提權,將自己的地址設為owner:
第二,黑客在獲得owner權限后,發(fā)行1100w ATN到自己的攻擊主地址:
第三,黑客將owner設置恢復,企圖隱藏蹤跡:
最后,黑客從主地址將偷來的黑幣分散到14個地址中:
利用合約漏洞
ATN Token合約采用的是在傳統(tǒng)ERC20Token合約基礎上的擴展版本ERC223 ,并在其中使用了dapphub/ds-auth庫。采用這樣的設計是為了實現(xiàn)以下幾個能力:
天然支持Token互換協(xié)議,即ERC20Token與ERC20Token之間的直接互換。本質上是發(fā)送ATN時,通過回調函數(shù)執(zhí)行額外指令,比如發(fā)回其他Token。
可擴展的、結構化的權限控制能力。
Token合約可升級,在出現(xiàn)意外狀況時可進行治理。
單獨使用ERC223或者ds-auth庫時,
并沒有什么問題,但是兩者結合時,
黑客利用了回調函數(shù)回調了setOwner方法,
從而獲得高級權限。
ERC223轉賬代 碼如下:
當黑客轉賬時在方法中輸入以下參數(shù):
from: 0x2eca25e9e19b31633db106341a1ba78accba7d0f——黑客地址;
to: 0x461733c17b0755ca5649b6db08b3e213fcf22546——ATN合約地址;
amount: 0
data: 0x0
custom_fallback: setOwner(address)
該交易執(zhí)行的時候,
receiver會被_to(ATN合約地址)賦值,
ATN 合約會調用_custom_fallback
即DSAuth中的setOwner(adddress)方法,
而此時的msg.sender變?yōu)锳TN合約地址,
owner_參數(shù)為_from(黑客地址)
ds-auth庫中setOwner代碼如下:
此時setOwner會先驗證auth合法性的,而msg.sender就是ATN的合約地址。
setOwner的modifier auth代碼如下:
通過利用這個ERC223方法與DS-AUTH庫的混合漏洞,黑客將ATN Token合約的owner變更為自己控制的地址。獲取owner權限后,黑客發(fā)起另外一筆交易對ATN合約進行攻擊,調用mint方法給另外一個地址發(fā)行1100w ATN。
最后,黑客調用setOwner方法將權限復原 。
PS. 截至發(fā)稿前,ATN官方已聲稱:黑客將黑幣分散在14個不同的新地址中,而這些地址中并沒有ETH,暫時不存在立即轉賬到交易所銷贓的風險。
漏洞是怎么造成的?
這次事件主要是利用了開發(fā)者對以太坊底層函數(shù)call、callcode、delegatecall的不當使用造成的。
call、callcode、delegatecall是以太坊智能合約編寫語言Solidity提供的底層函數(shù),用來與外部合約或者庫進行交互。不當?shù)氖褂脮斐珊車乐氐暮蠊?/p>
例如,以下情況:
上述例子中,call函數(shù)的調用地址(如上圖中的_spender參數(shù))是可以由用戶控制的,攻擊者可以將其設置為合約自身的地址,同時call函數(shù)調用的參數(shù)(如上圖中的_extraData參數(shù))也是可以由用戶任意輸入的,攻擊者可以調用任意函數(shù)。
攻擊者利用上述操作,偽造成合約賬戶進行惡意操作,可能造成如下影響:
繞過權限檢查,調用敏感函數(shù),例如setOwer;
竊取合約地址持有的代幣;
偽裝成合約地址與其他合約進行交互;
因此,在編寫合約時,此類函數(shù)使用時需要對調用參數(shù)的安全性進行判定,建議謹慎使用。
怎樣避免此類漏洞
為了避免此類漏洞,我們提醒開發(fā)者應注意以下幾點。
謹慎使用call、delegatecall等底層函數(shù)。此類函數(shù)使用時需要對調用參數(shù)進行限定,應對用戶輸入的call調用發(fā)起地址、調用參數(shù)做出嚴格限定。比如,call調用的地址不能是合約自身的賬戶地址,call調用的參數(shù)由合約預先限定方法選擇器字符串,避免直接注入bytes可能導致的惡意call調用。
對于一些敏感函數(shù),不要將合約自身的賬戶地址作為可信地址。
準備修復措施,增加Guard合約禁止回調函數(shù)向ATN合約本身回調。
增加黑名單合約,隨時凍結黑客地址。
合約無小事
綜合上文的分析,我們認為,call函數(shù)的使用一定要小心,在智能合約開發(fā)中盡量避免call函數(shù)的使用,如果使用需要對其相關參數(shù)進行嚴格的限定。另一方面,智能合約在部署之前應進行安全審計,比如代碼的形式化驗證等。
合約的安全審計,僅依靠開發(fā)者的經(jīng)驗和能力總有隱患,過去業(yè)內的幾次合約漏洞事件也說明了這個問題,開發(fā)者務必要引起重視。
關于作者:
楊霞,成都鏈安科技CEO,創(chuàng)始人。電子科技大學副教授,最早研究區(qū)塊鏈形式化驗證的專家。一直為航空航天、軍事領域提供形式化驗證服務。主持國家核高基、裝發(fā)重大軟件課題等近10項國家課題。CC國際安全標準成員、CCF區(qū)塊鏈專委會委員。發(fā)表學術論文30多篇,申請20多項專利。
- 構建在區(qū)塊鏈系統(tǒng)上的Token經(jīng)濟設想
- 新的以太坊標準ERC721正式被確認
- 美國國會議員:對證券交易委員會澄清以太坊不是證券表示贊賞
- V神表示以太坊路線仍然將先Casper再分片
- TokenGazer創(chuàng)始人范宏達:做一個更加分布式的投資情報平臺
- 什么是CET CoinEx Token - CET
- CoinEx Token交易挖礦、收入分紅7月1日重磅上線
- Coinbase中期戰(zhàn)略:支持以太坊整個ERC-20令牌標準
- 以太坊再現(xiàn)漏洞或使Token供應量增發(fā)
- EOS仲裁第一案:針對token持有者私鑰被盜事件,將凍結懷疑被盜
信息首發(fā):以太坊再爆高危漏洞!黑客增發(fā)ATN 1100萬枚token事件始末
以太坊 token