Puffer协议:访问控制机制为何重要以及如何提高其安全性

我们审查了 Puffer 协议中访问控制机制的整体架构及其当前配置。

Puffer协议:访问控制机制为何重要以及如何提高其安全性

“Puffer 是一个构建在 Eigenlayer 之上的去中心化原生流动性再质押协议 (nLRP)”。它在短短几天内吸引了超过 6 亿美元的 TVL(总锁仓价值)。访问控制是防止协议上恶意操作的重要安全考量。

在这篇博客中,我们回顾了访问控制机制的整个架构及其在 Puffer 协议中的当前配置。这有助于社区更好地了解该协议。请注意,分析结果基于以太坊的当前状态(区块 19177155,2024 年 2 月 7 日,下午 03:17:35 +UTC)。

合约地址

下表列出了本博客中使用的智能合约。

地址 实现
PufferDepositor 0x4aa799c5dfc01ee7d79 0e3bf1a7c2257ce1dceff 0x7276925e42f9c4054af a2fad80fa79520c453d6a
PufferVault 0xD9A442856C234a39a81 a089C06451EBAa4306a72 0x39ca0a6438b6050ea2a c909ba65920c7451305c1
AccessManager 0x8c1686069474410E624 3425f4a10177a94EBEE11 -
TimeLock 0x3c28b7c7ba1a1f55c9c e66b263b33b204f2126ea -
Operation SafeWallet 0xC0896ab1A8cae8c2C1d 27d011eb955Cca955580d 0xd9db270c1b5e3bd161e 8c8503c55ceabee709552
Community SafeWallet 0x446d4d6b26815f9bA78 B5D454E303315D586Cb2a 0xd9db270c1b5e3bd161e 8c8503c55ceabee709552
Pausing SafeWallet 0x1ba8e3aA853F73ae809 3E26B7B8F2520c3620Df4 0xd9db270c1b5e3bd161e 8c8503c55ceabee709552

架构

整个协议主要包括两个与用户资产相关的智能合约。第一个是 PufferDepositor,第二个是 PufferVault

图 1:PufferDepositor 和 PufferVault 之间的主要关系

PufferDepositor 的主要功能是接受用户的资产,然后将它们存入 PufferVault。如果用户的存款资产不是 stETH,协议会自动执行兑换到 DEX。

PufferVault 是持有用户资产的主要合约。它也是存入 EigenLayer 的入口点。整个协议的主要访问控制在此智能合约中实现。

访问控制机制

整个访问控制是通过利用 OpenZeppelin 的 AccessManager 模块 来实现的。AccessManager 智能合约管理 PufferDepositorPufferVault 合约的权限。

AccessManager 定义了不同的角色(Roles),其中包含不同的地址。每个角色都可以被分配来调用 AccessManaged 合约(即 PufferDepositor 和 PufferVault)中的不同函数。AccessManager 支持对特定函数的延迟执行。因此,在向地址授予角色时,可以指定来自该地址在该角色下的操作是立即执行还是延迟执行。

当前访问控制配置

尽管如此,访问控制的有效性取决于其配置。我们观察到大量情况表明,ACL(访问控制列表)规则配置错误导致了安全漏洞。

为此,我们审查了 Puffer 协议的当前配置,并在下面展示了结果。请注意,这些结果仅反映截至区块 19177155(2024 年 2 月 7 日,下午 03:17:35 +UTC)的状态。

角色

下表概述了系统中的当前角色及其关联的地址。

角色 ID 拥有此角色的地址 延迟执行 备注
0 TimeLock 0x3c28b7c7ba1a1f55c9ce66b263b33b204f2126ea ADMIN 角色
1 Operation SafeWallet 0xc0896ab1a8cae8c2c1d27d011eb955cca955580d 是,延迟 604800 秒(7 天) 升级目标合约(PufferDepositor 和 PufferVault)
1 Community SafeWallet 0x446d4d6b26815f9ba78b5d454e303315d586cb2a 升级目标合约(PufferDepositor 和 PufferVault)
22 Operation SafeWallet 0xc0896ab1a8cae8c2c1d27d011eb955cca955580d 将资产存入 EigenLayer 并发起 EigenLayer 提款请求

执行 PufferVault 合约中的函数有不同的执行路径。一条路径涉及 TimeLock 合约(具有 ADMIN 角色 – 如图中路径 1 所示),另一条路径允许直接调用 Vault 中的函数,并将角色分配给调用者。在这两种情况下,调用都必须通过 AccessManager。

图 2:执行 PufferVault 合约中函数的不同执行路径

类型 I:来自 TimeLock 合约的调用

请注意,当从 TimeLock 合约调用函数时,分配的角色是 ADMIN。之所以如此指定,是因为从 Vault 的角度来看,调用者是 TimeLock 合约,该合约拥有 ADMIN 角色。因此,TimeLock 合约包含额外的延迟执行机制。

  • Operation SafeWallet:此组件可以在延迟 604,800 秒(约 7 天)后调用目标合约中的函数。
  • Community SafeWallet:此组件能够立即调用目标合约中的函数。它也有权取消 Operation SafeWallet 提交的队列中任何待处理的执行。
  • Pausing SafeWallet:此组件仅限于暂停目标合约,无权执行其他任何函数。

类型 II:直接调用 Vault 合约

接下来的方法涉及直接调用 Vault 合约中的函数。需要注意的是,AccessManager 决定了与每个角色关联的地址可以调用哪些函数。

角色 ID 目标合约 目标函数
1 PufferVault upgradeToAndCall(address,bytes)

0x4f1ef286

22 PufferVault depositToEigenLayer (0x008e0590)

initiateETHWithdrawalsFromLido (0x593961de)

initiateStETHWithdrawalFromEigenLayer (0x402064a7)

Operation SafeWallet 和 Community SafeWallet 都可以直接调用 upgradeToAndCall 函数来升级目标合约。关键区别在于时机:Community SafeWallet 无延迟地执行此操作,而 Operation SafeWallet 则受延迟限制。

此外,Operation SafeWallet 能够立即执行将资产转入 EigenLayer 和发起提款请求的函数。

更新于 [2024 年 2 月 8 日上午 10:02:59 +UTC]

一项旨在将 Operation SafeWallet 从角色 1 中移除的操作已安排。此操作计划在区块 1707940908 之后执行,该区块对应大约 7 天的延迟。使用 BlockSec Phalcon 模拟了这些排队的交易。

图 3:BlockSec Phalcon 中排队交易的模拟

查看此 Fork 中的所有交易

更新于 [2024 年 2 月 16 日下午 8:10:23 +UTC]:

图 4:Etherscan 的结果

安全钱包配置

安全钱包的配置也会影响协议的安全性。

钱包 所有者 阈值
0xC0896ab1A8cae8c2C1d 27d011eb955Cca955580d [0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76] [0xD6475ce37d964d4816715FdafFEeAAf2958948bE] [0xD70aa9d7280E6FEe89B86f53c0B2A363478D5e94] [0xa5F84b556d5FD8959165Eff0324DCFEa164fA089] [0xf061f1FceFa32b3bbD5d18c5A623DB64bfBc107D] [0x206846dE1F372A9a603e672ba97A5238cC89aeAA] 3
0x446d4d6b26815f9bA78 B5D454E303315D586Cb2a [0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76] [0x3B16821A5dBBFF86E4a88eA0621EC6be016cd79A] [0x648aA14e4424e0825A5cE739C8C68610e143FB79] [0x27c7CEd729280060577A68A54A94075D18614D19] [0xa9aE3B8FC1CBaAed74fE5889260f7cD743c50363] [0x161f479021044cB1C9e3DEF98aF945A8D972D3B2] 3
0x1ba8e3aA853F73ae809 3E26B7B8F2520c3620Df4 [0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76] [0x3B16821A5dBBFF86E4a88eA0621EC6be016cd79A] [0x648aA14e4424e0825A5cE739C8C68610e143FB79] [0x27c7CEd729280060577A68A54A94075D18614D19] [0xa9aE3B8FC1CBaAed74fE5889260f7cD743c50363] [0x161f479021044cB1C9e3DEF98aF945A8D972D3B2] [0xD6475ce37d964d4816715FdafFEeAAf2958948bE] [0xD70aa9d7280E6FEe89B86f53c0B2A363478D5e94] [0xa5F84b556d5FD8959165Eff0324DCFEa164fA089] [0xf061f1FceFa32b3bbD5d18c5A623DB64bfBc107D] [0x206846dE1F372A9a603e672ba97A5238cC89aeAA] [0xaACA1eDbb656206Ce2a82Da7d7BD3e1Bb8138F22] 1

更新于 [2024 年 2 月 8 日上午 10:02:59 +UTC]:

总结

在这篇博客文章中,我们回顾了 Puffer 协议使用的安全机制。总的来说,整个权限系统的设计是全面的。

社区应积极关注潜在风险:

  • Community SafeWallet 所有者私钥的安全性至关重要。如果三个私钥被泄露,攻击者将能够升级 Vault。
  • 依赖协议(如 EigenLayer)的安全性也应积极监控。
Sign up for the latest updates