以太坊再爆高危漏洞!駭客增發ATN 1100萬枚token事件始末

PaaS小魔仙發表於2018-07-04



事情發生在5月中旬,ATN技術人員發現Token合約由於存在漏洞受到攻擊。不過ATN基金會隨後透露,將銷燬1100萬個ATN,並恢復ATN總量,同時將在主鏈上線對映時對駭客地址內的資產予以剔除,確保原固定總量不變。

以下是事件還原。

事件回顧

2018年5月11日中午,ATN技術人員收到異常監控報告,顯示ATN Token供應量出現異常,迅速介入後發現Token合約由於存在漏洞受到攻擊。以下是駭客的攻擊操作以及利用合約漏洞的全過程。

攻擊

這次攻擊主要分為4。首先,駭客利用ERC223方法漏洞,獲得提權,將自己的地址設為owner:

第二,駭客在獲得owner許可權後,發行1100w ATN到自己的攻擊主地址:

第三,駭客將owner設定恢復,企圖隱藏蹤跡:

最後,駭客從主地址將偷來的黑幣分散到14個地址中:

利用合約漏洞

ATN Token合約採用的是在傳統ERC20Token合約基礎上的擴充套件版本ERC223 ,並在其中使用了dapphub/ds-auth庫。採用這樣的設計是為了實現以下幾個能力:

1.    天然支援Token互換協議,即ERC20TokenERC20Token之間的直接互換。本質上是傳送ATN時,透過回撥函式執行額外指令,比如發回其他Token。

2.    可擴充套件的、結構化的許可權控制能力。

3.    Token合約可升級,在出現意外狀況時可進行治理。

單獨使用ERC223或者ds-auth庫時,

並沒有什麼問題,但是兩者結合時,

駭客利用了回撥函式回撥了setOwner方法,

從而獲得高階許可權。

ERC223轉賬代  碼如下:

當駭客轉賬時在方法中輸入以下引數:


·         from: 0x2eca25e9e19b31633db106341a1ba78accba7d0f——駭客地址;

·         to: 0x461733c17b0755ca5649b6db08b3e213fcf22546——ATN合約地址;

·         amount: 0

·         data: 0x0

·         custom_fallback: setOwner(address)

該交易執行的時候,

receiver會被_to(ATN合約地址)賦值,

ATN 合約會呼叫_custom_fallback

DSAuth中的setOwner(adddress)方法,

而此時的msg.sender變為ATN合約地址,

owner_引數為_from(駭客地址)

ds-auth庫中setOwner程式碼如下:

此時setOwner會先驗證auth合法性的,而msg.sender就是ATN的合約地址。

setOwnermodifier auth程式碼如下:

透過利用這個ERC223方法與DS-AUTH庫的混合漏洞,駭客將ATN Token合約的owner變更為自己控制的地址。獲取owner許可權後,駭客發起另外一筆交易對ATN合約進行攻擊,呼叫mint方法給另外一個地址發行1100w ATN。

最後,駭客呼叫setOwner方法將許可權復原 。

PS. 截至發稿前,ATN官方已聲稱:駭客將黑幣分散在14個不同的新地址中,而這些地址中並沒有ETH,暫時不存在立即轉賬到交易所銷贓的風險。

漏洞是怎麼造成的?

這次事件主要是利用了開發者對以太坊底層函式callcallcodedelegatecall的不當使用造成的。

callcallcodedelegatecall是以太坊智慧合約編寫語言Solidity提供的底層函式,用來與外部合約或者庫進行互動。不當的使用會造成很嚴重的後果。

例如,以下情況:


上述例子中,call函式的呼叫地址(如上圖中的_spender引數)是可以由使用者控制的,攻擊者可以將其設定為合約自身的地址,同時call函式呼叫的引數(如上圖中的_extraData引數)也是可以由使用者任意輸入的,攻擊者可以呼叫任意函式。

攻擊者利用上述操作,偽造成合約賬戶進行惡意操作,可能造成如下影響:

1.  繞過許可權檢查,呼叫敏感函式,例如setOwer

2.  竊取合約地址持有的代幣;

3.  偽裝成合約地址與其他合約進行互動;

因此,在編寫合約時,此類函式使用時需要對呼叫引數的安全性進行判定,建議謹慎使用。

怎樣避免此類漏洞

為了避免此類漏洞,我們提醒開發者應注意以下幾點。

1.  謹慎使用calldelegatecall等底層函式。此類函式使用時需要對呼叫引數進行限定,應對使用者輸入的call呼叫發起地址、呼叫引數做出嚴格限定。比如,call呼叫的地址不能是合約自身的賬戶地址,call呼叫的引數由合約預先限定方法選擇器字串,避免直接注入bytes可能導致的惡意call呼叫。

2.  對於一些敏感函式,不要將合約自身的賬戶地址作為可信地址

3.  準備修復措施,增加Guard合約禁止回撥函式向ATN合約本身回撥

4.  增加黑名單合約,隨時凍結駭客地址。

5.    合約無小事

6.    綜合上文的分析,我們認為,call函式的使用一定要小心,在智慧合約開發中儘量避免call函式的使用,如果使用需要對其相關引數進行嚴格的限定。另一方面,智慧合約在部署之前應進行安全審計,比如程式碼的形式化驗證等。

7.    合約的安全審計,僅依靠開發者的經驗和能力總有隱患,過去業內的幾次合約漏洞事件也說明了這個問題,開發者務必要引起重視。


安全上鍊哪家強?華為雲區塊鏈服務(Blockchain Service)是面向企業及開發者的高效能、高可用和高安全的區塊鏈技術平臺服務,可以幫助企業和開發人員在華為雲上快速、低成本的建立、部署和管理區塊鏈應用。華為雲區塊鏈開放易用:基於Hyperledger1.0、kubernetes搭建,配置簡單,數分鐘內即可完成部署,提供全流程、多維度的自動化運維服務。安全隱私有保障!完善的使用者、秘鑰、許可權管理和隔離處理,多層加密保障,國密和同態加密等隱私處理,可靠的網路安全基礎能力,運營安全無憂。

歡迎體驗!https://www.huaweicloud.com/product/bcs.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543630/viewspace-2157301/,如需轉載,請註明出處,否則將追究法律責任。

相關文章