事情發生在5月中旬,ATN技術人員發現Token合約因爲存在漏洞受到攻擊。不過ATN基金會隨後透露,將銷燬1100萬個ATN,並恢復ATN總量,同時將在主鏈上線映射時對黑客地址內的資產予以剔除,確保原固定總量不變。html
如下是事件還原。安全
事件回顧網絡
2018年5月11日中午,ATN技術人員收到異常監控報告,顯示ATN Token供應量出現異常,迅速介入後發現Token合約因爲存在漏洞受到攻擊。如下是黑客的攻擊操做以及利用合約漏洞的全過程。app
攻擊運維
此次攻擊主要分爲4步。首先,黑客利用ERC223方法漏洞,得到提權,將本身的地址設爲owner:函數
第二,黑客在得到owner權限後,發行1100w ATN到本身的攻擊主地址:性能
第三,黑客將owner設置恢復,企圖隱藏蹤影:區塊鏈
最後,黑客從主地址將偷來的黑幣分散到14個地址中:加密
利用合約漏洞設計
ATN Token合約採用的是在傳統ERC20Token合約基礎上的擴展版本ERC223 ,並在其中使用了dapphub/ds-auth庫。採用這樣的設計是爲了實現如下幾個能力:
單獨使用ERC223或者ds-auth庫時,
並無什麼問題,可是二者結合時,
黑客利用了回調函數回調了setOwner方法,
從而得到高級權限。
ERC223轉帳代 碼以下:
當黑客轉帳時在方法中輸入如下參數:
該交易執行的時候,
receiver會被_to(ATN合約地址)賦值,
ATN 合約會調用_custom_fallback
即DSAuth中的setOwner(adddress)方法,
而此時的msg.sender變爲ATN合約地址,
owner_參數爲_from(黑客地址)
ds-auth庫中setOwner代碼以下:
此時setOwner會先驗證auth合法性的,而msg.sender就是ATN的合約地址。
setOwner的modifier auth代碼以下:
經過利用這個ERC223方法與DS-AUTH庫的混合漏洞,黑客將ATN Token合約的owner變動爲本身控制的地址。獲取owner權限後,黑客發起另一筆交易對ATN合約進行攻擊,調用mint方法給另一個地址發行1100w ATN。
最後,黑客調用setOwner方法將權限復原 。
PS. 截至發稿前,ATN官方已聲稱:黑客將黑幣分散在14個不一樣的新地址中,而這些地址中並無ETH,暫時不存在當即轉帳到交易所銷贓的風險。
漏洞是怎麼形成的?
此次事件主要是利用了開發者對以太坊底層函數call、callcode、delegatecall的不當使用形成的。
call、callcode、delegatecall是以太坊智能合約編寫語言Solidity提供的底層函數,用來與外部合約或者庫進行交互。不當的使用會形成很嚴重的後果。
例如,如下狀況:
上述例子中,call函數的調用地址(如上圖中的_spender參數)是能夠由用戶控制的,攻擊者能夠將其設置爲合約自身的地址,同時call函數調用的參數(如上圖中的_extraData參數)也是能夠由用戶任意輸入的,攻擊者能夠調用任意函數。
攻擊者利用上述操做,僞形成合約帳戶進行惡意操做,可能形成以下影響:
所以,在編寫合約時,此類函數使用時須要對調用參數的安全性進行斷定,建議謹慎使用。
怎樣避免此類漏洞
爲了不此類漏洞,咱們提醒開發者應注意如下幾點。
安全上鍊哪家強?華爲雲區塊鏈服務(Blockchain Service)是面向企業及開發者的高性能、高可用和高安全的區塊鏈技術平臺服務,能夠幫助企業和開發人員在華爲雲上快速、低成本的建立、部署和管理區塊鏈應用。華爲雲區塊鏈開放易用:基於Hyperledger1.0、kubernetes搭建,配置簡單,數分鐘內便可完成部署,提供全流程、多維度的自動化運維服務。安全隱私有保障!完善的用戶、祕鑰、權限管理和隔離處理,多層加密保障,國密和同態加密等隱私處理,可靠的網絡安全基礎能力,運營安全無憂。
歡迎體驗!https://www.huaweicloud.com/product/bcs.html