賬戶餘額無故消失,Opyn 合約爲何被盜?

作者:成都鏈安

**
**

編者注:Opyn 自我定位爲一個保護平臺,但其核心是建立在「凸性協議」上的期權平臺,是一個通用的期權協議。凸性協議具有相當大的可塑性——允許開發者創建各種不同參數的期權,例如 (1) 歐式與美式,(2) 標的資產,(3) 看漲或看跌 (4) 抵押品類型等。

**
**

前期提要:8 月 5 日凌晨四點,有用戶在 Opyn 論壇反饋自己的賬戶餘額無故消失,並有用戶發現可疑的交易信息,如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

Opyn 項目方對情況初步分析後做出迴應表示:已經轉移了資金,並正在尋找問題原因。

賬戶餘額無故消失,Opyn 合約爲何被盜?

事件發生後不久,官方再次發文迴應此次事件稱:

遭到黑客攻擊,並已對可能遭受攻擊的資產進行轉移,但此次漏洞只涉及 ETH 合約,並不影響其他合約。

賬戶餘額無故消失,Opyn 合約爲何被盜?

成都鏈安-安全實驗室第一時間對本次事件進行跟蹤分析,以下是態勢感知系統檢測到的攻擊者合約地址:

0xe7870231992ab4b1a01814fa0a599115fe94203f

0xb837531bf4eb8ebfa3e20948bd14be067c18cbd3

0xb72e60ea1d0c04605f406c158dce9ac6ae6d224c

攻擊者攻擊方式還原:

  1. 攻擊者調用合約向合約發送 n 個 USDC 增加抵押,並得到合約幣 oETH

  2. 攻擊者調用合約發送 ETH 進行抵押,並銷燬 oETH 以贖回自己的 USDC

  3. 攻擊者贖回自己抵押的 ETH。

如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

在步驟二中,攻擊者調用 exercise 函數,並向其傳遞了兩個地址 A (攻擊者自己地址)、B (他人未贖回 USDC 的地址)和兩倍自己應得的 USDC,程序正常執行,這導致地址 B 的資金受損。

**
**

技術分析

0x56de6c4bd906ee0c067a332e64966db8b1e866c7965c044163a503de6ee6552a 爲例,攻擊者通過合約 0xe7870231992ab4b1a01814fa0a599115fe94203f 對合約 0x951D51bAeFb72319d9FBE941E1615938d89ABfe2 發動攻擊,此筆交易中共獲利 $9907。如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

攻擊者首先調用了 addERC20CollateralOption 函數,向合約中發送了 9900 個 USDC,如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

此函數中的 addERC20Collateral(msg.sender, amtCollateral); 負責代理轉賬 USDC;函數中的 issueOTokens(amtToCreate, receiver); 負責鑄幣 oETH,此筆交易鑄幣 30 個 oETH 併發送給了攻擊者,如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

在此完成後,攻擊者的 vault 參數進行了變化。vault.oTokensIssued 和 vault.collateral 分別更新 300000000 和 9900000000 爲如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

賬戶餘額無故消失,Opyn 合約爲何被盜?

然後攻擊者開始將 oETH 兌換出來。

調用 exercise,構造參數 oTokensToExercise 爲 60,vaultsToExerciseFrom 爲兩個地址,其中一個是也滿足條件的他人地址。如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

Exercise 函數運行_exercise(vault.oTokensIssued, vaultOwner); 分支,將 30oETH 相應比例的 USDC 發送給調用者,如下圖所示:

賬戶餘額無故消失,Opyn 合約爲何被盜?

我們可以注意到,在最終轉賬時,_exercise 是將 USDC 轉給了 msg.sender, 也就是攻擊者。

我們回頭看 exercise 中存在者 for 循環,攻擊者輸入的 oTokensToExercise 爲 60,所以合約在驗證了第二個地址符合條件的情況下,依舊會將餘額轉給 msg.sender, 也就是攻擊者。這就使得攻擊者可以獲得兩次 USDC,從而獲得利潤。

總結建議

此次事件攻擊者利用了 exercise 函數的邏輯缺陷。此函數在進行最後轉賬前並未驗證調用者是否有權限贖回此地址的 USDC,只是簡單的驗證了地址是否可以贖回。屬於代碼層的邏輯漏洞,並且根據官方回覆,此合約是經過安全審計的。

在此提醒各項目方:

  1. 項目上線前應當進行足夠有效的安全審計,最好是多方審計

  2. 對於合約的應當設置暫停合約交易等功能,在發生安全事件時,可以以保證資金安全

  3. 安全是一個持續的過程,絕非一次審計就能保平安

後續

Opyn 官方 8 月 5 日最新發文,就平臺漏洞導致 ETH 被盜事件作出更新:

我們對早期用戶表示最大的尊重和同情,並希望我們的社區做出正確的事。我們將全額賠償受漏洞影響的 ETH 看跌期權賣家。我們將在接下來的 3 天內提供更多詳細信息的報銷流程。對於 ETH 看跌期權買家,請按高於市場價 20% 的價格贖回看跌期權。對於所有用戶,除非通過上述 Opyn 團隊定義的過程,請不要創建任何新的 oETH Put 保險庫或買賣 oETH Put。


推薦閱讀:

  • 特約觀察 | 大歷史背景下的深圳經濟特區數據條例

  • 以太坊 2.0 能減少網絡堵塞嗎?

  • 比特幣破萬,牛市來了嗎?| 一週問答熱議

  • 陀螺解讀 | 區塊鏈發展“福田措施”:強勁補貼,加速區塊鏈產業集聚

  • 區塊鏈服務網絡 BSN 宣佈集成以太坊等六大知名公

  • 陀螺私享會 | 數據要素價值凸顯,區塊鏈應用正當時

  • YFI 引爆幣圈,DeFi 未來幾何?| 一週問答熱 點