Skip to content
On this page

隠された宝物:Backdoor チャレンジ攻略

分散型金融(DeFi)の広大な領域において、セキュリティは信頼を築くための基盤です。しかし、どれほど精巧なシステムであっても、予期せぬ脆弱性が潜んでいる可能性があります。Damn Vulnerable DeFi v4 の「Backdoor」チャレンジでは、「安全」を掲げたウォレット登録システムを深く分析し、その潜在的な欠陥を突き止め、「安全に」保管されている DVT トークンを取り戻すことが目的です。


チャレンジの背景

あるチームが、メンバーにより安全な Safe ウォレットのデプロイを促すため、ウォレット登録システムを構築しました。メンバーが Safe ウォレットの登録に成功するたびに、10 DVT トークンが報酬として付与されます。この登録システムは正式な Safe Proxy Factory と統合されており、厳格なセキュリティチェックを備えているとされています。

現在、Alice、Bob、Charlie、David の4名がすでに登録しており、登録システムは合計 40 DVT トークンを保有しています。

我々の目的は以下です: システムの脆弱性を発見し、すべての DVT トークンを指定されたリカバリーアカウントへ、安全に、かつ単一トランザクションで移動させること。


コアアイデア:Safe ウォレットのモジュール機構の悪用

WalletRegistry.sol のコアロジックは、Safe ウォレットが createProxyWithCallback により生成され、proxyCreated 関数が呼び出された際に、各種セキュリティチェックを実施する点にあります。

主なチェック内容:

  • ファクトリーアドレスとシングルトンの検証: 正しいファクトリーと Safe 実装が使用されているか
  • 初期化データの検証:Safe::setup が呼ばれているか
  • ウォレット構成の検証: 閾値(EXPECTED_THRESHOLD)が 1、所有者数(EXPECTED_OWNERS_COUNT)が 1 であるか
  • 所有者の検証: 登録済みの受益者であるか
  • フォールバックマネージャの検証:address(0) であること

すべて通過すると、そのウォレットに 10 DVT が送られます。


重要な突破口

Safe ウォレットのモジュール化設計が最大のポイントです。

Safe は外部モジュールを組み込むことで機能を拡張できます。ここで重要なのは:

👉 fallback manager はチェックされるが、「モジュール」はチェックされない


攻撃の流れ

攻撃者は以下の戦略を取ります:

1. カスタムモジュールの作成

  • TokenToRecovery トークンをリカバリーアカウントへ送る

  • EnableModule 他のモジュールを有効化する補助モジュール


2. Safe 作成時にモジュールを仕込む

Safe::setup のパラメータを悪用:

  • toEnableModule
  • dataenableModule(TokenToRecovery) をエンコード
  • fallbackManager → 条件を満たすよう調整

👉 これにより、初期化時にモジュールが有効化される


3. execTransactionFromModule の利用

TokenToRecovery 内で:

  • Safe::execTransactionFromModule を呼び出し
  • Safe 内のトークンをすべて回収

実装構成(MyContract.sol)

1. コンストラクタ

  • WalletRegistrySafeProxyFactory を初期化
  • モジュール2つをデプロイ
  • 各ユーザーごとに Safe を作成

各ループで:

  1. Safe を作成
  2. WalletRegistry に登録
  3. 10 DVT を受け取る
  4. モジュールで即座に回収

2. EnableModule

  • enableModule を呼び出すだけのシンプルなラッパー

3. TokenToRecovery

  • トークンと回収先を保持
  • execTransactionFromModule → 内部関数を実行
  • toRecovery → 全トークン送信

攻撃のまとめ

  1. playerMyContract をデプロイ

  2. コンストラクタで全処理を実行

  3. 各 Safe 作成時:

    • Registry のチェックを通過
    • 10 DVT を受け取る
  4. モジュールが即時発火

  5. トークンを recovery に送信

  6. これを4回繰り返し

👉 合計 40 DVT を奪取


重要ポイント

  • Safe のモジュール機構が本質
  • moduleData による初期化トリック
  • execTransactionFromModule の強力さ
  • 単一トランザクション制約の達成

このチャレンジは、Safe の柔軟性が逆に攻撃ベクトルになり得ることを示しています。 DeFi セキュリティにおいては、「何をチェックしているか」だけでなく、「何をチェックしていないか」を理解することが極めて重要です。

Built with AiAda