背景の紹介
最近、Arbitrum チェーンに対する攻撃を検出しました。
https://arbiscan.io/tx/0xb91c4e0debaf0feb1f20c979eebc1282c8024ae299ef5903591badcf1f4938bb
攻撃を受けたプロジェクトはRamses Exchangeで、攻撃により合計約 27 ETH、約 70,000 米ドルが損失されました。 Ramses は、Arbitrum で立ち上げられた新しい分散型自動マーケット メーカー (AMM) です。このプロトコルは、RAM トークンと veNFT を介して動作します。
攻撃とインシデントの分析
この攻撃は 2 つのトランザクションに分割されます。最初のトランザクションはプレフィックス操作であり、トランザクション ハッシュは次のとおりです。
https://arbiscan.io/tx/0xa0795952a09f4aeaacf0abb213dedeaa7b7dd71c04eaa3fd22db33957e1c724c、これをトランザクション A と呼びます。
2 番目のトランザクションは正式な攻撃トランザクションであり、トランザクション ハッシュは次のとおりです。
https://arbiscan.io/tx/0xb91c4e0debaf0feb1f20c979eebc1282c8024ae299ef5903591badcf1f4938bb、これをトランザクション B と呼びます。
トランザクション A の主なアクション:
まず、攻撃者はデポジットを使用して 0.0001 ETH を WETH に交換します。
次に、攻撃者は Ramses Exchange を使用して 0.0001 WETH を RAM に引き換えました。
最後に、攻撃者は create_lock を使用して 1 RAM をロックし、ロック資格情報として ID 18785 (攻撃で使用された) の veNFT を取得しました。
トランザクション B の主なアクション:
攻撃者はまず、Ramses Exchange のすべてのプールの WETH 残高をチェックしました。
そこでフラッシュローンを利用してuniswapV3から12.2WETHを借りました。
その後、攻撃者はラムセスの賄賂メカニズムを使用して、WETH 残高に等しい WETH を各プールに転送します (後でプールからすべての WETH を引き出すため)。
次に、攻撃者は投票を通じて対応するトランザクション プールに投票します。
次に、攻撃者は getPeriodReward を通じて投票インセンティブを取得します。
getPeriodReward の具体的な実装を見てみましょう。
攻撃者は攻撃トランザクション A で ID 18785 の veNFT を取得したため、IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, 18785) は true になります。次に、次のように _getReward のコードを確認できます。
次に、攻撃者はリセットを使用して、上記のトランザクション プールの投票を撤回しました。
次に、分割を使用して、ID 18785 の veNFT の 0.99999 RAM を ID 18787 の新しい veNFT に分割します。脆弱性はここにあります。攻撃者がスプリットを使用して新しい veNFT を分割すると、ロック内の資金がすでに報酬を受け取っているかどうかを確認することなく、ロックに対応する RAM を使用して投票し、報酬を取得することができます。したがって、攻撃者は、reset を繰り返し使用して投票をリセットし、次に Split を使用して新しい veNFT を分割し、次に Vote を使用して投票し、最後に getPeriodReward を使用して投票報酬を取得する可能性があります。
攻撃者はUSDCとARBに対応する取引ペアに対しても同様の攻撃を実行しました。
要約する
この脆弱性の原因は、Ramses Exchange がロック RAM に対応する報酬を発行する際に、ロックされた資金が報酬を受け取ったかどうかを検証しなかったことにあります。その結果、攻撃者はリセットとスプリットを使用して veNFT を分割し、繰り返し報酬を受け取ることができます。プロジェクト当事者は、経済モデルとコード操作ロジックを設計するときに複数の当事者による検証を実施し、契約がオンラインになる前に相互監査のために複数の監査会社を選択するよう努めることをお勧めします。