「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 和 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 中的模擬交易,該交易於十天後的 2024-02-18 17:59:07 (UTC) 執行排隊中的操作。
- 查詢 Operation SafeWallet 是否仍擁有角色 1 的模擬交易(返回 false)
更新於 [2024 年 2 月 16 日 上午 20:10:23 +UTC]:
- 將 Operation SafeWallet 從角色 1 中移除的交易已執行。我們可以從 Etherscan 查看結果。

Safe Wallet 配置
Safe Wallet 的配置也會影響協議的安全性。
| 錢包 | 所有者 | 門檻 |
|---|---|---|
| 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)的安全性。



