復盤:MOBOXがハッキングされた分析
執筆:Doris、SlowMistテクノロジー
背景
2024年3月14日、SlowMistのMistEyeセキュリティ監視システムの警告により、Optimismチェーン上の分散型貸付プロトコルMOBOXが攻撃を受け、約75万ドルの損失が発生しました。SlowMistのセキュリティチームはこの攻撃事件を分析し、その結果を以下に共有します:
(https://twitter.com/SlowMist_Team/status/1768167772230713410)
関連情報
攻撃者アドレス:
0x4e2c6096985e0b2825d06c16f1c8cdc559c1d6f8
0x96f004c81d2c7b907f92c45922d38ab870a53945
攻撃されたコントラクトアドレス:
0xae7b6514af26bcb2332fea53b8dd57bc13a7838e
攻撃トランザクション:
0x4ec3061724ca9f0b8d400866dd83b92647ad8c943a1c0ae9ae6c9bd1ef789417
攻撃の核心
今回の攻撃の核心点は主に二つあります。一つは、攻撃者がコントラクト内のborrow()関数の脆弱性を利用し、毎回この関数を呼び出すことで推薦者アドレスへの報酬配分がトリガーされることです。報酬の計算は移転されたトークンの数量に基づいているため、攻撃者は推薦者への報酬を再び攻撃されたコントラクトに戻すことで、次回の借入数量を増加させることができます。二つ目は、毎回borrow()関数を呼び出すことでプール内の一部のMOトークンが燃焼されるため、MOトークンの価格が継続的に引き上げられ、最終的に攻撃者は借入を繰り返し、報酬を重ねて利益を得ることができる点です。
トランザクション分析
全体の攻撃の流れは、脆弱性のあるborrow()関数をループで呼び出し、その後すぐにredeem()を呼び出して償還し、推薦者に配分されたトークンを攻撃コントラクトに戻すというものです。
borrow()関数を追跡して分析すると、毎回この関数を呼び出すことでプール内の一部のMOトークンが燃焼されることがわかります。
しかし、貸し出されるUSDTの数量はプール内のMOトークンの価格に基づいて計算されており、MOトークンの価格が燃焼によって継続的に引き上げられるため、最終的に攻撃者は少量のMOトークンで大量のUSDTトークンを借りることができるようになります。
さらに、毎回の借入は推薦者アドレスに分配報酬を与え、この関数は渡されたMOトークンの数量に基づいて計算されます。
しかし、推薦者アドレスも攻撃者(0x96f004c81d2c7b907f92c45922d38ab870a53945)によって制御されているため、攻撃者は借入操作を完了した後、この部分の報酬を戻すことで、次回の借入数量と分配報酬を重ねることができます。
以上のループ操作を経て、攻撃者はMOトークンの価格を引き上げ、最終的にごく少量のMOトークンでコントラクト内の大額のUSDTを借り出し、バランスの崩れたプールでUSDTを全て換金し、利益を得て退出します。
まとめ
今回の攻撃の核心は、攻撃者がborrow()関数がプール内の一部のトークンを燃焼させるメカニズムを利用し、資産を繰り返し借り入れ、プール内のトークンの価格を引き上げ、推薦者報酬を取得し、その後トークンを戻して再度借り入れることで、報酬を重ねて価格を操作することにあります。SlowMistのセキュリティチームは、プロジェクト側に類似の機能関数にロックアップ時間の制限を追加し、貸付の価格モデルを設計する際に様々な要因を考慮し、類似の事件が再発しないようにすることを推奨します。