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



