一、事件簡述
8月5日凌晨四點,有用戶在opyn論壇反饋自己的賬戶餘額無故消失,並有用戶發現可疑的交易信息,如下圖所示:
Opyn項目方再對情況初步分析後做出回應表示:已經轉移了資金,並正在尋找問題原因。
截至發稿前,官方發文回應此次事件:遭到黑客攻擊,並已對可能遭受攻擊的資產進行轉移,但此次漏洞只涉及ETH合約,並不影響其他合約。如下圖所示:
成都鏈安-安全實驗室第一時間對本次事件進行跟踪分析,以下是態勢感知系統檢測盜的攻擊者合約地址:
0xe7870231992ab4b1a01814fa0a599115fe94203f
0xb837531bf4eb8ebfa3e20948bd14be067c18cbd3
0xb72e60ea1d0c04605f406c158dce9ac6ae6d224c
攻擊者攻擊方式還原:
1、 攻擊者調用合約向合約發送n個USDC增加抵押,並得到合約幣oETH
2、 攻擊者調用合約發送ETH進行抵押,並銷毀oETH以贖回自己的USDC
3、 攻擊者贖回自己抵押的ETH 。
如下圖所示:
在步驟二中,攻擊者調用exercise函數,並向其傳遞了兩個地址A (攻擊者自己地址)、 B (他人未贖回USDC的地址)和兩倍自己應得的USDC ,程序正常執行,這導致地址B的資金受損。
二、技術分析
以交易0x56de6c4bd906ee0c067a332e64966db8b1e866c7965c044163a503de6ee6552a為例,攻擊者通過合約0xe7870231992ab4b1a01814fa0a599115fe94203f對合約0x951D51bAeFb72319d9FBE941E1615938d89ABfe2發動攻擊,此筆交易中共獲利$9907 。如下圖所示:
攻擊者首先調用了addERC20CollateralOption函數,向合約中發送了9900個USDC ,如下圖所示:
此函數中的addERC20Collateral(msg.sender, amtCollateral);負責代理轉賬USDC ;函數中的issueOTokens(amtToCreate, receiver);負責鑄幣oETH ,此筆交易鑄幣30個oETH並發送給了攻擊者,如下圖所示:
在此完成後,攻擊者的vault參數進行了變化。 vault.oTokensIssued和vault.collateral分別更新300000000和9900000000為如下圖所示:
然後攻擊者開始將oETH兌換出來。
調用exercise ,構造參數oTokensToExercise為60 , vaultsToExerciseFrom為兩個地址,其中一個是也滿足條件的他人地址。如下圖所示:
Exercise函數運行_exercise(vault.oTokensIssued, vaultOwner);分支,將30oETH相應比例的USDC發送給調用者,如下圖所示:
我們可以注意到,在最終轉賬時, _exercise是將USDC轉給了msg.sender,也就是攻擊者。
我們回頭看exercise中存在者for循環,攻擊者輸入的oTokensToExercise為60 ,所以合約再驗證了第二個地址符合條件的情況下,依舊會將餘額轉給msg.sender,也就是攻擊者。這就使得攻擊者可以獲得兩次USDC ,從而獲得利潤。
總結建議
此次事件攻擊者利用了exercise函數的邏輯缺陷。此函數在進行最後轉賬前並未驗證調用者是否有權限贖回此地址的USDC ,只是簡單的驗證了地址是否可以贖回。屬於代碼層的邏輯漏洞,並且根據官方回复,此合約是經過安全審計的。成都鏈安在此提醒各項目方:
1、 項目上線前應當進行足夠有效的安全審計,最好是多方審計
2、 對於合約的應當設置暫停合約交易等功能,在發生安全事件時,可以以保證資金安全
3、 安全是一個持續的過程,絕非一次審計就能保平安,與第三方安全公司建立長期的合作至關重要