一、事件概覽
臺北時間2021年3月9日,根據【鏈必安-區塊鏈安全態勢感知平臺(Beosin-Eagle Eye)】輿情監測顯示,去中心化交易所DODO上的wCRES/USDT資金池似乎被黑客攻擊,轉移走價值近98萬美元的Wrapped CRES(wCRES)和近114萬美元的USDT,據DODO官方回復目前團隊正在進行調查。
原文鏈接如下:
https://www.odaily.com/newsflashes/235047.html
△圖1
成都鏈安(Beosin)安全團隊第一時間針對該事件啟動安全應急響應,并將事件細節分析進行梳理,以供參考,其實,該事件本身來說并不復雜,其攻擊流程也非常簡單,但因該事件涉及到“閃電貸”“重入攻擊”等熱門話題,因此成都鏈安認為有必要對該事件進行發聲。
二、事件分析
該事件的攻擊原因主要在于合約的init函數未進行限制,從而導致攻擊者有權利進行調用,如圖2所示:
△圖2
經分析,攻擊者利用了DODO合約中提供的閃電貸工具,首先向合約轉移了兩種空氣幣。緊接著,發起了一筆閃電貸交易,在交易結束之前,調用合約的init函數將幣種指向空氣幣,從而躲過了閃電貸的歸還校驗,如圖3所示。
△圖3
三、安全建議
成都鏈安(Beosin)安全團隊認為,本起事件并不復雜,但值得敲響警鐘,引起廣大項目方的注意。具體而言,首先是DODO的閃電貸函數是進行了重入校驗的,但由于init函數并沒有添加重入校驗,所以導致了類似重入攻擊的發生。
另外,結合成都鏈安審計團隊以往對項目方的安全審計經驗,由于目前代碼的復雜度越來越高,模塊化也隨之越來越多,有許多項目方雖然都使用了init函數進行管理,但需要提醒的是,init函數在solidity中也僅僅只是一個普通函數,在此呼吁廣大項目方與開發者引起重視。切記,不要誤以為取名為“init”,就只能進行一次調用,
同時,我們建議,在日常的安全防護中,項目方也需要做好事無巨細的安全加固工作;通過借助第三方安全公司的專業力量,采用“形式化驗證與人工審核”結合的復合式審計方法,方能實現對項目面面俱到的全方位護航。