Back to Blog

Protocolo Puffer: Por Que o Mecanismo de Controle de Acesso É Importante e Como Melhorar Sua Segurança

Code Auditing
February 8, 2024
6 min read

"Puffer é um protocolo descentralizado de restaking líquido nativo (nLRP) construído sobre o Eigenlayer". Ele atraiu mais de 600 milhões de dólares em TVL (Total Value Locked) em apenas alguns dias. O controle de acesso é uma consideração de segurança importante para prevenir operações maliciosas no protocolo.

Neste blog, revisamos toda a arquitetura do mecanismo de controle de acesso e sua configuração atual no protocolo Puffer. Isso pode ajudar a comunidade a entender melhor o protocolo. Observe que o resultado da análise é baseado no status atual (Bloco 19177155, 07 de fev de 2024, 03:17:35 PM +UTC) na Ethereum.

Endereços dos contratos

A tabela a seguir lista os contratos inteligentes utilizados neste blog.

Endereço Implementação
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

Arquitetura

O protocolo como um todo inclui principalmente dois contratos inteligentes relacionados aos ativos dos usuários. O primeiro é o PufferDepositor e o segundo é o PufferVault.

Figura 1: A relação principal entre PufferDepositor e PufferVault
Figura 1: A relação principal entre PufferDepositor e PufferVault

A principal funcionalidade do PufferDepositor é aceitar os ativos dos usuários e depositá-los no PufferVault. Se os ativos depositados pelos usuários não forem stETH, a troca em uma DEX é realizada automaticamente pelo protocolo.

O PufferVault é o contrato principal que mantém os ativos dos usuários. Ele também é o ponto de entrada para depósitos no EigenLayer. O controle de acesso principal de todo o protocolo é implementado neste contrato inteligente.

Mecanismo de Controle de Acesso

Todo o controle de acesso é implementado utilizando o módulo AccessManager da OpenZeppelin. O contrato inteligente AccessManager gerencia a autoridade dos contratos PufferDepositor e PufferVault.

O AccessManager define diferentes Papéis (Roles), que contêm diferentes endereços. Cada Papel pode ser atribuído para invocar diferentes funções dentro dos contratos AccessManaged (ou seja, PufferDepositor e PufferVault). O AccessManager suporta a execução atrasada de uma função específica. Isso significa que, ao conceder um Papel a um endereço, é possível especificar se as operações emitidas por esse endereço neste Papel são executadas imediatamente ou com um atraso de tempo.

Configurações Atuais de Controle de Acesso

No entanto, a eficácia do controle de acesso depende de sua configuração. Observamos inúmeros casos em que uma configuração incorreta das regras de ACL (Lista de Controle de Acesso) levou a vulnerabilidades de segurança.

Para resolver isso, revisamos a configuração atual do protocolo Puffer e apresentamos os resultados abaixo. Observe que esses resultados refletem apenas o status do Bloco 19177155 (07 de fev de 2024, 03:17:35 PM +UTC).

Papéis (Roles)

Abaixo está uma tabela descrevendo os papéis atuais no sistema e seus endereços associados.

ID do Papel Endereços com este Papel Execução Atrasada Observação
0 TimeLock 0x3c28b7c7ba1a1f55c9ce66b263b33b204f2126ea Não Papel ADMIN
1 Operation SafeWallet 0xc0896ab1a8cae8c2c1d27d011eb955cca955580d Sim, com 604800 segundos (7 dias) Atualizar os contratos alvo (PufferDepositor e PufferVault)
1 Community SafeWallet 0x446d4d6b26815f9ba78b5d454e303315d586cb2a Não Atualizar os contratos alvo (PufferDepositor e PufferVault)
22 Operation SafeWallet 0xc0896ab1a8cae8c2c1d27d011eb955cca955580d Não Mover ativos para o EigenLayer e iniciar solicitação de retirada do EigenLayer

Existem diferentes caminhos de execução para executar funções dentro do contrato PufferVault. Um caminho envolve o contrato TimeLock (com o Papel ADMIN – conforme mostrado no Caminho 1 na figura), e o outro caminho permite a invocação direta de funções dentro do Vault, com o papel atribuído ao chamador. Em ambos os casos, a invocação deve passar pelo AccessManager.

Figura 2: Os diferentes caminhos de execução para executar funções dentro do contrato PufferVault
Figura 2: Os diferentes caminhos de execução para executar funções dentro do contrato PufferVault

Tipo I: Invocação a partir do Contrato TimeLock

Observe que ao invocar uma função a partir do contrato TimeLock, o Papel atribuído é ADMIN. Essa designação ocorre porque, da perspectiva do Vault, o chamador é o contrato TimeLock, que possui o Papel ADMIN. Consequentemente, o contrato TimeLock incorpora uma camada adicional de mecanismo de execução atrasada.

  • Operation SafeWallet: Este componente pode invocar funções dentro do contrato alvo após um atraso de 604.800 segundos (aproximadamente 7 dias).
  • Community SafeWallet: Este componente tem a capacidade de invocar funções dentro do contrato alvo imediatamente. Ele também possui autoridade para cancelar qualquer execução pendente na fila submetida pelo Operation SafeWallet.
  • Pausing SafeWallet: Este componente está restrito a pausar o contrato alvo e não está autorizado a executar nenhuma outra função.

Tipo II: Invocação Direta do Contrato Vault

O método seguinte envolve a invocação direta de funções dentro do contrato Vault. É importante observar que o AccessManager determina quais funções podem ser invocadas pelos endereços associados a cada Papel.

ID do Papel Contrato Alvo Função Alvo
1 PufferVault upgradeToAndCall(address,bytes)

0x4f1ef286

22 PufferVault depositToEigenLayer (0x008e0590)

initiateETHWithdrawalsFromLido (0x593961de)

initiateStETHWithdrawalFromEigenLayer (0x402064a7)

Tanto o Operation quanto o Community SafeWallet têm a capacidade de invocar diretamente a função upgradeToAndCall para atualizar o contrato alvo. A principal distinção está no tempo: o Community SafeWallet executa essa ação sem nenhum atraso, enquanto o Operation SafeWallet está sujeito a um atraso.

Além disso, o Operation SafeWallet está equipado para executar imediatamente funções que transferem ativos para o EigenLayer e iniciam solicitações de retirada.

Atualizado em [08 de fev de 2024, 10:02:59 AM +UTC]

Uma operação com o objetivo de remover o Operation SafeWallet do Papel 1 foi agendada. Esta operação está prevista para execução após o bloco 1707940908, o que corresponde a um atraso estimado de aproximadamente 7 dias. A simulação dessas transações enfileiradas foi realizada usando o BlockSec Phalcon.

Figura 3: A simulação dessas transações enfileiradas no BlockSec Phalcon
Figura 3: A simulação dessas transações enfileiradas no BlockSec Phalcon

Atualizado em [16 de fev de 2024, 20:10:23 AM +UTC]:

Figura 4: O resultado no Etherscan
Figura 4: O resultado no Etherscan

Configurações das Safe Wallets

A configuração de uma safe wallet também afeta a segurança do protocolo.

Carteira Proprietários Limite
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

Atualizado em [08 de fev de 2024, 10:02:59 AM +UTC]:

Resumo

Nesta publicação do blog, revisamos os mecanismos de segurança utilizados pelo protocolo Puffer. No geral, o design de todo o sistema de permissões é abrangente.

A comunidade deve monitorar ativamente os riscos potenciais:

  • A segurança das chaves privadas dos proprietários do Community SafeWallet é fundamental. Se três chaves privadas forem comprometidas, um atacante poderia ser capaz de atualizar o vault.
  • A segurança dos protocolos dependentes, como o EigenLayer, também deve ser monitorada ativamente.

Best Security Auditor for Web3

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

BlockSec Audit