逻辑漏洞与状态管理
引言
逻辑漏洞源于智能合约的状态管理不当,可能导致意外行为,如重复投票。Sui Move 使用 share_object
和 VecMap
管理状态,但错误的状态更新或检查可能破坏系统。本章介绍 Sui Move 的状态管理机制,以 VoteChain 投票系统为例,分析未正确管理投票状态的逻辑漏洞,学习如何利用和修复此类问题。
通过本章,你将:
- 了解 Sui Move 的状态管理(如
VecMap
和ObjectTable
)。 - 掌握逻辑漏洞,如重复投票。
- 学会在 CTF 中发现和修复状态管理问题。
我们将分析 chapter_6::vote
中的重复投票漏洞,实践操纵投票结果,并在任务中修复状态逻辑。
1. Sui Move 的状态管理
1.1 状态管理机制
Sui Move 通过对象和集合管理状态:
share_object
:存储共享状态,如VoteStore
。ObjectTable
和VecMap
:管理提案和投票记录。TxContext
:提供交易上下文,确保状态一致性。
1.2 逻辑漏洞的来源
常见逻辑漏洞包括:
- 未检查状态:如允许关闭的提案继续投票。
- 错误更新状态:如重复累加投票记录。
- 状态重置错误:如投票记录未正确清理。
这些漏洞可能导致投票操纵或系统失效。
1.3 VoteChain 的重复投票漏洞
在 chapter_6::vote
中:
vote
未检查proposal.closed
,允许关闭后投票。voters
记录错误累加投票金额,未防止重复投票。- 危害:攻击者可反复投票,操纵提案结果。
2. 防御逻辑漏洞
2.1 验证状态一致性
- 检查关键状态(如
proposal.closed
)防止非法操作。 - 示例:assert!(!proposal.closed, E_PROPOSAL_CLOSED);
2.2 正确更新状态
- 使用
VecMap
或VecSet
精确记录投票状态。 - 示例:assert!(!vec_map::contains(&store.voters, &sender),E_ALREADY_VOTE);防止重复投票。
2.3 最小化状态暴露
- 减少公开状态(如
share_object
的敏感数据)。 - 定期清理无用状态(如关闭提案)。
3. CTF 中的逻辑漏洞
3.1 CTF 中的逻辑漏洞
逻辑漏洞在 CTF 中常见:
- 重复操作:如重复投票或提取资产。
- 状态绕过:如在非法状态下执行操作。
在 VoteChain,攻击者可通过重复投票操纵结果。
3.2 利用与修复逻辑漏洞
在 实践(practice.md
),你将:
- 利用
vote
漏洞,在提案关闭后重复投票。 - 分析漏洞危害,理解状态管理。