Back to Blog

Puffer Protocol:為何存取控制機制至關重要及其安全性提升之道

Code Auditing
February 8, 2024
8 min read

「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 之間的主要關係
圖 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 合約內部函數的不同路徑
圖 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 和 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 中這些排隊交易的模擬
圖 3:BlockSec Phalcon 中這些排隊交易的模擬

更新於 [2024 年 2 月 16 日 上午 20:10:23 +UTC]:

圖 4:來自 Etherscan 的結果
圖 4:來自 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]:

總結

在本篇部落格文章中,我們回顧了 Puffer 協議所使用的安全機制。總體而言,整個權限系統的設計是全面的。

社群應主動監控潛在風險:

  • Community SafeWallet 所有者的私鑰安全性至關重要。如果三把私鑰遭竊,攻擊者可能藉此升級 Vault。
  • 應主動監控相關依賴協議(如 EigenLayer)的安全性。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit