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

買賣虛擬貨幣

一、事件簡述

2020-06-18(文中所提及時間均為utc時間),以太坊上的智慧合約bancornetwork被爆出存在嚴重漏洞。該漏洞由bancornetwork團隊和白帽最先發現,並第一時間對存在被盜風險的資金進行了轉移,涉及資金50w餘美元。

此次事件中,存在漏洞的合約地址主要有如下三個:

0x923cab01e6a4639664aa64b76396eec0ea7d3a5f

0x8dfeb86c7c962577ded19ab2050ac78654fea9f7

0x5f58058c0ec971492166763c8c22632b583f667f

2020-06-18 3:06:48,bancornetwork團隊利用此漏洞對存在被盜風險的使用者資金進行轉移,截至2020-06-18 6:56,bancornetwork團隊共計轉移資金約合$409,656。

另外兩個公開郵箱資訊的地址:

0x052ede4c2a04670be329db369c4563283391a3ea

0x1ad1099487b11879e6116ca1ceee486d1efa7b00

也於同一時間利用此漏洞對使用者資金進行轉移,分別轉出資金$131,889和$2346。

到目前為止(2020-06-19):

etherscan已經將存在此漏洞的合約進行標註,如下圖所示

圖一

bancornetwork團隊也已對此次事件做出了迴應,

詳情見

(https://blog.bancor.network/bancors-response-to-today-s-smart-contract-vulnerability-dc888c589fe4),

並於utc時間2020-06-17 21:35:53部署了新的bancornetwork合約,合約地址為

0x2f9ec37d6ccfff1cab21733bdadede11c823ccb0

二、原理分析

漏洞爆出後,成都鏈安安全團隊第一時間對本次事件進行跟蹤分析,根據鏈上分析結果發現,此次事件中漏洞產生的主要原因是智慧合約bancornetwork存在一個呼叫許可權為public的函式safetransferfrom,透過呼叫此函式,可以將使用者授權給智慧合約bancornetwork的資金轉出到任意地址。

由原始碼可以知,該函式為一個public函式,詳細程式碼如下圖所示:

圖二

safetransferfrom函式內部呼叫了execute函式。而execute函式的功能是呼叫safetransferfrom引數中的_token代幣智慧合約的transferfrom函式進行代理轉賬。execute函式原始碼如下圖所示:

圖三

我們透過一筆鏈上交易可以清晰的看到呼叫此函式的具體作用。如地址“0xc802”發起一筆交易,呼叫了智慧合約“0x5f58”(也就是bancornetwork)的safetransferfrom函式,使地址”0x8a39”中的0.000000000000000003代幣mfg傳送到”0x2955”(圖中的“bancor:whitehats...),具體如下圖所示:

圖四

以上就是本次事件漏洞的原理分析,該漏洞的原理十分簡單,是因為函式的呼叫許可權設定錯誤,將本應該只有合約本身呼叫的函式,設定成了任何人都可以呼叫。而當bancornetwork擁有使用者的授權額度時,任何人都可以透過呼叫safetransferfrom函式,以bancornetwork的身份對使用者的資金進行代理轉賬。

針對該漏洞,有兩點值得我們進行深入分析:

1. 為什麼bancornetwork合約的safetransferfrom函式會將許可權設定成public。

2. bancornetwork合約的主要功能是代幣轉換,並非一個錢包,為什麼使用者會有未使用的授權。

對於第一個問題,我們追蹤了safetransferfrom函式的呼叫情況,發現safetransferfrom函式只在handlesourcetoken函式中被呼叫,用於將使用者的代幣轉移到本合約中。handlesourcetoken函式原始碼如下圖所示:

圖五

既然只是在handlesourcetoken函式中呼叫,那麼顯然是沒有必要設定成public許可權,且根據業務來看,bancornetwork的主要作用是用於代幣交換,並不需要使用者主動呼叫safetransferfrom,也就沒有必要將safetransferfrom設定為public許可權。於是我們對比了合約中其他的幾個函式,這幾個函式均被設定成了public許可權。如下圖所示:

圖六

由此,針對第一個問題,我們推測將這些函式設定為public許可權可能是因為合約開發人員的疏忽。而目前來看(2020-06-19),bancornetwork團隊新部署的合約也驗證了這個推測。根據鏈上程式碼顯示,官方部署的新合約已經將相關函式許可權全部進行了更改(雖然其他的函式與此事件無關)。具體程式碼如下圖所示:

圖七

針對第二個問題,我們跟蹤了漏洞爆出後被轉移資金的地址,發現這些地址在對bancornetwork授權額度時,往往超過了所需要兌換代幣的數量,且在兌換完成後,並沒有收回額度。如下圖所示:

圖八

“0x624f”開頭的地址對bancornetwork合約授權了900000000000000個ong代幣,此額度已經超過了ong的發行量,相當於將“0x624f”所擁有的ong代幣全部授權給bancornetwork合約。而跟蹤“0x624f”開頭地址的交易我們發現,在進行完代幣兌換後,未使用完所有授權額度,但並未將授權額度收回。

綜上所述,我們推測可能是使用者考慮到要隨時使用,為了方便,一次性將所有代幣都授權給了bancornetwork合約。也可能是bancornetwork的前端對授權金額設定了預設值。但這種行為存在巨大的風險,一旦智慧合約爆發漏洞,資金極易被攻擊者竊取。而在對後續新的bancornetwork合約進行分析時發現,bancornetwork團隊和使用者似乎也意識到了此問題存在的巨大風險,並做出了相應的安全防護。如下圖九、十為使用者對新合約的授權情況,對比兩筆線上交易不難看出,兩次授權的時間間隔很短,當使用者成功兌換完代幣後,剩餘授權即被收回。

圖九

圖十

三、結語

bancornetwork本次爆出的漏洞,是一個較為簡單的漏洞,此類漏洞在程式碼審計過程中十分容易被發現,但此次漏洞的影響卻很大,上線僅兩天,涉及的資金就已經超過50w美元。幸而bancornetwork團隊及時發現並修復了漏洞,否則後果不堪設想。成都鏈安-安全研究團隊在此提醒各大智慧合約運營商,因區塊鏈合約部署後不可更改的特性,對比傳統軟體,上線前做好充分的程式碼審計十分重要,此次事件雖未造成太大的經濟損失,但勢必會讓使用者對bancornetwork團隊產品的安全性產生質疑。另外也提醒廣大使用者和運營商,在授權資金給第三方合約時,都應保持謹慎,切不可盲目相信“大公司”,對任何合約的授權都應當秉承最小原則,不要使自己的資金安全掌握在他人手中。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;