DeFi平台Opyn智能合約漏洞詳解:攻擊者空手套白狼
PeckShield
2020-08-06 06:32
本文约1846字,阅读全文需要约7分钟
狡猾的攻擊者,先向自己發起偽裝的交易,利用這筆ETH 可以重複使用的特性,再次向賣方用戶發起轉賬,進而騙取賣方已經抵押的數字資產。

北京時間2020年08月05日,DeFi 期權平台Opyn 的看跌期權(Opyn ETH Put)智能合約遭到黑客攻擊,損失約37萬美元。

Opyn 是一個通用期權協議,於今年2月份轉型為保險平台,通過oTokens 為DeFi 平台提供可交易的ETH 看跌期權,以此錨定ETH 市場價格,為高波動性的DeFi 市場提供相對的穩定性。

PeckShield 安全團隊獲悉Opyn 平台遭受攻擊後,迅速定位到問題關鍵點在於:

攻擊者發現Opyn 智能合約行權(exercise)接口對接收到的ETH 存在某些處理缺陷,其合約並沒有對交易者的實時交易額進行檢驗,使得攻擊者可以在一筆對自己發起真實的交易之後,再插入一筆偽裝交易騙得賣方所抵押的數字資產,進而實現空手套白狼。

二級標題

二級標題

漏洞詳細過程分析

圖片描述

圖片描述

圖片描述

圖片描述

圖2. 重用傳入合約的ETH 來獲得抵押資產

函數處理ERC20 Token 時,和大部分的DeFi 項目做法一樣,使用transferFrom(),如代碼1882 行所示,從msg.sender 轉賬到address(this)。

但是當函數處理的資產為ETH 時,處理的方式就完全不一樣了。因為在Solidity 中,msg.value 的意思是合約調用者在調用具有payable 接口時所轉給該合約的ETH 數量,僅是一個量值,所以在合約代碼的1879 行中,檢查msg.value == amtUnderlyingToPay 僅能確保合約確實收到了amtUnderlyingToPay 數量的ETH,並不會對msg.value 的值造成任何影響。

圖片描述

圖片描述

圖3. 攻擊交易分析

在圖3中,我們通過Bloxy 瀏覽器顯示的調用過程來展示攻擊的過程。由於攻擊者吃掉了很多筆訂單,我們以其中一筆交易為例,向大家展示其攻擊邏輯:

1、攻擊者先從Uniswap 購入了75 oETH 為進一步調用函數行權做好籌備;

二級標題

二級標題

修復建議

PeckShield 安全團隊建議,在Solidity 中,合約可使用一個局部變量msgValue 來保存所收到ETH(即msg.value 的值)。這樣,在後續的步驟中通過操作msgValue ,就能準確的標記有多少ETH 已經被花費,進而避免資產被重複利用。此外,我們還可以使用address(this).balance 來檢查合約餘額來規避msg.value 被重複使用的風險。

PeckShield
作者文库