Appearance
S2C3: Access Key
1. 问题
合约要求调用者提供一个"access key"才能调用 mintFlag。access key 由特定计算生成。
2. 原因
合约的 access key 验证逻辑存在漏洞 — key 的计算依赖于可预测的链上数据(如 block.timestamp, blockhash 等),这些值在交易执行时是已知的。
3. 方案
部署一个攻击合约,在构造函数中计算 access key 并立即调用 mintFlag。由于构造函数中的计算和使用在同一交易中,所有链上状态一致。
4. 遇到的陷阱
时序依赖: key 可能依赖 block.timestamp 等,需要在同一交易中计算和使用。
5. 陷阱的原因
合约的 key 生成依赖当前区块的某些属性。如果分开两个交易,区块属性可能变化导致 key 不匹配。
6. 如何解决
在单个交易中完成所有操作(部署 + 计算 key + 调用 mintFlag),确保所有链上状态一致。
7. 技术要点
| 要点 | 说明 |
|---|---|
| 原子性 | 部署和攻击在同一交易中完成,保证状态一致性 |
| 链上数据可预测性 | block.timestamp, blockhash 等在交易执行时可由攻击者预知 |