Back to Blog

Protegendo o Ecossistema Solana (7) — Confusão de Tipos

29 de abril de 2022
4 min read

0. Revisão

1. Visão Geral

No artigo anterior, apresentamos a implementação de um Multi-Sig geral. Neste post, discutiremos outro problema de segurança — Confusão de Tipos.

2. Desserialização/Serialização

Na Solana, os estados do programa são armazenados em contas. O problema de confusão de tipos surge durante a desserialização/serialização de contas. A lógica do programa geralmente depende das estruturas de dados. No entanto, o programa pode não verificar corretamente o tipo das contas durante o processo de desserialização/serialização. Isso pode ser explorado por atacantes, resultando em perdas inesperadas.

3. Revisão de Código (Confusão de Tipos)

A seguir, ilustramos o problema de confusão de tipos com um programa simples. Você pode encontrar o código de teste aqui.

No programa de teste, implementamos duas estruturas de dados: uma é User e a outra é Metadata. Ambas registram a chave pública de uma conta (contas diferentes).

O programa possui três instruções diferentes. A instrução InitializeUser foi projetada para criar a conta User e definir uma conta autorizada (ou seja, authority). Da mesma forma, a instrução InitializeMeta é invocada para criar a conta MetaData e definir uma conta normal (ou seja, account). A instrução Test demonstra que o atacante pode contornar a lógica de verificação do programa e realizar ataques com MetaData controlada.

Vamos percorrer a instrução Test(). O programa garante que o proprietário da conta User passada seja o próprio programa (linha 86 - linha 89). Após a desserialização (linha 92), o programa compara a chave pública da conta authority passada com a chave pública armazenada na conta User. Se elas não forem iguais, o programa reverte (linha 93 - linha 96). A última verificação é garantir que a conta de autoridade tenha assinado a transação. No entanto, se um atacante passar a conta Metadata controlada, todas as verificações ainda podem ser contornadas. O motivo é que o programa não verifica o tipo das contas. Ele recebe um array de bytes e o desserializa diretamente em diferentes tipos de structs definidos no programa.

Implantamos o programa de teste para testes adicionais, e ele pode ser encontrado neste link.

3.1 Enviar Transação

Após implantar o programa, escrevemos o script para invocar as três instruções fornecidas pelo programa em ordem.

Primeiro invocamos InitializeUser e InitializeMeta. Observe que definimos nossa própria chave pública como a conta account armazenada na conta Metadata.

Na função test(), passamos a conta Metadata como a conta User e nossa própria conta como authority_info (linha 347 - linha 348). O programa desserializou o Metadata com a struct User e todas as verificações podem ser contornadas.

Enviamos a transação e ela pode ser encontrada aqui. O programa retornou sucesso, o que significa que passamos com êxito pela verificação com o tipo de conta não verificado.

4. Resumo

Neste artigo, apresentamos o problema de confusão de tipos na Solana. Existem várias maneiras de evitar esse problema. Por exemplo, podemos adicionar um atributo para registrar o tipo da conta na struct, e o programa deve sempre verificar o atributo de tipo antes de ler/escrever de/para a conta passada. Continue acompanhando, e compartilharemos mais nos próximos posts.

Leia outros artigos desta série:


Sobre a BlockSec

A BlockSec é uma empresa pioneira em segurança 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 do emergente mundo Web3, a fim 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 desenvolvedores Web3 navegarem com eficiência no mundo cripto.

Até o momento, a empresa atendeu mais de 300 clientes de prestígio, 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 proeminentes, incluindo Matrix Partners, Vitalbridge Capital e Fenbushi Capital.

Site oficial: https://blocksec.com/

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

Sign up for the latest updates
Como a solução de segurança de pagamentos da BlockSec ajuda instituições a se manterem seguras na era da IA
Security Services

Como a solução de segurança de pagamentos da BlockSec ajuda instituições a se manterem seguras na era da IA

Descubra como a BlockSec ajuda instituições de pagamento a proteger recursos financeiros e dados, além de fortalecer sua resiliência por meio de avaliações de segurança, testes e monitoramento contínuo.

Perdas de ~5,57 milhões USD: exploração de falhas no X100 Freezer e no NEM | Boletim semanal da BlockSec
Security Insights

Perdas de ~5,57 milhões USD: exploração de falhas no X100 Freezer e no NEM | Boletim semanal da BlockSec

Este relatório semanal aborda dois incidentes de segurança na Ethereum e na BNB Chain no período de 19/10/2026–25/10/2026. Ele examina uma tomada de controle da governança do X100 Freezer financiada por um empréstimo-relâmpago e uma falha na liquidação de impostos que afetou um pool de liquidez de um token NEM na BNB Chain. As perdas estimadas no escopo do relatório totalizam aproximadamente 5,57 milhões USD: cerca de 4,75 milhões USD da transação representativa do X100 e cerca de 820 mil USD do incidente no pool do NEM. O total exclui as extrações subsequentes do X100 relatadas separadamente.

Perdas de ~3,87 milhões USD: ataques à Autheo Network e à UNCX | Resumo semanal da BlockSec
Security Insights

Perdas de ~3,87 milhões USD: ataques à Autheo Network e à UNCX | Resumo semanal da BlockSec

Este relatório semanal aborda 3 incidentes de segurança no período de 12/10/2026–18/10/2026, com perdas totais estimadas em aproximadamente 3,87 milhões USD. A Autheo Network sofreu um comprometimento de chave privada com perdas de cerca de 1,76 milhões USD, a Qubic Wallet perdeu cerca de 1,30 milhões USD devido à geração de seeds fracas, e os contratos Smart Token Vesting V2 da UNCX Network sofreram um erro contábil de cerca de 807 mil USD nas redes Ethereum, BNB Chain, Base e Robinhood Chain. A análise em destaque da UNCX explica como um cálculo incorreto do total de cotas misturou parcelas de vesting criadas com diferentes proporções entre tokens e cotas, permitindo saques acima do devido de pools compartilhados.

Protegendo o Ecossistema Solana (7) — Confusão de Tipos