关于 move-security
move-security 是面向 Sui Move 合约开发者的安全审查技能,按任务引导加载最佳实践与访问控制参考。内容涵盖升级治理、随机数、密钥和能力对象,并限定依据 Sui 官方文档。
主要功能
- 01按任务加载安全参考
- 02检查包审计与升级治理
- 03审查能力对象和访问控制
- 04涵盖随机数、预言机与密钥安全
适用场景
- 01审查 Move 包及升级策略
- 02选择能力对象或地址允许列表
- 03检查随机数与预言机数据处理
MCP 相关
可在环境提供时查询 Sui 文档 MCP 服务,以核实信息并补充参考文件未涵盖的细节。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mystenlabs/ skills --skill move-security安装后在 Claude Code 中输入/move-security确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
access-control.mdbest-practices.mdevals/evals.json详细介绍
Move 智能合约安全
**MCP 工具:**如果你的环境支持,请同时查询 Sui 文档 MCP 服务(
https://sui.mcp.kapa.ai),以获取最新答案。使用该服务进行验证,并了解这些参考文件未涵盖的细节。
**来源限制:**此技能中的所有信息均仅来源于 docs.sui.io/develop/security/best-practices。扩展或更新此技能时,只能从该来源获取信息。请勿使用第三方博客、教程或非官方文档。
此技能介绍 Sui 上 Move 智能合约的安全最佳实践,包括包审计、升级治理、访问控制模式、随机数安全、密钥管理和运维安全。它会根据任务转向相应的参考文件。
参考文件
best-practices -- 安全最佳实践
路径: best-practices.md
在以下情况下加载: 审计包、审查升级策略、验证依赖项、验证不变量、为特权操作发出事件、使用链上随机数、处理预言机数据、设计紧急控制措施、审查前端签名流程或管理密钥。
涵盖内容: 包审计和不可变性、升级治理和 UpgradeCap 保护、依赖项验证、Move 语言的保证与限制、不变量和关系验证、为特权操作发出事件、链上随机数安全(随机数生成后的限制、私有入口、RandomGenerator、Gas 路径平衡、提交-揭示)、预言机和链下数据验证、紧急控制措施(暂停、速率限制)、前端交易签名安全、包 ID 验证、密钥管理(私钥保护、特权密钥托管、角色分离、恢复和轮换)。
access-control -- 访问控制模式
路径: access-control.md
在以下情况下加载: 在能力对象和地址允许列表之间进行选择、设计管理员能力、实现能力撤销、验证能力对象关系、授权共享对象访问,或审查 tx_context::sender() 的使用。
涵盖内容: 能力对象与地址允许列表的比较、地址允许列表管理、仅依赖 tx_context::sender() 的陷阱、显式能力要求和参数位置、管理员能力保护和托管、能力撤销机制(注册表、版本控制、销毁)、能力对象关系验证、共享对象授权。
路由指南
| 任务 | 加载 |
|---|---|
| 审查合约是否存在安全问题 | best-practices + access-control |
| 审计包身份或升级策略 | best-practices |
| 在链上验证依赖项 | best-practices |
| 验证不变量和对象关系 | best-practices |
| 为特权操作添加事件发出 | best-practices |
| 安全地使用链上随机数 | best-practices |
| 处理预言机或链下数据 | best-practices |
| 设计紧急暂停或速率限制 | best-practices |
| 审查前端签名流程 | best-practices |
| 管理部署、管理员和运维密钥 | best-practices |
| 在能力对象和允许列表之间进行选择 | access-control |
| 设计管理员能力保护 | access-control |
| 实现能力撤销 | access-control |
| 授权访问共享对象 | access-control |
审查 tx_context::sender() 的用法 | access-control |
| 对 Move 包进行全面安全审计 | best-practices + access-control |
规则
- Sui 包在发布后不可变。升级包时,会发布一个具有新地址的新包。请直接在链上验证包 ID,不要依赖名称或前端常量。
- 将
UpgradeCap与管理员能力同等严格地管理,因为持有者可以修改包的行为。 - 将消耗随机数的函数仅标记为私有
entry函数。Move 编译器会对接收Random或RandomGenerator的public函数发出警告。 - 绝不将
RandomGenerator作为public函数参数。将其传递给public(package)或私有函数,可用于测试和包内逻辑。 - 对所有特权操作发出事件:管理员变更、许可名单更新、铸造/销毁操作、拒绝名单操作、配置变更、预言机更新、紧急暂停。
- 所有特权函数都必须将相关能力作为参数。不要仅依赖
tx_context::sender()进行授权。 - 任何人都可以提交引用共享对象的交易。绝不要假设共享对象的访问受到限制。
- 在发布包之前设计好能力撤销机制。否则,泄露的能力在该包的整个生命周期内都会保持有效。
常见错误
- 信任包名称,而不是链上 ID。 Move 包名称(
Move.toml中的name字段)是由开发者任意指定的字符串,不具唯一性。务必验证链上确切的包 ID(对象地址)。 - 将
tx_context::sender()作为唯一的授权检查。 这会将函数绑定到单个签名者,并破坏可组合性。其他合约无法代替用户调用该函数。 - 忘记共享对象可供任何人访问。 每个触及共享状态的特权函数都必须在内部验证授权。
- 将
RandomGenerator作为public函数参数。 这会允许调用者操纵生成器。应在入口函数中通过r.new_generator(ctx)创建生成器,并仅将其传递给public(package)或私有辅助函数。 - 发布前未规划能力撤销机制。 发布后,包不可变。没有撤销机制的泄露能力会永久有效。
- 将管理员能力存放在单个热钱包中。 对特权密钥使用多重签名地址、硬件钱包或专门的托管服务。