As pontes blockchain desempenham um papel crucial na busca pela interoperabilidade no espaço das blockchains. Portanto, a segurança das pontes é de extrema importância. Neste artigo, vamos explorar as vulnerabilidades comuns de segurança em pontes blockchain e discutir como essas vulnerabilidades podem ser mitigadas. É importante entender que as pontes blockchain são protocolos que conectam duas blockchains para permitir interações entre elas. Por exemplo, se você possui Bitcoin e deseja participar de atividades DeFi na rede Ethereum, uma ponte blockchain permite que você o faça sem vender seus Bitcoins.
Por que a Segurança das Pontes é Crítica?
A segurança das pontes blockchain é crucial porque essas pontes geralmente mantêm os tokens que os usuários desejam transferir de uma cadeia para outra. Muitas vezes, essas pontes são implementadas como contratos inteligentes e, à medida que as transferências entre cadeias aumentam, elas acumulam uma quantidade significativa de tokens, tornando-se alvos lucrativos para hackers.
Além disso, as pontes blockchain têm uma grande superfície de ataque, uma vez que envolvem muitos componentes. Isso torna os atores maliciosos altamente motivados a mirar em aplicativos que operam entre cadeias para desviar grandes quantidades de fundos.
Em 2022, os ataques a pontes causaram perdas superiores a 1,3 bilhão de dólares, representando 36% das perdas totais do ano, de acordo com estimativas da CertiK.
Vulnerabilidades Comuns de Segurança em Pontes
Para melhorar a segurança das pontes, é valioso compreender as vulnerabilidades comuns de segurança e testar as pontes quanto a elas antes do lançamento. Essas vulnerabilidades podem ser categorizadas em quatro áreas principais.
Validação Fraca On-Chain
Em pontes simples, especialmente aquelas projetadas para aplicativos específicos, a validação on-chain é mantida ao mínimo. Essas pontes dependem de um backend centralizado para executar operações básicas, como criação, queima e transferência de tokens, enquanto todas as verificações são realizadas off-chain.
Por outro lado, outros tipos de pontes usam contratos inteligentes para validar mensagens e realizar verificações on-chain. Nesse cenário, quando um usuário deposita fundos em uma cadeia, o contrato inteligente gera uma mensagem assinada e a retorna na transação.
Essa assinatura serve como prova do depósito e é usada para verificar a solicitação de saque do usuário na outra cadeia. Esse processo deve ser capaz de prevenir vários ataques de segurança, incluindo ataques de repetição e registros de depósito forjados.
No entanto, se houver uma vulnerabilidade durante o processo de validação on-chain, o atacante pode causar danos graves. Por exemplo, se uma ponte usar uma árvore Merkle para validar o registro da transação, um atacante pode gerar provas forjadas, o que significa que ele pode contornar a validação de prova e criar novos tokens em sua conta se o processo de validação for vulnerável.
Validação Fraca Off-Chain
Em alguns sistemas de pontes, o servidor off-chain desempenha um papel crítico na verificação da legitimidade das mensagens enviadas da cadeia. Nesse caso, estamos nos concentrando na verificação de transações de depósito.
Uma ponte blockchain com validação off-chain funciona da seguinte maneira:
- Os usuários interagem com o aplicativo para depositar tokens no contrato inteligente na cadeia de origem.
- O aplicativo envia o hash da transação de depósito para o servidor backend por meio de uma API.
- O servidor realiza várias validações no hash da transação. Se for considerado legítimo, um signatário assina uma mensagem e a envia de volta para a interface do usuário por meio da API.
- Ao receber a assinatura, o aplicativo a verifica e permite que o usuário retire seus tokens da cadeia de origem.
O servidor backend deve garantir que a transação de depósito que ele processa realmente ocorreu e não foi forjada. Este servidor é, portanto, um alvo de alto valor para os atacantes.
Manipulação Incorreta de Tokens Nativos
As pontes adotam abordagens diferentes para lidar com tokens nativos e tokens de utilidade. Por exemplo, na rede Ethereum, o token nativo é o ETH, e a maioria dos tokens de utilidade segue o padrão ERC-20.
Quando um usuário deseja transferir seu ETH para outra cadeia, ele deve primeiro depositá-lo no contrato da ponte. Para fazer isso, o usuário simplesmente anexa o ETH à transação, e a quantidade de ETH pode ser recuperada lendo o campo “msg.value” da transação.
No entanto, o depósito de tokens ERC-20 difere significativamente do depósito de ETH. Para depositar um token ERC-20, o usuário deve primeiro permitir que o contrato da ponte gaste seus tokens. Após aprovar isso e depositar os tokens no contrato da ponte, o contrato irá queimar os tokens do usuário usando a função “burnFrom()” ou transferir os tokens do usuário para o contrato usando a função “transferFrom()”.
Uma abordagem para diferenciar isso é usar uma declaração if-else dentro da mesma função. Outra abordagem é criar duas funções separadas para lidar com cada cenário. Tentar depositar ETH usando a função de depósito ERC-20 pode resultar na perda desses fundos.
Quando se lida com solicitações de depósito ERC-20, os usuários geralmente fornecem o endereço do token como entrada para a função de depósito. Isso representa um risco significativo, pois chamadas externas não confiáveis podem ocorrer durante a transação.
Implementar uma lista branca que inclua apenas os tokens suportados pela ponte é uma prática comum para minimizar o risco. Apenas endereços listados na lista branca podem ser passados como argumentos. Isso impede chamadas externas, pois a equipe do projeto já filtrou o endereço do token.
No entanto, problemas também podem surgir quando as pontes lidam com a transferência de tokens nativos entre cadeias, uma vez que o token nativo não possui um endereço. Um endereço zero (0x000…0) representa o token nativo. Isso pode ser problemático, pois passar o endereço zero para a função pode contornar a verificação da lista branca, mesmo que implementada incorretamente.
Quando o contrato da ponte chama “transferFrom” para transferir os ativos do usuário para o contrato, a chamada externa para o endereço zero retorna falso, uma vez que não há função “transferFrom” implementada no endereço zero. No entanto, a transação ainda pode ocorrer se o contrato não manipular adequadamente o valor de retorno. Isso cria uma oportunidade para os atacantes executarem a transação sem transferir tokens para o contrato.
Má Configuração
Na maioria das pontes blockchain, um papel privilegiado é responsável por listar ou excluir tokens e endereços, atribuir ou alterar signatários e outras configurações críticas. Garantir que todas as configurações sejam precisas é crucial, pois até mesmo pequenas omissões aparentemente triviais podem levar a perdas significativas.
De fato, houve um incidente em que o atacante conseguiu contornar a verificação de registro de transferência devido a uma má configuração. A equipe do projeto implementou uma atualização de protocolo alguns dias antes do hack, que envolveu a alteração de uma variável.
A variável era usada para representar o valor padrão da mensagem confiável. Essa mudança resultou em todas as mensagens sendo automaticamente consideradas como provadas, permitindo que um atacante enviasse uma mensagem arbitrária e passasse pelo processo de verificação.
Como Melhorar a Segurança das Pontes
As quatro vulnerabilidades comuns de segurança em pontes explicadas acima demonstram os desafios de garantir a segurança em um ecossistema de blockchains interconectadas. Existem considerações significativas para lidar com cada uma dessas vulnerabilidades, e não existe um único plano que se aplique a todas elas.
Para prevenir a possibilidade de contornar a verificação, é essencial testar rigorosamente a ponte contra todos os vetores de ataque possíveis e garantir que a lógica de verificação seja sólida.
Em resumo, é essencial realizar testes rigorosos contra possíveis ataques e prestar atenção especial às vulnerabilidades de segurança mais comuns em pontes.
Conclusão
Devido ao seu alto valor, as pontes entre blockchains têm sido alvo de ataques por um longo período. Os construtores podem fortalecer a segurança de suas pontes realizando testes abrangentes antes do lançamento e envolvendo auditorias de terceiros, reduzindo o risco dos hacks devastadores que têm assolado as pontes nos últimos anos. As pontes são fundamentais em um mundo multi-cadeia, mas a segurança deve ser uma preocupação primordial ao projetar e construir uma infraestrutura Web3 eficaz.