
Garden Move HTLC 安全评估:Zellic
技术
TL;DR,Zellic 审查了 Garden 部署在 Sui 上的基于 Move 的 HTLC 合约,重点关注状态转换的正确性、转账完整性、订单唯一性以及提前退款的真实性。共识别出两项发现,一项 Medium、一项 Informational,两项均已在代码中解决。
简介
Garden 委托 Zellic 对部署在 Sui 上的基于 Move的 HTLC 实现进行安全评估。本次审查由 Sunwoo Hwang 与 Varun Verma 于 2025 年 5 月进行,报告于 2025 年 6 月交付。
本次评估涵盖 htlc-sui 仓库 中的 sources/main.move;这是使用 Move 语言在 Sui 上实现 Garden 原子兑换逻辑的唯一模块。Zellic 通过人工与自动化工具两种方式审查了该合约,覆盖编码错误、业务逻辑错误、集成风险以及代码成熟度。
Zellic 的总体结论是核心兑换逻辑是可靠的:余额仅在正确的状态转换下发生变动,且所有代币流向均硬编码到 initiator 或 redeemer 地址,不存在其他接收方路径。
范围
本次评估涵盖:
- sources/main.move:该 Move 模块在 Sui 上实现基于 HTLC 的原子兑换,包括订单发起、赎回、标准退款,以及带 Ed25519 签名验证的即时退款
Zellic 将评估目标归结为四个具体的安全问题:资金是否仅在正确的状态转换下发生转移;是否强制执行转账完整性,即所有代币流向均硬编码到 initiator 或 redeemer 地址;是否强制执行订单唯一性以防止重复或重放的订单;以及提前退款是否需要来自合法 redeemer 的有效 Ed25519 签名。
审计发现
Zellic 共识别出两项发现。一项 Medium 严重等级,一项 Informational。未发现 Critical、High 或 Low 严重等级的问题。
发现 3.1;通过抢先交易确定性 order_id 实施的重复订单拒绝服务 | Medium
order_id 由 sha256(secret_hash || initiator || redeemer || timelock) 计算得出。这四项输入在待处理交易的 calldata 中对任何内存池监听者都是可见的。此外,initiate_on_behalf 函数允许任何地址提交这四个相同的值,而无需证明其拥有 initiator 地址。
攻击者可以从受害者待处理的兑换交易中复制这四个字段,并以完全相同的字段集合和 amount = 1 提交 initiate_on_behalf。如果攻击者的交易先被确认,注册表就会在该 order_id 下存入一笔粉尘订单,导致受害者随后的交易以 EDuplicateOrder 中止。
实际攻击面出现在高波动窗口:攻击者监控内存池中执行套利的 HTLCs,可以用极低的成本,即 1 单位的粉尘存款,阻断竞争者的兑换,并自行攫取该套利机会。可能性与影响均被评为 Medium。
发现 3.2;无上限的时间锁可能导致意外的永久锁定 | Informational
合约正确地将过期条件强制为 initiated_at + timelock < now,但时间锁本身没有最大值。用户可能会意外传入一个极大的数值,例如 u256::MAX。这属于用户体验与安全方面的风险,而非可利用的漏洞;由于用户锁定的是自己的资金,因此不存在攻击者角度。
处理
两项发现均已由 Garden 确认并在代码中解决。
- 发现 3.1 已在提交 e85e06c9 中修复,做法是将 amount 值引入 order_id 原像的生成过程,以阻止粉尘金额发起,从而使抢先交易不可行。
- 发现 3.2 已在提交 4b9c871f 中修复,做法是在 safe_params 中对时间锁施加最大上限,将其限制在合理的上限值,以防止意外的永久锁定。
总结
两项发现:一项 Medium,一项 Informational,两项均已在代码中解决。不存在 Critical、High 或 Low 严重等级的问题。Zellic 的结项评估确认,核心兑换逻辑清晰无误,且合约的基础安全属性,即正确的状态转换、转账完整性、订单唯一性以及经过认证的提前退款,均已验证为可靠。
Garden 将安全视为一项持续进行的工作,并开展开放的竞赛式漏洞赏金活动,例如近期的 Code4rena 审计,该活动针对 EVM、Solana、Sui 和 Starknet 上的 HTLC 架构,在 813 份提交中提供了 $37,500 的奖励。所有审计的信息可在 https://garden.finance/zh/security 查看。
Last updated