本文介绍了Safe Guardrail,一个用于增强Safe账户安全性的工具。Guardrail通过限制delegatecall操作,只允许预先批准的合约被调用,并对新合约的批准设置时间延迟,从而防止恶意代码的执行。它为Safe用户提供了一种简单而有效的方式来控制其钱包执行的代码,降低了潜在的安全风险。
了解 Guardrail 如何通过限制有风险的 delegate call 为你的 Safe 增加一层保护。了解这种对初学者友好的 guard 如何设置延时权限,并加强你的钱包防御恶意代码的能力。
Safe 允许用户使用多重签名规则来保护资产(例如,需要 4 个所有者中的 3 个批准交易)。这种多重签名方案确保没有单个所有者可以单方面转移资金。但是,除了收集签名之外,你还需要额外的安全检查——这就是 Safe Guards 的用武之地。
Safe Guard 就像你 Safe 账户的安全员:想象一下,你的 Safe 是一个由多个密钥(签名)保护的金库。Guard 是一个位于金库门口的智能合约,验证每笔交易是否满足某些条件 - 即使在密钥被旋转之后。如果交易未能通过 Guard 的审查,它将被阻止。这可以防止签名者可能忽略的错误或恶意行为。
💡 重要提示: 因为 Guard 可以直接阻止交易,所以有 bug 或过于严格的 Guard 可能 会将你锁定在你自己的 Safe 之外(一种自找的拒绝服务)。因此,使用经过良好审核的 Guard 代码并始终制定恢复计划(例如,如果需要,可以移除或禁用 Guard 的方法)至关重要。
Guardrail 是一个 Safe Guard 的实现,专注于一种特定类型的交易风险:臭名昭著的 DELEGATECALL
操作。简单来说,delegate call 允许你的 Safe 执行来自另一个合约的代码,就好像它是 Safe 本身的一部分一样。这有点像让一个陌生人进入你的房子并允许他们重新布置家具 - 功能强大,但如果被滥用,也可能很危险。根据设计,Safe 的模块化架构使用 delegate call 实现灵活的功能(例如:迁移、批量调用等),但如果无意中调用了恶意合约,这种灵活性可能会被滥用。
Guardrail 在 delegate call 周围设置了 guard rails(双关语)。它确保你的 Safe 仅 delegate call 预先批准的合约 allowlist,并且它对预先批准新合约施加了 时间延迟。以下是它在实践中的运作方式:
初始设置: 首次在你的 Safe 上安装 Guardrail 时,你可以指定一个受信任合约的 allowlist,你的 Safe 可以 delegate call(例如,用于批量交易的官方 Safe MultiSendCallOnly 库合约)。Guardrail 允许你在设置期间毫无延迟地添加这些初始地址。
延时添加: 如果稍后你想允许 delegate call 一个新合约,Guardrail 不会立即让你使用它。相反,你(或其他 Safe 所有者)将发起一个将新合约添加到 allowlist 的请求,并且 一个计时器开始(延迟时间是可配置的,例如 24 小时)。在此期间,新的 delegate call 目标尚未获得授权。此延迟充当安全缓冲区 - 如果请求是恶意的或无意的,则有时间在生效之前发现并取消它。只有在延迟到期后,才允许新合约进行 delegate call。
即时删除: 另一方面,从 allowlist 中删除合约(例如,如果发现以前受信任的合约存在漏洞)可以立即完成。Guardrail 允许立即删除 delegates 以快速响应威胁。
全面覆盖: Guardrail 旨在与最新的 Safe 合约(v1.5.0 及更高版本)配合使用,并涵盖常规的多重签名交易和通过 Safe 模块执行的交易。(模块是可以启动 Safe 交易而无需直接所有者签名的插件——Guardrail 也涵盖了这些,确保模块也不能使用未经授权的 DELEGATECALL
操作。)
总而言之,Guardrail 的目的 是提供一个对初学者友好的 Safe Guard 示例,以一种直接的方式解决实际的安全问题(不安全的 delegate call)。通过使用 allowlist 和时间延迟,它可以让 Safe 所有者更好地控制他们的钱包将执行哪些代码。这大大降低了某些漏洞利用的风险,例如恶意模块或受损的库,同时仍保持了合法用例的灵活性。这是进入 Safe Guards 世界的第一步,展示了添加可编程规则如何使你的多重签名钱包更加安全。
对于大多数日常 Safe 用户来说,多重签名批准可能就足够了。但请考虑 DAO 或 treasury 钱包等使用复杂交易的情况(批量操作、升级、与许多协议的交互)。被黑客入侵的 dapp 界面或巧妙的网络钓鱼企图可能会诱骗所有所有者批准一项危险的交易,该交易通过 DELEGATECALL
操作调用攻击者的合约。Guardrail 会抓住这一点——“等等,此合约不在批准列表中!”——并阻止它。而且因为 Guardrail 为新的批准引入了时间延迟,即使攻击者试图匆忙完成某些事情,他们也必须等待延迟,在此期间,警惕的所有者(或任何可用的监控服务)可以进行干预。
另一方面,Guardrail 对于试验 Safe Guards 的开发人员来说,安装起来足够简单。此外,它的简单性使其成为任何用户 Safe 的一个风险非常低的补充,因为它与当前的 Safe{Wallet} 界面兼容,并且没有破坏任何通常的交易流程。该项目的代码附带了一个示例 Safe App 界面(一个 React dapp),用于管理 allowlist,甚至还附带了形式化验证规范(使用 Certora)来证明 guard 行为的属性。虽然你不会在没有专业审计的情况下将 Guardrail 部署在关键任务的 1 亿美元 treasury 上,但这是在测试环境中学习 Safe Guards 基础知识的好方法。将其视为 Safe 的“Guard 101”:它演示了 guard 可以做什么、如何将其附加到你的 Safe 以及拥有可编程交易策略的好处。
Guardrail 的 Safe App:https://www.safe.dev/guardrail/(在 Safe{Wallet} 中添加为自定义 Safe App)
使用 Guardrail 通常涉及以下步骤:
(1) 将 Guardrail 合约部署 到你想要的网络(它是用 Solidity 编写的,可以通过 Foundry 或 Hardhat 等常用工具进行部署)。为了使用 Safe App 进行测试,还提供了一个 AppGuardrail
变体,用于演示目的。默认情况下已部署在 Sepolia 和 Gnosis Scan 中。
(2) 在你的 Safe 上启用 Guardrail - 这意味着使用 Guardrail 的地址调用 Safe 的 setGuard
函数。设置完成后,你的 Safe 执行的每笔交易都将首先通过 Guardrail 的检查。
(3) 配置允许列表 - 最初,你将已知的安全合约(如 Safe 自己的 MultiSendCallOnly
库,当你使用 Safe App 启用 Guard 时,默认会添加该库)添加到 Guardrail 的允许列表。如果你忘记了一个,请不要担心:如果交易尝试使用 delegate call 调用列表上没有的地址,Guardrail 将拒绝它并显示错误。然后,你可以通过 Safe 交易添加该地址(如果它是合法的),等待所需的延迟,然后重试。
(4) 照常操作 - 当所有签名者批准涉及 delegate call 的 Safe 交易时,Guardrail 将自动强制执行这些规则。允许的 delegate call 会通过;不允许的 delegate call 会被阻止。如果有人尝试添加新的 delegate call 目标,则该 Safe 交易将_仅在计划_添加时才会成功(启动计时器)。
通过引入 Guardrail 作为我们的第一个例子,我们为更高级的 guards 奠定了基础。它解决了一个狭隘的方面(delegate call),但做得很好,说明了链上执行的强大功能。在下一部分中,我们将扩展这个想法,并看看 Fiducia,一个具有更广泛控制范围的 guard(包括特定的地址、函数,甚至一个名为 cosigners 的令人兴奋的概念)。Guardrail 教会了我们的 Safe 一些基本的自卫;接下来,我们将教它一些高级武术,以实现黑带安全控制!
Safe Research 是 Safe 的应用研发部门,致力于推进自托管堆栈。我们的工作以 安全、抗审查 和 隐私 的密码朋克原则为基础,我们专注于为智能账户和钱包构建无需信任、以用户为中心的基础设施。
让我们一次提交一个,将以太坊最初的密码朋克愿景变为现实。
- 原文链接: safe.global/blog/safe-re...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!