Abstract
2020年6月16日,BancorV2上線以太坊主網。
2020年6月18日,Bancor Network團隊發現了其BancorV2智能合約的安全漏洞。
漏洞導致攻擊者可盜取Bancor合約用戶的資產。
本文將介紹一下攻擊的細節和這次安全事件的始末。
漏洞原理
本次安全事件一共涉及三個有漏洞的智能合約。
- 0x8dfeb86c7c962577ded19ab2050ac78654fea9f7
- 0x5f58058C0eC971492166763c8C22632B583F667f
- 0x923cab01e6a4639664aa64b76396eec0ea7d3a5f
三個合約內容相似,都實現了 TokenHandler contract
該合約關鍵functions如下:
可見實現了三個關鍵函數
safeApprove
safeTransfer
safeTransferFrom
非預期的是,三個函數的Access Control全都是public,
意味着任何人可以調用該函數來進行轉賬操作。
攻擊者可以調用 safeTransferFrom函數,其中_from
設爲任何該合約的用戶,_to
設爲攻擊者自己的address。從而無限制的將用戶的token轉移到自己的錢包。
遺留問題
調用transferFrom時,需要_from
用戶有足夠的allowance
,如果_value
超過了allowance
應該會報錯纔對。
所以上文中_from
可以設置的用戶,必須有調用過approve函數來批准合約操作自己的token。
rescue
Bancor Network Team 發現漏洞後,立刻利用該漏洞,將所有用戶的token向BancorNetwork安全賬戶轉移。搶在被惡意攻擊之前,將合約中的token掏空。
對應的Transaction如下
- 0xc8021b971e69e60c5deede19528b33dcd52cdbd8
- 0x14fa61fd261ab950b9ce07685180a9555ab5d665
我們使用在線工具OKO Contract Explorer來分析一下
發現Transaction 中主要調用了 balanceOf 、 allowance 和 safeTransforFrom三個函數
其中SafeTransforFrom就是剛纔提到的漏洞函數
balanceOf和allowance用來查看當前token數量,和_spender
可以操作的Token數量
奇怪的是,每次調用allowance,返回的結果都極大。
如圖中,0x8dfe居然Approve了0xfffffffffffffffffffffffffffffffffffffffffffffecf2ccab1d2176d6ebb
這麼多的DATA
DATA的總髮行量也沒有這麼多呀
結合Bancor Network 官方Twitter的描述:
我們猜測是BancorV2用戶爲了操作方便,直接進行了infinite approve.
這也就解釋了上文中的allowance超額的問題。
Discussion
綜上所述,上線僅一天的BancorV2,由於函數的Access Control存在問題,存在盜筆風險。
受該漏洞影響的token總價值爲$409,656。
另一方面,從代碼審計的角度來講,Access Control Setting Error是很簡單很好理解的漏洞。
爲了Defi應用的安全,項目上線之前還是請安全團隊來進行一次代碼審計吧