以太坊再爆高危漏洞!駭客增發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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於以太坊的Token開發步驟
- 在以太坊發行代幣Token系列教程(1)
- 以太坊官方 Token 程式碼詳解
- 以太坊錢包開發系列4 - 傳送Token(代幣)
- 【漏洞】OA辦公系統“烽火狼煙”,高危漏洞攻擊爆發
- 以太坊ERC20 TOKEN 0723 資料分析
- 以太坊連載(六):以太坊客戶端的選擇與安裝客戶端
- EPoD: 以太坊Geth客戶端拒絕服務漏洞 (CVE-2018-12018)客戶端
- 以太坊學習筆記————6、以太坊客戶端選擇與介紹筆記客戶端
- 【漏洞預警】Redis 頻發高危漏洞Redis
- 以太坊智慧合約 Hexagon 存在溢位漏洞Go
- 以太坊開發計劃
- 以太坊DApp開發指南APP
- EthBox以太坊開發套件,一鍵安裝部署以太坊開發環境套件開發環境
- 以太坊學習筆記————4、以太坊發展歷史回顧筆記
- Apache Struts 再曝高危遠端程式碼執行漏洞Apache
- 從以太坊"MorphToken事件"看智慧合約建構函式大小寫編碼錯誤漏洞事件函式
- 騰訊安全:微軟再爆高危漏洞,騰訊御點強勢攔截針對性攻擊微軟
- 以太坊連載(一):以太坊是什麼?
- 以太坊是什麼?以太坊交易可靠嗎?
- NVD - CVE-2022-42889:Apache Commons爆9.8分高危險漏洞Apache
- 以太坊客戶端 Geth 出漏洞,超過 2000 萬美元的數字貨幣被盜客戶端
- 獨家發現Chrome四大“高危”漏洞,360再獲谷歌官方致謝Chrome谷歌
- 如何取消以太坊智慧合約授權,防止被黑客盜取Token?黑客
- 以太坊智慧合約開發第二篇:理解以太坊相關概念
- 開發者的以太坊入門指南 | Jeth 以太坊系列線下活動
- 【雲原生攻防研究】Istio訪問授權再曝高危漏洞
- 30%手機受影響!高通晶片再現高危漏洞晶片
- CISA警告駭客利用ZK Java框架RCE漏洞Java框架
- 3.5 以太坊開發環境搭建開發環境
- 如何使用Meteor開發以太坊DappAPP
- 以太坊節點發現協議協議
- 理解以太坊DApp及開發工具APP
- 以太坊原始碼分析(37)eth以太坊協議分析原始碼協議
- 以太坊原始碼分析(18)以太坊交易執行分析原始碼
- 以太坊學習筆記————1、以太坊是什麼?筆記
- 以太坊學習筆記————7、以太坊賬戶管理筆記
- 思科修復高危漏洞;駭客盜取百萬條公民資訊;iOS 13.5 Beta 3改進戴口罩解鎖iPhoneiOSiPhone