天天看點

零時科技 || Rabby Swap合約遭受攻擊事件詳解

零時科技 || Rabby Swap合約遭受攻擊事件詳解

0x1 背景

2022年10月12日,Rabby Swap合約中存在疑似任意使用者資産轉移漏洞。Rabby Swap官方表示,如果有使用,請撤銷所有鍊上所有現有的 Rabby Swap 準許。對于沒有使用過 Swap 的人來說,錢包安全且不受影響。零時科技安全團隊及時對該事件進行分析。

零時科技 || Rabby Swap合約遭受攻擊事件詳解

0x2 攻擊交易資訊

攻擊者位址:

0xb687550842a24D7FBC6Aad238fd7E0687eD59d55

攻擊者合約:

0x9682f31b3f572988f93c2b8382586ca26a866475

Rabby Swap合約(漏洞合約未開源):

0x6eb211caf6d304a76efe37d9abdfaddc2d4363d1

攻擊交易之一:

0x366df0c20e00666749b16ae00475b3c41834dc659ebb29e059aa9bffa892c038

受害者位址之一:

0x0753cfbc797abfce05abaacbb1e6ae032feb5f1d

授權被盜HOP Token 代币位址:

0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC

0x3 攻擊步驟

分析攻擊者交易,可以明确攻擊者交易并不複雜,通過部署攻擊合約,調用攻擊合約0x8f965d0e簽名方法進行攻擊獲利。

零時科技 || Rabby Swap合約遭受攻擊事件詳解

攻擊者共部署兩份合約,進行了27次交易步驟相同的攻擊,這裡選一筆交易進行詳細分析。

0x366df0c20e00666749b16ae00475b3c41834dc659ebb29e059aa9bffa892c038

零時科技 || Rabby Swap合約遭受攻擊事件詳解

通過攻擊交易來看,此次攻擊似乎很簡單,攻擊合約給漏洞合約轉移0枚USDT,之後将使用者的資金轉移至攻擊者位址。由于官方漏洞合約未開源,并不能看到細節。但通過官方合約審計報告及調用合約簽名可以明确,本次攻擊主要調用的漏洞方法為_swap。

交易資料如下:

零時科技 || Rabby Swap合約遭受攻擊事件詳解

_swap代碼片段如下:

零時科技 || Rabby Swap合約遭受攻擊事件詳解
零時科技 || Rabby Swap合約遭受攻擊事件詳解

通過交易資料分析,可以得出以下_swap方法傳參:

IERC20 srcToken:    0xdac17f958d2ee523a2206206994597c13d831ec7(USDT)
uint256 amount:     0
IERC20 dstToken:    0x9682f31b3f572988f93c2b8382586ca26a866475(攻擊合約)
uint256 minReturn:  4660
address dexRouter:  0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc(HOP)
address dexSpender: 0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc(HOP)
bytes calldata data:
                    0000000000000000000000000000000000000000000000000000000000000100
                    00000000000000000000000000000000000000000000000000000183c1c270d7
                    0000000000000000000000000000000000000000000000000000000000000128
                    23b872dd(transferFrom(address,address,uint256))
                    0000000000000000000000000753cfbc797abfce05abaacbb1e6ae032feb5f1d(受害者位址)
                    000000000000000000000000b687550842a24d7fbc6aad238fd7e0687ed59d55(攻擊者位址)
                    00000000000000000000000000000000000000000000001982589c49e57f7f8d(轉賬資金470.56)
                    0000000000000000000000000000000000000000000000000000000000000000
                    0000000000000000000000000000000000000000000000000000000000000002
                    000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
                    000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
                    869584cd00000000000000000000000010000000000000000000000000000000
                    0000001100000000000000000000000000000000000000000000005f5265d161
uint256 deadline:   時間戳           

根據以上交易的傳參,繼續分析_swap内部邏輯(可以對照代碼來看)。

首先require判斷時間戳及傳入的dexRouter、dexSpender滿足條件;

之後将srcToken、dstToken計算得到srclsEth、dstlsEth均為false;

條件判斷執行srcToken.safeTransferFrom(攻擊者合約,漏洞合約,轉移資金0);

最後執行了最重要的一步操作,dexRouter.functionCallWithValue(data,value)。從上述_swap方法傳參可以知道,data資料進行了轉賬,攻擊者完成獲利;

在随後的邏輯計算和判斷中,由于dstToken參數攻擊者可控,是以攻擊者傳入攻擊合約進行資金轉移及判斷,最終繞過條件順利執行_swap方法,成功獲利。

0x4 攻擊核心

通過上述攻擊交易的詳細分析,可以發現攻擊者成功的原因主要是_swap方法中多個參數可控,包括dstToken位址可傳入任意合約位址進行資金轉移;data資料未進行嚴格判斷導緻可傳入攻擊者構造的惡意轉賬;amount資金轉移的數量沒有進行區間限制。除此之外,Rabby Swap合約對于使用者的資金授權未進行妥善處理,最終導緻使用者資金被盜。

0x5 事件後續

此次攻擊事件中,攻擊者擷取了多種代币,并将所有代币兌換為114枚ETH和179枚BNB,價值19萬美元,并将資金轉入Tornado.Cash混币平台,攻擊者初始資金(手續費)也來自Tornado.Cash。

發生攻擊事件之後,Rabby Swap官方呼籲使用者盡快撤銷多條鍊上對于Rabby Swap合約的授權,以下為合約位址:

ETH: 0x6eb211caf6d304a76efe37d9abdfaddc2d4363d1

Polygon: 0xf23b0f5cc2e533283ea97f7b9245242b8d65b26b

BNB: 0xf756a77e74954c89351c12da24c84d3c206e5355

Avalanche: 0x509f49ad29d52bfaacac73245ee72c59171346a8

目前Rabby Swap官方正在追蹤資金并表示會提供解決方案。

0x6 總結及安全建議

本次分析主要根據審計報告中代碼進行分析,由于合約未開源,合約代碼具體是否完全相同不得而知,從攻擊交易分析來看,本次攻擊事件中隻要有兩個方面的風險:第一對于Rabby Swap合約傳參未進行嚴格判斷導緻部分參數可控;第二Rabby Swap合約未對使用者在本合約的授權資金數量進行精确計算,導緻使用Rabby Swap合約後,仍有授權資金。對于以上安全事件,零時科技安全團隊給出以下建議:

  1. 合約上線前應對方法傳參進行嚴格判斷及測試,避免參數可控引起安全風險;
  2. 合約上線前進行多次安全審計,避免出現審計步驟缺失;
  3. 合約對于使用者資金授權應盡量避免授權最大值,如需授權最大值,則應嚴格判斷合約邏輯避免被其他人利用。