Skip to content
On this page

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 等在交易执行时可由攻击者预知

Built with AiAda