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)
詳情如下:
△圖1
在盜幣成功之後,攻擊者將盜取的veth透過uniswap換成了16 eth。如下圖所示:
△圖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函式原始碼如下圖所示:
△圖3
透過分析修改mapaddress_excluded[msg.sender]值的程式碼發現,在changeexcluded函式內實現了對其值的修改,且該函式修飾符為external,可供外部呼叫。changeexcluded函式原始碼如下圖所示:
△圖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的值如下如所示:
△圖5
總結
此次veth被盜事件,漏洞出自veth合約而非uniswap,veth合約程式碼的函式訪問修飾符的錯誤使用導致任何人都能繞過授權轉賬額度的檢查,以極低的成本發起攻擊。
成都鏈安·安全實驗室在此提醒:各大智慧合約運營商,在合約正式部署上線前應做好充分的程式碼審計工作,即使是一些簡單的程式碼錯誤也會財產損失。