Back to Blog

Revisitando os Ataques de Wormhole

Code Auditing
March 22, 2022
5 min read

1. Contexto

Wormhole, também conhecido como ponte Einstein-Rosen, é uma estrutura especulativa que conecta pontos distintos no espaço-tempo. No mundo do blockchain, o wormhole é utilizado como ponte entre diferentes redes (por exemplo, Solana e Ethereum). Os usuários podem transferir ativos tokenizados entre blockchains com o wormhole.

Em 2 de fevereiro de 2022, o Wormhole foi hackeado e o atacante conseguiu cunhar 120.000 Ether embrulhado no valor de 320 milhões de dólares, sendo esta a segunda maior perda da história do DeFi, atrás apenas da Poly Network.

2. Como o Wormhole funciona

O Wormhole funciona monitorando as mensagens emitidas em cada rede. A mensagem monitorada é encaminhada para a rede de destino, permitindo a construção de um protocolo de comunicação entre cadeias.

A questão intuitiva é como garantir que a mensagem monitorada seja confiável. Para resolver esse problema, o Wormhole introduz 19 nós extras, chamados de guardiões. O conjunto atual de guardiões pode ser verificado no Wormhole Explorer. Cada guardião pode verificar a mensagem monitorada de forma independente e assiná-la.

No Wormhole, a mensagem é organizada no formato VAA. O VAA consiste em duas partes. Uma é o cabeçalho, que coleta as assinaturas dos guardiões. A outra é o corpo, que contém as informações para a rede de destino, o payload da mensagem, etc.

Assim que as assinaturas dos guardiões atingem o limiar de consenso, o VAA pode ser publicado na cadeia.

Em resumo, os guardiões são responsáveis pela integridade da mensagem transferida.

3. Ponte de Tokens

Após entender como a mensagem é transferida entre diferentes redes, não será difícil compreender como a Ponte de Tokens, que é a principal aplicação do wormhole, funciona.

Para transferir tokens da cadeia A para a cadeia B, o Wormhole bloqueia os tokens na cadeia A e os cunha na cadeia B. Essa é a ideia geral. Na prática, isso pode ser dividido em três etapas. Primeiro, os tokens na cadeia A são bloqueados. Segundo, a mensagem de que os tokens na cadeia A devem ser transferidos para a cadeia B é transmitida. Terceiro, a cadeia B recebe a mensagem e os tokens correspondentes são cunhados. Tudo concluído.

4. Instruções da Solana

Na Solana, uma transação consiste em múltiplas instruções. Cada instrução contém um ID de programa, contas e dados. O ID do programa representa o programa (um contrato inteligente) que irá processar a instrução. O programa interpreta os dados e opera nas contas fornecidas.

5. O Ataque ao Wormhole

Em resumo, o atacante cunhou 120.000 ETH na Solana sem bloquear nenhum ativo no Ethereum. A transação está aqui.

Assim, a questão é como o atacante conseguiu cunhar os 120.000 ETH na Solana. Vamos detalhar os passos. Para cunhar o token, a instrução complete_wrapped é invocada. Essa instrução recebe vários endereços, e o terceiro é o endereço que armazena a mensagem assinada. Antes de cunhar os 120.000 ETH, a cadeia B (ou seja, Solana) deve receber a mensagem assinada (ou seja, VAA) indicando que 120.000 ETH foram bloqueados na cadeia A (ou seja, Ethereum).

Para publicar a mensagem, o post_vaa definido em post_vaa.rs é invocado. Consequentemente, uma conta é criada para armazenar a mensagem. No entanto, o post_vaa não verifica as assinaturas dos guardiões. Em vez disso, o verify_signatures definido em verify_signatures.rs verifica as assinaturas.

A quarta conta fornecida ao verify_signatures é a conta de instruções do sistema. Agora vamos explorar como o verify_signatures funciona.

Na linha 103, a função load_instruction_at é invocada para carregar a instrução executada anteriormente secp_ix. O secp_ix invocará a função de verificação de assinatura Secp256k1. Assim, o verify_signatures verifica as assinaturas checando a instrução executada anteriormente secp_ix. Você já entendeu tudo? A função load_instruction_at não verifica de onde carregar as instruções!!! Espera-se que as instruções sejam carregadas de Sysvar:Instructions.

No entanto, a quarta conta da transação de ataque é 2tHS1cXX2h1KBEaadprqELJ6sV9wLoaSdX68FqsrrZRd e não Sysvar:Instructions. Nesse caso, o atacante conseguiu contornar com sucesso o processo de verificação de assinaturas. O wormhole acreditou que a verificação foi aprovada e a mensagem foi publicada na cadeia, resultando na cunhagem de 120 mil ETH sem bloquear nada!

Vamos analisar uma instrução de verificação legítima. Essa transação consiste em duas instruções. A primeira invoca a função de verificação Secp256k1, enquanto a segunda invoca a instrução verify_signatures. Note que a quarta conta aqui é Sysvar:Instructions.

Após cunhar os 120 mil ETH, o atacante pôde sacar de volta para o Ethereum e convertê-los em outros tokens para obter lucro.

6. Correção

Como mencionado no repositório, desde a versão 1.8.0, load_instruction_at não é segura e o endereço das contas Sysvar não é verificado. Em vez disso, recomenda-se o uso de load_instruction_at_checked.

7. Nossa Reflexão

  • Os desenvolvedores devem estar muito familiarizados com as funções externas que utilizam.
  • Mantenha-se atento a quaisquer mudanças importantes nas bibliotecas utilizadas. Se a biblioteca mudar, o código que a utiliza pode precisar ser alterado.
  • O mantenedor da biblioteca deve estar ciente dos riscos potenciais de determinadas mudanças e notificar toda a comunidade em tempo hábil. Simplesmente adicionar anotações pode não funcionar e não é suficiente.
  • O código do seu contrato precisa ser auditado caso as versões da biblioteca e do código sejam alteradas.

Sobre a BlockSec

A BlockSec é uma empresa pioneira em segurança de blockchain, fundada em 2021 por um grupo de especialistas em segurança de renome mundial. A empresa está comprometida em aprimorar a segurança e a usabilidade para o emergente mundo Web3, com o objetivo de facilitar sua adoção em massa. Para isso, a BlockSec oferece serviços de auditoria de segurança de contratos inteligentes e redes EVM, a plataforma Phalcon para desenvolvimento seguro e bloqueio proativo de ameaças, a plataforma MetaSleuth para rastreamento e investigação de fundos, e a extensão MetaSuites para construtores web3 navegarem com eficiência no mundo cripto.

Até o momento, a empresa atendeu mais de 300 clientes ilustres, como MetaMask, Uniswap Foundation, Compound, Forta e PancakeSwap, e recebeu dezenas de milhões de dólares americanos em duas rodadas de financiamento de investidores de destaque, incluindo Matrix Partners, Vitalbridge Capital e Fenbushi Capital.

Site oficial: https://blocksec.com/

Conta oficial no Twitter: https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

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

BlockSec Audit