Appearance
S2C3: Access Key
1. 問題
コントラクトは呼び出し元が mintFlag を呼び出すために「access key」を提供することを要求します。access key は特定の計算によって生成されます。
2. 原因
コントラクトの access key 検証ロジックには脆弱性があります — key の計算は予測可能なオンチェーンデータ(block.timestamp、blockhash など)に依存しており、これらの値はトランザクション実行時に既知です。
3. 解法
攻撃コントラクトをデプロイし、コンストラクタ内で access key を計算してすぐに mintFlag を呼び出します。コンストラクタ内の計算と呼び出しは同一トランザクション内で行われるため、すべてのオンチェーン状態が一致します。
4. 遭遇した落とし穴
タイミング依存性: key は block.timestamp などに依存する可能性があり、同じトランザクション内で計算して使用する必要があります。
5. 落とし穴の原因
コントラクトの key 生成は現在のブロックの特定の属性に依存します。2つのトランザクションに分けると、ブロック属性が変わり key が一致しなくなる可能性があります。
6. 解決方法
単一のトランザクション内ですべての操作(デプロイ + key の計算 + mintFlag の呼び出し)を完了し、すべてのオンチェーン状態の一貫性を確保します。
7. 技術的ポイント
| ポイント | 説明 |
|---|---|
| アトミック性 | デプロイと攻撃を同一トランザクションで完了し、状態の一貫性を保証します |
| オンチェーンデータの予測可能性 | block.timestamp、blockhash などはトランザクション実行時に攻撃者が事前に知ることができます |