第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 的敏感数据,仅存储必要信息(如票数)。
  • 使用用户拥有的对象(如代币)管理权限。