Análise de vulnerabilidades do compilador Solidity e estratégias práticas para proteger a segurança dos contratos inteligentes

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

O compilador é um dos componentes fundamentais dos sistemas de computação modernos, e sua função é converter o código-fonte em linguagem de programação de alto nível em códigos de instrução que podem ser executados pelo computador. A maioria dos desenvolvedores e profissionais de segurança geralmente se concentra na segurança do código do aplicativo, mas muitas vezes negligencia a segurança do próprio compilador. Na verdade, o compilador, como um programa de computador, também pode ter vulnerabilidades de segurança, que podem representar riscos graves em cenários específicos.

Por exemplo, quando o navegador compila e executa código JavaScript, pode haver uma exploração de vulnerabilidades do motor JavaScript, permitindo que atacantes executem código remotamente quando o usuário acessa páginas web maliciosas, controlando assim o navegador da vítima ou até mesmo o sistema operativo. Outro estudo também mostrou que bugs em compiladores C++ podem levar a consequências graves, como execução remota de código.

Os compiladores Solidity também apresentam vulnerabilidades de segurança. De acordo com o alerta de segurança da equipe de desenvolvimento do Solidity, várias versões dos compiladores Solidity têm vulnerabilidades de segurança. A função do compilador Solidity é converter o código do contrato inteligente em código de instrução (EVM) para a máquina virtual Ethereum, e essas instruções serão finalmente enviadas para o Ethereum e executadas pela EVM.

É necessário distinguir entre vulnerabilidades do compilador Solidity e vulnerabilidades da própria EVM. Vulnerabilidades da EVM referem-se a problemas de segurança que surgem 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 que ocorrem ao converter Solidity em código EVM, não afetando diretamente a rede Ethereum, mas podendo resultar em um código EVM gerado que não corresponde às expectativas do desenvolvedor.

Uma das ameaças de uma vulnerabilidade no compilador Solidity é que pode levar a um código EVM gerado que não corresponde às expectativas do desenvolvedor do contrato inteligente. Como os contratos inteligentes geralmente envolvem os ativos de criptomoeda dos usuários, qualquer bug causado pelo compilador pode resultar na perda de ativos dos usuários, gerando consequências graves.

Os desenvolvedores e auditores geralmente se concentram na lógica do contrato e em problemas de segurança comuns, enquanto as vulnerabilidades do compilador são difíceis de detectar por meio de auditoria de código. É necessário analisar em conjunto a versão específica do compilador e os padrões de código para determinar se o contrato inteligente é afetado por vulnerabilidades do compilador.

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

Aqui estão alguns exemplos reais de vulnerabilidades do compilador Solidity:

  1. 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:

solidez contract C { uint32 a = 0x12345678; uint32 b = 0; função f() pública { a = a + 1; } função run() público ver retorna (uint32) { return b; } }

Teoricamente, a variável b não foi modificada, a função run() deveria retornar 0. No entanto, no código gerado pelo compilador da versão com vulnerabilidade, run() retorna 1. Isso acontece porque a EVM usa elementos de pilha de 32 bytes, enquanto o Solidity suporta tipos de dados menores, como uint32. O compilador precisa limpar os bits mais altos ao processar ( clean up ), mas não lidou corretamente com a sobrecarga de adição, resultando na escrita do 1 nos bits mais altos na variável b.

  1. SOL-2022-4 Efeitos Colaterais de Memória em InlineAssembly

A vulnerabilidade existe nas versões 0.8.13 a 0.8.15 do compilador. 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; } }

O compilador, para otimizar, remove operações de escrita na memória que parecem inúteis, mas erroneamente também otimizou o acesso à memória entre blocos de assembly. Isso fez com que a função f() retornasse 0 em vez do correto 0x42.

  1. SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

A vulnerabilidade afeta os compiladores das versões 0.5.8 a 0.8.16. Considere o seguinte código:

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

Normalmente, essa função deve retornar a string de entrada. Mas na versão com a vulnerabilidade, ela retorna uma string vazia. Isso acontece porque o compilador limpou incorretamente alguns dados ao codificar o array calldata em abi, resultando em inconsistências nos dados após a codificação e decodificação.

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

Em relação a vulnerabilidades do compilador Solidity, a equipe de segurança da blockchain Cobo propõe as seguintes recomendações:

Para os desenvolvedores:

  1. Usar uma versão mais recente do compilador Solidity, normalmente apresenta menos problemas de segurança conhecidos.

  2. Aperfeiçoar os casos de teste unitário. A maioria dos bugs a nível de compilador pode levar a resultados de execução de código que não correspondem ao esperado; aumentar a cobertura dos testes pode evitar esses problemas.

  3. Evite usar assembly inline, codificação e decodificação ABI complexas, etc., e não use cegamente novos recursos e funcionalidades experimentais. A maioria das vulnerabilidades de compiladores está relacionada a essas operações complexas.

Para os responsáveis pela segurança:

  1. Não negligencie os riscos de segurança que o compilador pode introduzir durante a auditoria. O item de verificação relevante é SWC-102: Versão do Compilador Desatualizada.

  2. Durante o processo de desenvolvimento, incentive a equipe de desenvolvimento a atualizar a versão do compilador, podendo introduzir uma verificação automática de versão no CI/CD.

  3. Não se preocupe excessivamente com vulnerabilidades do compilador. A maioria das vulnerabilidades só é ativada em padrões de código específicos, sendo necessário avaliar o impacto na segurança com base no projeto específico.

Alguns recursos práticos:

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

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

Em suma, desenvolvedores e profissionais de segurança devem dar importância aos riscos de segurança que podem resultar de vulnerabilidades no compilador Solidity, tomando as medidas adequadas para reduzir esses riscos e garantir a segurança dos contratos inteligentes.

Ver original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Recompensa
  • 6
  • Compartilhar
Comentário
0/400
MetaverseLandlordvip
· 07-12 19:10
O compilador teve um grande problema.
Ver originalResponder0
NFTHoardervip
· 07-12 03:00
O compilador também pode ter erros.
Ver originalResponder0
0xOverleveragedvip
· 07-10 21:09
O compilador é o nosso ancestral.
Ver originalResponder0
TestnetNomadvip
· 07-10 21:08
A pequena aula de compiladores é ótima.
Ver originalResponder0
ParallelChainMaxivip
· 07-10 21:06
A segurança dos compiladores não deve ser ignorada.
Ver originalResponder0
DegenApeSurfervip
· 07-10 20:55
A segurança dos contratos não é simples
Ver originalResponder0
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)