零時科技 || 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合約遭受攻擊事件詳解

通過交易數據分析,可以得出以下_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. 合約對於用戶資金授權應盡量避免授權最大值,如需授權最大值,則應嚴格判斷合約邏輯避免被其他人利用。