以太坊再爆高危漏洞!駭客增發ATN 1100萬枚token事件始末
事情發生在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互換協議,即ERC20Token與ERC20Token之間的直接互換。本質上是傳送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的合約地址。
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引數)也是可以由使用者任意輸入的,攻擊者可以呼叫任意函式。
攻擊者利用上述操作,偽造成合約賬戶進行惡意操作,可能造成如下影響:
1. 繞過許可權檢查,呼叫敏感函式,例如setOwer;
2. 竊取合約地址持有的代幣;
3. 偽裝成合約地址與其他合約進行互動;
因此,在編寫合約時,此類函式使用時需要對呼叫引數的安全性進行判定,建議謹慎使用。
怎樣避免此類漏洞
為了避免此類漏洞,我們提醒開發者應注意以下幾點。
1. 謹慎使用call、delegatecall等底層函式。此類函式使用時需要對呼叫引數進行限定,應對使用者輸入的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 7.x爆高危漏洞Java
- 【漏洞】OA辦公系統“烽火狼煙”,高危漏洞攻擊爆發
- 雅虎Messenger曝高危漏洞 駭客可控制系統Messenger
- 騰訊安全:微軟再爆高危漏洞,騰訊御點強勢攔截針對性攻擊微軟
- 【漏洞預警】Redis 頻發高危漏洞Redis
- 獨家發現Chrome四大“高危”漏洞,360再獲谷歌官方致謝Chrome谷歌
- Apache Struts 再曝高危遠端程式碼執行漏洞Apache
- Rails框架再爆嚴重安全漏洞AI框架
- 【雲原生攻防研究】Istio訪問授權再曝高危漏洞
- 基於以太坊的Token開發步驟
- WinRAR(5.21)-0day漏洞-始末分析
- 在以太坊發行代幣Token系列教程(1)
- Struts2 兩大高危安全漏洞,網站安全再受考驗網站
- javascript 事件觸發以後函式指定時間後再執行JavaScript事件函式
- 【漏洞分析】Reflection Token 反射型代幣攻擊事件通用分析思路反射事件
- 以太坊錢包開發系列4 - 傳送Token(代幣)
- Oracle資料庫高危漏洞警告!Oracle資料庫
- 以太坊官方 Token 程式碼詳解
- 全球再迎超級颶風,黑客可利用微軟“蠕蟲級”高危漏洞暴擊全球黑客微軟
- 百度又爆SDK安全漏洞 駭客隨意連線手機取資訊
- Spring爆出“核彈”級高危漏洞Spring
- Spring框架再爆漏洞:資料繫結規則漏洞CVE-2022-22968Spring框架
- 思科修復高危漏洞;駭客盜取百萬條公民資訊;iOS 13.5 Beta 3改進戴口罩解鎖iPhoneiOSiPhone
- 微軟Exchange高危漏洞曝光,請及時更新!微軟
- Java又爆致命漏洞Java
- 微軟發現3個漏洞 稱駭客可控制機器(轉)微軟
- 問題定位 | XtraBackup 8.0 資料重建避坑事件始末事件
- oracle資料庫高危漏洞補丁集安裝Oracle資料庫
- 美國駭客發動“9·11”事件網路反擊戰 (轉)事件
- 鬥魚TV回應直播造人 鬥魚TV直播造娃娃事件始末事件
- 再爆安全漏洞,這次輪到Jackson了,竟由阿里雲上報阿里
- Docker Hub 中超過 30% 的官方映象包含高危漏洞Docker
- 某高校教學系統存在多個高危漏洞
- ERC223智慧合約ATN幣出現owner許可權竊取漏洞
- 以太坊ERC20 TOKEN 0723 資料分析
- Spring框架爆安全漏洞Spring框架
- Redis勒索事件爆發,如何避免從刪庫到跑路?Redis事件
- CISA警告駭客利用ZK Java框架RCE漏洞Java框架