成都鏈安:VETH 智能合約被攻擊事件分析

成都鏈安:VETH 智能合約被攻擊事件分析

2020 年 6 月 30 日下午 5:46,Beosin-OSINT 威脅情報系統發現 VETH 智能合約

(0x75572098dc462F976127f59F8c97dFa291f81d8b)

遭受攻擊,被盜 919299 個 VETH。成都鏈安·安全實驗室第一時間對本次事件進行跟蹤分析。

根據鏈上交易顯示:

攻擊者利用自建合約

(0x47ed415006c6f8052fff05fe983f31d6d24b8fdb)

通過 Uniswap 將 0.9 ETH 兌換爲 138 VETH,之後對 VETH 智能合約

(0x75572098dc462F976127f59F8c97dFa291f81d8b)

發起攻擊,在攻擊完成後自建合約進行自我銷燬。

本次攻擊成本僅 0.9 ETH,約合 200 美元。交易

(hash:0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224)

詳情如下:

成都鏈安:VETH 智能合約被攻擊事件分析

△圖 1

在盜幣成功之後,攻擊者將盜取的 VETH 通過 Uniswap 換成了 16 ETH。如下圖所示:

成都鏈安:VETH 智能合約被攻擊事件分析

△圖 2

▷具體攻擊流程如下:

1. 攻擊者創建攻擊合約,通過 Uniswap 將 0.9 ETH 兌換成 138 VETH;

2. 調用 VETH 合約 changeExcluded 函數,支付 128 VETH 手續費,使 mapAddress_Excluded[excluded] 的值爲 true;

3. 調用 transferFrom 函數,因 mapAddress_Excluded[excluded] 的值爲 true,可以直接進行轉賬;

4. 攻擊完成後,攻擊者通過 Uniswap 將盜取的 VETH 兌換成 16 ETH。

漏洞原理分析

此漏洞產生的主要原因是 changeExcluded 函數修飾符爲 external,使得任何人都可以調用該函數來繞過 transferFrom 函數內部的授權轉賬額度檢查,將合約的 VETH 代幣盜走

首先分析 transferFrom 函數,在函數內部先進行 !mapAddress_Excluded[msg.sender] 的判斷,按照正常邏輯,該結果爲 true 後,將進行授權轉賬額度的檢查。但是轉賬函數_transfer 的調用放在 if 語句體外,這就導致攻擊者可以通過將 mapAddress_Excluded[msg.sender] 的值設置爲 true 而繞過授權轉賬額度的檢查,直接進行 VETH 代幣轉移。transferFrom 函數源碼如下圖所示:

成都鏈安:VETH 智能合約被攻擊事件分析

△圖 3

通過分析修改 mapAddress_Excluded[msg.sender] 值的代碼發現,在 changeExcluded 函數內實現了對其值的修改,且該函數修飾符爲 external,可供外部調用。changeExcluded 函數源碼如下圖所示:

成都鏈安:VETH 智能合約被攻擊事件分析

△圖 4

在未對該值進行設置時,mapAddress_Excluded[excluded] 的初始值爲 false,最後 if 判斷結果爲 true,進入 if 語句體,調用_transfer 進行轉賬,要求支付轉賬金額爲:mapEra_Emission[1]/16 (跟進 mapEra_Emission[1] 的來源 emission,得知其值爲 2048*1018)即 128 VETH,然後 mapAddress_Excluded[excluded] 的值被設置爲 true。emission 的值如下如所示:

成都鏈安:VETH 智能合約被攻擊事件分析

△圖 5

總結

此次 VETH 被盜事件,漏洞出自 VETH 合約而非 Uniswap,VETH 合約代碼的函數訪問修飾符的錯誤使用導致任何人都能繞過授權轉賬額度的檢查,以極低的成本發起攻擊。

成都鏈安·安全實驗室在此提醒:各大智能合約運營商,在合約正式部署上線前應做好充分的代碼審計工作,即使是一些簡單的代碼錯誤也會財產損失。

成都鏈安:VETH 智能合約被攻擊事件分析

成都鏈安:Bancor Network 漏洞事件分析

成都鏈安 : Upbit 被盜 ETH 開始大規模轉至交易所

成都鏈安:Apache Tomcat 遠程代碼執行漏洞預警(CVE-2020-9484)

成都鏈安:VETH 智能合約被攻擊事件分析

來源鏈接:mp.weixin.qq.com