
Garden 协议安全评估:Trail of Bits
技术
TL;DR,Trail of Bits 在为期两周的项目中审计了 Garden 的 GardenStaker、HTLC 和 FEEAccount 合约。共识别出九项审计发现,严重等级涵盖 High、Medium、Low 和 Informational;无 Critical 问题。其中六项直接在代码中解决;三项通过协议层面的运营调整处理。
Garden 委托 Trail of Bits 对协议的链上合约进行安全评估,这些合约实现了通过 HTLCs 进行的 BTC 跨链兑换、向 fillers 分配手续费,以及支撑 solver 参与的质押与委托机制。本次审查由 Richie Humphrey 和 Vara Prasad Bandaru 执行,Josselin Feist 担任工程总监,历时两个工程师周。随后进行了修复复审,总结报告于 2024 年 4 月交付。
Trail of Bits 指出,代码本身质量很高,设计中对安全有明确的考量。本次审查的主要难点不在于单独理解每份合约,而在于理解它们如何与更大的系统交互,尤其是订单簿、手续费签名与 filler 选择之间的协调逻辑——正是这套逻辑决定了链上合约的实际使用方式。
审计范围
本次审计范围包含三份链上合约:
- GardenStaker: 管理 filler 注册、委托人质押、投票权和质押生命周期
- GardenHTLC: 实现用于兑换发起、赎回和退款的 HTLC 机制
- FEEAccount: 处理 fee manager、fillers 与委托人之间的手续费支付通道(此前称为 GardenFEEAccount)
Trail of Bits 使用 Slither 进行静态分析,并使用 Echidna 对 GardenStaker 进行有状态不变量模糊测试。共测试了两项属性且均已通过:staker 合约的 SEED 代币余额等于所有质押的净额之和,以及所有 fillers 独占持有 filler 角色。
审计发现
Trail of Bits 共识别出九项审计发现。严重等级分布为:三项 High、三项 Medium、两项 Low、一项 Informational。未发现 Critical 等级的问题。
TOB-CATALOG-1; Filler 流动性易受 DoS 攻击 | High
由于退款订单没有任何惩罚,攻击者可以发起并无意完成的兑换订单,在 HTLC 时间锁的整个期间锁住 filler 流动性,并在到期后调用 refund。若大规模重复,这会耗尽可用的 filler 容量,实际上使兑换系统瘫痪。
利用难度评为 High,因为攻击者必须把自己的资金锁定 filler 时间锁时长的两倍,使攻击的资金成本很高。Trail of Bits 提出了几个缓解方向:要求发起方缴纳押金并在成功赎回后退还、收取发起手续费,或要求发起方质押 SEED。
TOB-CATALOG-2; 任何人都可以让 FeeAccount 模板自毁 | High
GardenFEEAccountFactory 的构造函数部署了一个 GardenFEEAccount(现称 FEEAccount)模板合约,却没有对其初始化,也没有禁用其 initializers。由于 FEEAccount.close 和 .settle 都会调用 closeChannel,而后者会触发 selfdestruct,攻击者可以用自己的地址初始化该模板并对其调用 close,从而销毁模板。由于克隆合约通过 delegate-call 调用模板,所有后续对活跃手续费通道的调用都会变成空操作,已存入的代币将永久丢失。
TOB-CATALOG-3; 手续费可在发起订单之前被提取 | Medium
fee manager 会在兑换订单于链上发起之前,使用创建者提供的 secretHash 为委托人预先签署领取消息。恶意委托人若能拿到这条预签名消息并知道 secret,就可以在相应兑换从未发起的情况下领取手续费。这是协议流程的顺序问题:漏洞在于系统如何相对于链上发起来排布其签名操作的先后次序。
TOB-CATALOG-4; 创建者可以在不赎回订单的情况下领取手续费 | Medium
手续费支付 HTLCs 与兑换 HTLCs 共用相同的时间锁时长(48 小时)和相同的 secret。由于 secret 只有创建者知道,他们可以等到兑换 HTLC 到期,调用 refund 取回自己锁定的代币,然后再用 secret 领取一笔自己从未完成的订单的委托人手续费。Garden 在审查期间独立发现了这一问题。
TOB-CATALOG-5; 委托人可以按更高的投票倍数延长质押 | Low
DelegateManager 中的 extend 函数在延长至更长期限时会正确提升委托人的投票倍数,但在延长至更短期限时不会下调。原本质押四年的委托人,可以在锁定期临近结束时延长六个月,并无限期保留四年期的倍数。
Garden 确认这是有意为之:协议的设计目标是奖励长期质押者,对已完成的锁定期保留倍数符合这一目标。Garden 补充了文档以澄清预期行为。
TOB-CATALOG-6; 术语 "expiry" 使用不一致 | Informational
expiry 一词在 GardenStaker 中表示绝对区块高度,而在 GardenHTLC 中表示相对时长(区块数)。NatSpec 注释和 README 在整个代码库中都错误地把 expiry 描述为区块高度,进一步加剧了混淆。这种语义上的不一致带来了可维护性风险:开发者在两份合约之间推理 expiry 时可能引入错误行为。
TOB-CATALOG-7; delegateStakeIDs 处理不当会导致关键功能失效 | High
当 filler 注销并调用 refund 时,Filler 结构体会用 Solidity 的 delete 从 fillers 映射中删除。然而 delegateStakeIDs 字段是 OpenZeppelin 的 EnumerableSet,其内部同时使用数组和映射。Solidity 的 delete 会把数组长度置零,却不会清除映射中的索引条目。当后续调用试图从该集合中移除条目时,它们会从陈旧的映射中读到非零的 valueIndex,却遇到长度为零的数组,从而触发 panic revert。
实际后果是:任何委托人,只要其 filler 注销并调用了 refund,就会永久失去对自己质押调用 changeVote 或 refund 的能力。即便该 filler 重新注册,已有的质押关联也不会恢复——这些质押将被永久锁定。该问题是通过 Slither 发现的。
TOB-CATALOG-8; 用户无法按最长期限续期质押 | Low
renew 函数把新的 expiry 计算为 block.number + newLockBlocks。当用户传入 uint256 的最大值以表示无限期质押时,这一加法会溢出并导致交易回滚。质押已到期的用户无法按最长期限续期。
TOB-CATALOG-9; 通道内某些 HTLCs 先于其他到期时委托人会损失奖励 | Medium
GardenFEEAccount 中的 claim 函数会遍历一个 HTLCs 数组,并静默排除所有已到期的条目,既不回滚也不记录缺口。在一个存在多个活跃 HTLCs 的支付通道中,如果因兑换完成延迟而导致其中一个在委托人领取之前到期,相关奖励将无法挽回地损失。利用难度评为 High,因为触发该条件需要跨多笔兑换的特定时序事件序列。
措施
九项审计发现中有六项已在代码中解决。三项通过协议层面的运营调整处理。
代码层面已解决:
- TOB-CATALOG-2 的修复方式是在 GardenFEEAccount 实现中新增一个调用 _disableInitializers 的 initialize 函数,阻止今后对模板合约进行任何初始化。
- TOB-CATALOG-5 被确认为有意的设计决策,并通过补充文档澄清预期的倍数保留行为予以解决。
- TOB-CATALOG-6 通过重命名变量解决;expiry 现在在两份合约中一致地表示绝对区块高度,timelock 表示相对时长。(截至 2026 年 4 月 23 日,订单到期由 timelock 而非 expiry 决定)
- TOB-CATALOG-7 通过修改 filler 注销逻辑解决:改为重置各个数据成员,而不是删除整个结构体,从而保留 delegateStakeIDs 不变。这让现有委托人可以继续调用 changeVote 和 refund,并确保重新注册时会自动恢复其质押关联。
- TOB-CATALOG-8 通过在 renew 函数中增加对最长期限条件的检查解决:当选择最长锁定期时,直接把 stake.expiry 设为 type(uint).max。
- TOB-CATALOG-9 通过更新 claim 函数解决:在映射中同时存储已领取和已提交的 secret,使部分领取能够成功,而不会放弃同一通道内其他 HTLCs 的奖励。
TOB-CATALOG-1、TOB-CATALOG-3 和 TOB-CATALOG-4 通过协议层面的运营调整处理。针对 TOB-CATALOG-1,Garden 在 beta 期间实施了每个地址每 24 小时 1.5 BTC/WBTC 的速率限制,并计划在公开上线时收取不可退还的平台手续费(目前已生效)。针对 TOB-CATALOG-3,Garden 调整了手续费签名流程的顺序,使 fillers 只在用户于源链发起之后才向 FeeHub 提供签名。针对 TOB-CATALOG-4,Garden 收紧了兑换发起与手续费 HTLC 签名之间的时间约束。Trail of Bits 确认这些缓解措施已有描述且可行。
总结
九项审计发现,分别为三项 High、三项 Medium、两项 Low 和一项 Informational。无 Critical 问题。所有问题均已解决。
自本次评估以来,Garden 已与 Zellic 完成了一次 Move 应用安全评估(2025 年 6 月),并通过 Code4rena 举办了一场竞赛式漏洞赏金活动,共有 813 份提交、$37,500 奖励,目标是 EVM、Solana、Sui 和 Starknet 上的 HTLC 架构。
Last updated