Back to Blog

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

April 29, 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