Appearance
隠された宝物: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 のパラメータを悪用:
to→EnableModuledata→enableModule(TokenToRecovery)をエンコードfallbackManager→ 条件を満たすよう調整
👉 これにより、初期化時にモジュールが有効化される
3. execTransactionFromModule の利用
TokenToRecovery 内で:
Safe::execTransactionFromModuleを呼び出し- Safe 内のトークンをすべて回収
実装構成(MyContract.sol)
1. コンストラクタ
WalletRegistryとSafeProxyFactoryを初期化- モジュール2つをデプロイ
- 各ユーザーごとに Safe を作成
各ループで:
- Safe を作成
- WalletRegistry に登録
- 10 DVT を受け取る
- モジュールで即座に回収
2. EnableModule
enableModuleを呼び出すだけのシンプルなラッパー
3. TokenToRecovery
- トークンと回収先を保持
execTransactionFromModule→ 内部関数を実行toRecovery→ 全トークン送信
攻撃のまとめ
playerがMyContractをデプロイコンストラクタで全処理を実行
各 Safe 作成時:
- Registry のチェックを通過
- 10 DVT を受け取る
モジュールが即時発火
トークンを recovery に送信
これを4回繰り返し
👉 合計 40 DVT を奪取
重要ポイント
- Safe のモジュール機構が本質
moduleDataによる初期化トリックexecTransactionFromModuleの強力さ- 単一トランザクション制約の達成
このチャレンジは、Safe の柔軟性が逆に攻撃ベクトルになり得ることを示しています。 DeFi セキュリティにおいては、「何をチェックしているか」だけでなく、「何をチェックしていないか」を理解することが極めて重要です。