Análise de vulnerabilidades do compilador Solidity e estratégias de proteção de segurança

robot
Geração do resumo em andamento

Análise de vulnerabilidades do compilador Solidity e estratégias de mitigação

O compilador é uma das partes fundamentais dos sistemas de computação modernos. É um programa que converte linguagens de programação de alto nível em instruções executáveis pelo computador. Embora os desenvolvedores e especialistas em segurança geralmente se concentrem na segurança do código do aplicativo, a segurança do próprio compilador também é igualmente importante.

Os compiladores, como programas de computador, também podem ter vulnerabilidades de segurança, que em certas circunstâncias podem representar riscos de segurança graves. Por exemplo, ao interpretar e executar código JavaScript, os navegadores podem ser atacados devido a vulnerabilidades do motor JavaScript, levando a que os usuários que acedem a páginas maliciosas sejam atacados, resultando, em última instância, no controlo do navegador ou até do sistema operativo da vítima por parte do atacante.

O compilador Solidity não é exceção. De acordo com o aviso de segurança da equipe de desenvolvimento do Solidity, várias versões do compilador Solidity apresentam vulnerabilidades de segurança.

Análise de vulnerabilidades do compilador Solidity e medidas de resposta

Vulnerabilidade do compilador Solidity

O compilador Solidity tem a função de converter o código do contrato inteligente em código de instrução (EVM) para a Máquina Virtual Ethereum. Essas instruções EVM são empacotadas em transações e enviadas para o Ethereum, sendo finalmente executadas pela EVM.

É necessário distinguir entre vulnerabilidades do compilador Solidity e vulnerabilidades da própria EVM. Vulnerabilidades da EVM referem-se a falhas de segurança durante a execução de instruções pela máquina virtual, podendo afetar toda a rede Ethereum. Já as vulnerabilidades do compilador Solidity referem-se a problemas na conversão de Solidity para código EVM.

Vulnerabilidades do compilador Solidity não afetam diretamente a rede Ethereum, mas podem resultar em código EVM gerado que não corresponde às expectativas do desenvolvedor. Como os contratos inteligentes geralmente envolvem ativos de criptomoeda, qualquer bug causado pelo compilador pode resultar em perda de ativos dos usuários, com consequências graves.

É difícil detectar vulnerabilidades de compilador apenas auditando o código-fonte do contrato. É necessário analisar em conjunto a versão específica do compilador e o padrão de código para determinar se o contrato é afetado por vulnerabilidades do compilador.

Exemplo de vulnerabilidade do compilador Solidity

Aqui estão alguns exemplos reais de vulnerabilidades do compilador Solidity, que mostram as formas específicas, causas e perigos.

SOL-2016-9 HighOrderByteCleanStorage

A vulnerabilidade existe em versões anteriores do compilador Solidity (>=0.1.6 <0.4.4).

Considere o seguinte código:

solidity contrato C { uint32 a = 0x12345678; uint32 b = 0; função run() retorna (uint256) { a = a + 1; return b; } }

A variável de armazenamento b não foi modificada, a função run() deve retornar o valor padrão 0. Mas em versões do compilador com vulnerabilidades, run() retornará 1.

Essa situação inconsistente com as expectativas, se a variável b for usada para validação de permissões ou contabilidade de ativos, pode levar a consequências graves.

A razão para esse fenômeno é que a EVM utiliza elementos de pilha e slots de armazenamento de 32 bytes, enquanto o Solidity suporta tipos de dados menores como uint32. O compilador precisa limpar os bits altos ao lidar com esses tipos, mas não os trata corretamente em caso de estouro de inteiro, resultando na gravação do bit alto 1 no armazenamento, o que sobrescreve a variável b.

SOL-2022-4 InlineAssemblyMemorySideEffects

A vulnerabilidade existe nos compiladores das versões >=0.8.13 <0.8.15.

Considere o seguinte código:

solidez contrato C { function f() public pure returns (uint) { assembly { mstore(0, 0x42) } uint x; assembly { x := mload(0) } return x; } }

Esta vulnerabilidade resulta da otimização de compilação. O compilador tentou remover operações de escrita em memória que pareciam redundantes, mas analisou erroneamente além do bloco de assembly. Na versão vulnerável, a função f() retornará 0, em vez do correto 0x42.

SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

A vulnerabilidade afeta compiladores >= 0.5.8 < 0.8.16.

Considere o seguinte código:

solidity contrato C { function f(string[1] calldata a) external pure returns (string memory) { return abi.decode(abi.encode(a), (string[1]))[0]; } }

Normalmente, este código deve retornar o valor da variável a "aaaa". Mas na versão com falhas, retornará uma string vazia "".

Isto deve-se ao fato de que o Solidity, ao realizar a operação abi.encode em arrays do tipo calldata, eliminou erroneamente alguns dados, levando à modificação de dados adjacentes e resultando em inconsistências nos dados após a codificação e decodificação.

É importante notar que o Solidity executa implicitamente abi.encode ao fazer chamadas externas e emitir eventos, portanto, o alcance das vulnerabilidades desse tipo pode ser mais amplo do que o esperado.

Análise de vulnerabilidades do compilador Solidity e medidas de resposta

Recomendações de Segurança

Com base na análise do modelo de ameaça de vulnerabilidades do compilador Solidity e na revisão de vulnerabilidades históricas, são apresentadas as seguintes recomendações para desenvolvedores e profissionais de segurança:

Para os desenvolvedores:

  1. Use uma versão mais recente do compilador Solidity. As versões mais recentes geralmente corrigem problemas de segurança conhecidos.

  2. Melhorar os testes unitários. A maioria dos bugs a nível de compilador resulta em resultados de execução de código que não correspondem ao esperado; aumentar a cobertura de código pode ajudar a identificar esse tipo de problema na fase de teste.

  3. Evite o uso de assembly inline, operações complexas de codificação e decodificação de ABI, etc. A maioria das vulnerabilidades históricas está relacionada a essas características complexas.

Para a equipe de segurança:

  1. Não ignore os riscos de segurança que o compilador pode introduzir durante a auditoria. O item de verificação relacionado à Classificação de Fraquezas de Smart Contract(SWC) é SWC-102.

  2. No processo interno de SDL, incentivar a equipe de desenvolvimento a atualizar a versão do compilador Solidity, considerando a introdução de verificações automáticas no CI/CD.

  3. Não se deve preocupar excessivamente com vulnerabilidades de compiladores. A maioria das vulnerabilidades é acionada apenas em padrões de código específicos, sendo necessário avaliar o impacto real com base em cada situação.

Recursos práticos:

  • Alerta de segurança da equipe Solidity:
  • Lista de bugs oficial do Solidity:
  • Lista de bugs dos compiladores de várias versões:
  • O ícone de aviso no canto superior direito da página do código do contrato Etherscan pode alertar sobre vulnerabilidades de segurança na versão atual do compilador.

Resumo

Este artigo apresenta o conceito de vulnerabilidades do compilador Solidity, analisa os riscos de segurança que podem surgir no desenvolvimento prático do Ethereum e fornece recomendações de segurança úteis para desenvolvedores e profissionais de segurança. Ao compreender as características e impactos das vulnerabilidades do compilador, é possível garantir melhor a segurança dos contratos inteligentes.

Análise de Vulnerabilidades do Compilador Solidity e Medidas de Resposta

ETH2.02%
SOL-0.71%
Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
  • Recompensa
  • 3
  • Compartilhar
Comentário
0/400
DataBartendervip
· 17h atrás
A segurança não tem fim. Patches temporários não aguentam.
Ver originalResponder0
Ser_This_Is_A_Casinovip
· 17h atrás
Vulnerabilidades são razões para a Carteira voar.
Ver originalResponder0
Anon4461vip
· 17h atrás
Quem é que se atreve a tocar neste código?
Ver originalResponder0
  • Marcar
Faça trade de criptomoedas em qualquer lugar e a qualquer hora
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)