Skip to content
On this page

S2C10: CREATE2 Double Constraint

1. 問題

2 つの制約条件(アドレスのプレフィックスが特定のバイトに一致するなど)を同時に満たすアドレスを持つコントラクトをデプロイする必要があります。CREATE2 の salt grinding を使用して適切な salt を見つけます。

2. 原因

コントラクトはアドレス制約をアクセス制御として使用しています — 特定のアドレスから呼び出された関数のみが実行できます。CREATE2 の決定論的デプロイにより、攻撃者はデプロイアドレスを「選択」できます。

3. 解決策

  1. コントラクトのアドレス制約条件を分析します(どのバイトが一致する必要があるか)
  2. 攻撃コントラクトを作成します
  3. salt grinding を使用して二重制約を満たす salt を見つけます
  4. 攻撃コントラクトをターゲットアドレスにデプロイします
  5. そのアドレスから mintFlag を呼び出します
solidity
// Foundry での Salt grinding
function findSalt() external {
    bytes32 salt = 0;
    while (true) {
        address predicted = address(uint160(uint256(
            keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, initCodeHash))
        )));
        if (checkConstraint1(predicted) && checkConstraint2(predicted)) {
            break; // 見つかった!
        }
        salt = bytes32(uint256(salt) + 1);
    }
}

4. 遭遇した落とし穴

二重制約 grinding の時間: 2 つの制約条件が組み合わさると、検索空間が非常に大きくなる可能性があります。効率的な計算方法が必要です。

5. 落とし穴の原因

追加の 1 バイト制約ごとに、検索空間は 256 倍に縮小します。2 つの制約の組み合わせは 256^2 = 65536 倍大きい検索空間を意味します(最悪の場合)。

6. 解決方法

Rust スクリプトまたは最適化された Foundry テストを使用して grinding を行います。2-3 バイトの制約の組み合わせであれば、通常 1000 万回未満の反復で見つかります。

7. 技術的ポイント

ポイント説明
CREATE2 アドレス計算keccak256(0xff + deployer + salt + keccak256(initCode)) の下位 20 バイト
多重制約 grinding複数のアドレス一致条件の組み合わせが検索の複雑さを増加させる
initCode hash同一のコントラクトコードは同一の hash を生成し、initCode を変更(constructor パラメータなど)することでアドレスを変更可能

Built with AiAda