Garden Finance 竞赛式审计:Code4rena

Garden Finance 竞赛式审计:Code4rena

技术

// 技术
TL;DR,Code4rena 于 2025 年 12 月对 Garden 在 EVM、Solana、Starknet 和 Move 上的跨链 HTLC 合约进行了一次竞赛式审计。813 名独立安全研究员提交了发现。识别出一项 Medium 严重等级的漏洞,即 UDA.sol 中未检查的 approve() 返回值;该漏洞已使用 SafeERC20 修复。未发现 High 或 Critical 级别的问题。

Garden 通过 Code4rena 开展了一次竞赛式安全审计,覆盖范围是 Garden 迄今为止所有安全审查中最广的;涉及用四种语言编写、部署在四条链上的 15 份智能合约。与传统的审计公司委托不同,Code4rena 的模式向大量独立安全研究员开放代码库,由他们以竞赛方式提交发现,奖励依据严重等级和有效性发放。在为期两周的时间内共收到 813 份提交,奖励总额为 $37,500。

本次审计专门针对 Garden 基于 HTLC 的原子兑换架构,覆盖 EVM、Solana、Sui 和 Starknet,即 Garden 当时受支持的全部链。受审代码库包含 Cairo、Move、Rust 和 Solidity 共 2,163 行代码。

审计范围

审计于 2025 年 11 月 24 日至 12 月 8 日进行,评估对象为 C4 Garden Finance 仓库的 commit cf7c5b09b7156d6806cc1e68dd924c1b01a5236d,报告于 2026 年 2 月 12 日发布。共有十五份智能合约纳入审计范围,涉及四种语言和平台:

  • Solidity / EVM:包括 UDA.sol、NativeHTLC.sol、ArbNativeHTLC.sol 以及相关的 EVM 兑换合约
  • Rust / Solana:solana-native-swaps 和 solana-spl-swaps 程序,实现原生 SOL 和 SPL 代币的 HTLC 兑换
  • Cairo / Starknet:htlc.cairo,在 Starknet 上实现 HTLC 逻辑
  • Move / Sui:基于 Move 的 HTLC 模块

Garden 设定的评估目标涵盖状态转换正确性、转账完整性、订单唯一性和退款真实性,与 Zellic Move 审计中采用的安全问题一致,如今同时扩展到所有受支持的链。

审计发现

本次审计产生了一项唯一的漏洞。未识别出任何 High 严重等级的问题。

M-01;UDA.sol 中未检查的 approve() 返回值导致资金永久损失 | Medium

UniqueDepositAddress.initialize() 函数调用 ERC20.approve() 时未检查其返回值:

  HTLC(_addressHTLC).token().approve(_addressHTLC, amount);

包括 USDT 和 BNB 在内的非标准 ERC20 代币在授权失败时返回 false,而不是回滚。由于返回值被忽略,即使授权失败,执行仍会继续。结果是:合约将自身标记为 initialized,代币 allowance 仍为零,initiateOnBehalf() 得以执行,但 HTLC 无法转移代币。存入的资金将被永久锁定且没有恢复途径,因为 initialized 会阻止重新初始化。

该合约已经导入 SafeERC20 并在 recover() 函数中使用,修复方法是同样一致地将其应用到 approve() 调用上。

这项发现由十名不同的研究员各自独立识别并提交。

缺少 redeemer != refundee 校验导致同方订单和即时自退款 | Low

两个 Solana HTLC 实现 solana-native-swaps 和 solana-spl-swaps 中的 initiate 指令并未强制要求 redeemer 和 refundee 为不同地址。当两者被设置为同一地址时,无需泄露秘密值也无需等待时间锁到期即可立即调用 instant_refund,因为即时退款的唯一条件是 redeemer 的同意,而同一地址同时控制着这两个角色。这破坏了 HTLC 的基本不变量:交易对手凭秘密值赎回,只有发起方才能在到期后退款。

全项目范围的拼写和标识符错误 | Informational

EVM、Cairo 和 Starknet 代码库中均发现了拼写错误。从集成角度看最重要的是:Solidity 合约中的自定义错误标识符 NativeHTLC__IncorrectFundsRecieved 和 ArbNativeHTLC__IncorrectFundsRecieved 拼错了 "Received." 由于自定义错误选择器由 keccak256(ErrorSignature) 派生,重命名会改变链上选择器,任何引用旧选择器的外部工具或解码器都会在更新后失效。此外还在 Cairo 变量名(intiate 而非 initiate)以及整个 Starknet 测试套件(INTIATE_TYPE 而非 INITIATE_TYPE)中发现了拼写错误。

处理措施

UDA.sol 中的 Medium 级别发现已通过将未检查的 approve() 调用替换为合约中已导入的 SafeERC20 库的 safeApprove() 得到修复,使 initialize() 函数与已经正确使用 SafeERC20 的 recover() 函数保持一致。

Solana 程序中的 Low 级别发现已通过在 solana-native-swaps 和 solana-spl-swaps 的两个 initiate 函数中添加 require!(redeemer != refundee) 校验来解决。

标识符拼写错误已在 EVM、Cairo 和 Starknet 代码库中修正:错误名称更新为正确的 "Received" 拼写,Cairo 变量名更正为 initiate,Starknet 测试套件全部更新为 INITIATE_TYPE。

总结

813 名独立研究员。15 份合约,四种语言,四条链。一项 Medium 级别发现,零 High 或 Critical 级别问题。Medium 已使用代码库中原有的库修复。Low 和 Informational 级别的发现也已处理。

Code4rena 审计是 Garden 安全计划中的第四次、也是覆盖最广的一次安全审查,此前的评估包括 OtterSec(2023 年 8 月)、Trail of Bits(2024 年 4 月)和 Zellic(2025 年 6 月)。

查看 Code4rena 完整报告 →

Last updated

Related Blogs