“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。

PufferDepositor 的主要功能是接受用户的资产,然后将它们存入 PufferVault。如果用户的存款资产不是 stETH,协议会自动执行兑换到 DEX。
PufferVault 是持有用户资产的主要合约。它也是存入 EigenLayer 的入口点。整个协议的主要访问控制在此智能合约中实现。
访问控制机制
整个访问控制是通过利用 OpenZeppelin 的 AccessManager 模块 来实现的。AccessManager 智能合约管理 PufferDepositor 和 PufferVault 合约的权限。
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。

类型 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 模拟了这些排队的交易。

- Phalcon Fork 中用于在 2024 年 2 月 18 日 17:59:07(UTC)执行排队执行的模拟交易,比当前时间晚十天。
- 用于查询 Operation SafeWallet 是否仍拥有角色 1 的模拟交易(返回 false)。
更新于 [2024 年 2 月 16 日下午 8:10:23 +UTC]:

安全钱包配置
安全钱包的配置也会影响协议的安全性。
| 钱包 | 所有者 | 阈值 |
|---|---|---|
| 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]:
- 地址 0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76 已从 Operation SafeWallet 中移除,其授权调整为 3/5。
- 一项将 0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76 从 Community SafeWallet 中移除的交易已被启动,目前正在等待社区的多重签名批准。
- 三个钱包已从 Pausing SafeWallet 中移除,其配置现调整为 1/9。
总结
在这篇博客文章中,我们回顾了 Puffer 协议使用的安全机制。总的来说,整个权限系统的设计是全面的。
社区应积极关注潜在风险:
- Community SafeWallet 所有者私钥的安全性至关重要。如果三个私钥被泄露,攻击者将能够升级 Vault。
- 依赖协议(如 EigenLayer)的安全性也应积极监控。



