第4章:资源管理
引言
在区块链智能合约中,资源管理是确保系统安全的关键。Sui Move 使用对象(如代币、共享状态)来管理资源,通过 has key、Coin 和 share_object 提供强大的控制能力。然而,错误的资源管理可能导致漏洞,如代币重复使用。本章将介绍 Sui Move 的资源管理,以 VoteChain 投票系统为例,探讨未正确销毁投票代币的漏洞,学习如何利用和修复此类问题。
通过本章,你将:
- 了解 Sui Move 的对象和代币管理。
- 掌握资源管理漏洞,如未销毁代币导致重复投票。
- 学会在 CTF 中发现和修复资源管理问题。
我们将分析 chapter_4::vote 中的重复投票漏洞,实践操纵投票结果,并在任务中修复代币管理。
1. Sui Move 的资源管理
1.1 对象与代币
Sui Move 的资源以对象形式存储,具备唯一标识(UID):
- 对象类型:需 has key(唯一性)和 has store(可存储)。
- 所有权:通过 public_transfer 转移,share_object 公开共享。
- 代币:Coin
表示代币,需销毁(coin::burn)或分割(coin::split)以防止重复使用。
在 VoteChain 中:
- Coin
是投票代币,代表投票权。 - VoteStore 是共享对象,存储提案票数。
1.2 资源管理漏洞
常见的资源管理漏洞包括:
- 未销毁代币:投票后未销毁 Coin
,允许重复使用。 - 错误转移:对象转移到错误地址,丢失控制。
- 共享对象滥用:未限制 share_object 的访问(第5章讨论)。
这些漏洞可能导致投票操纵或资源滥用。
1.3 漏洞案例
在 VoteChain 的 chapter_4::vote 中:
- vote 函数记录投票者,但未销毁或分割 Coin
。 - 攻击者可多次调用 vote,用同一代币增加票数,操纵提案结果。
- 危害:投票系统公平性丧失。
2. 防御资源管理漏洞
2.1 销毁或分割代币
- 在 vote 中销毁 Coin
(coin::burn)或分割已用部分(coin::split)。 - 示例:coin::burn(vote_coin);
2.2 验证状态
- 检查代币是否有效(如 vote_coin.value() > 0)。
- 记录投票状态(如 voters 列表),防止重复投票。
2.3 最小化共享对象
- 减少 share_object 的敏感数据,仅存储必要信息(如票数)。
- 使用用户拥有的对象(如代币)管理权限。