Análise de vulnerabilidades do compilador Solidity e estratégias de resposta
O compilador é um dos componentes fundamentais dos sistemas de computadores modernos, responsável por converter linguagens de programação de alto nível em instruções executáveis de baixo nível. Embora os desenvolvedores geralmente se concentrem na segurança do código da aplicação, a segurança do próprio compilador também é igualmente importante. Vulnerabilidades no compilador podem, em certas circunstâncias, causar riscos de segurança graves, como vulnerabilidades no motor JavaScript do navegador que podem levar à execução remota de código.
O compilador Solidity não é exceção, existem várias versões com vulnerabilidades de segurança. Diferente das vulnerabilidades do EVM, as vulnerabilidades do compilador Solidity afetam apenas os desenvolvedores de contratos, não ameaçando diretamente a segurança da rede Ethereum. No entanto, isso pode levar a um código EVM gerado que não corresponde às expectativas do desenvolvedor, resultando em vulnerabilidades em contratos inteligentes, colocando em risco a segurança dos ativos dos usuários.
Aqui estão alguns exemplos reais de vulnerabilidades do compilador Solidity:
SOL-2016-9 HighOrderByteCleanStorage
Versão afetada: >=0.1.6 <0.4.4
Esta vulnerabilidade pode levar à modificação acidental da variável de armazenamento. Por exemplo:
solidez
contrato C {
uint32 a = 0x1234;
uint32 b = 0;
função run() retorna (uint) {
a += 1;
return b;
}
}
A função run( deve retornar 0, mas na verdade retorna 1. Isso ocorre porque o compilador não limpa corretamente os bits altos ao lidar com o estouro de inteiros, resultando na escrita dos bits de estouro em uma variável adjacente.
SOL-2022-4 InlineAssemblyMemorySideEffects
Versão afetada: >=0.8.13 <0.8.15
A vulnerabilidade decorre do processo de otimização de compilação. Por exemplo:
solidez
contract C {
function f)( public pure returns )uint( {
montagem {
mstore)0, 0x42(
}
uint x;
assembly {
x := mload)0(
}
return x;
}
}
A função f)( deve retornar 0x42, mas a versão com vulnerabilidade retornará 0. Isso ocorre porque o compilador removeu incorretamente a operação de escrita de memória no primeiro bloco assembly.
A vulnerabilidade envolve a codificação ABI do array calldata. Por exemplo:
solidity
contrato C {
function f)bytes( calldata a[1] public pure returns )bytes memory( {
return abi.encode)a(;
}
}
f)( A função deve retornar o array de entrada, mas a versão com falha retorna uma string vazia. Isso se deve ao fato de que o compilador limpou erroneamente os dados adjacentes durante o processo de codificação.
![Análise de vulnerabilidades do compilador Solidity e medidas de resposta])https://img-cdn.gateio.im/webp-social/moments-c97428f89ed62d5ad8551cdb2ba30867.webp(
Para reduzir o risco de vulnerabilidades do compilador Solidity, os desenvolvedores devem:
Utilizar uma versão mais recente do compilador
Melhorar os testes unitários, aumentar a cobertura de código
Evitar o uso de características de linguagem complexas, como assembly inline, codificação ABI de arrays multidimensionais, etc.
Os auditores de segurança devem:
Considerar os riscos potenciais do compilador durante o processo de auditoria
Recomenda-se que a equipe de desenvolvimento atualize a versão do compilador a tempo.
Adicionar verificação automática da versão do compilador no processo CI/CD
Recursos de referência úteis:
Blog oficial de avisos de segurança do Solidity
Lista de bugs do repositório Solidity no GitHub
Dicas de vulnerabilidade do compilador na página de contratos do Etherscan
![Análise de vulnerabilidades do compilador Solidity e medidas de resposta])https://img-cdn.gateio.im/webp-social/moments-84f5083d8748f2aab71fd92671d999a7.webp(
Em suma, embora as vulnerabilidades do compilador não sejam comuns, o impacto pode ser grave. Os desenvolvedores e profissionais de segurança devem estar atentos e tomar as medidas adequadas para reduzir os riscos.
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.
8 Curtidas
Recompensa
8
5
Compartilhar
Comentário
0/400
blockBoy
· 7h atrás
Mais uma falha no contrato, que irritante~
Ver originalResponder0
GasGuzzler
· 07-07 09:10
Mais uma vez, o compilador está a fazer das suas.
Ver originalResponder0
GweiTooHigh
· 07-07 09:05
Que raio é isto? Outra falha.
Ver originalResponder0
RektRecovery
· 07-07 09:00
*suspiro* mais uma vulnerabilidade previsível... quando é que os desenvolvedores aprenderão a parar de brincar com fogo
Análise de vulnerabilidades do compilador Solidity: riscos de segurança e estratégias de mitigação
Análise de vulnerabilidades do compilador Solidity e estratégias de resposta
O compilador é um dos componentes fundamentais dos sistemas de computadores modernos, responsável por converter linguagens de programação de alto nível em instruções executáveis de baixo nível. Embora os desenvolvedores geralmente se concentrem na segurança do código da aplicação, a segurança do próprio compilador também é igualmente importante. Vulnerabilidades no compilador podem, em certas circunstâncias, causar riscos de segurança graves, como vulnerabilidades no motor JavaScript do navegador que podem levar à execução remota de código.
O compilador Solidity não é exceção, existem várias versões com vulnerabilidades de segurança. Diferente das vulnerabilidades do EVM, as vulnerabilidades do compilador Solidity afetam apenas os desenvolvedores de contratos, não ameaçando diretamente a segurança da rede Ethereum. No entanto, isso pode levar a um código EVM gerado que não corresponde às expectativas do desenvolvedor, resultando em vulnerabilidades em contratos inteligentes, colocando em risco a segurança dos ativos dos usuários.
Aqui estão alguns exemplos reais de vulnerabilidades do compilador Solidity:
Versão afetada: >=0.1.6 <0.4.4
Esta vulnerabilidade pode levar à modificação acidental da variável de armazenamento. Por exemplo:
solidez contrato C { uint32 a = 0x1234; uint32 b = 0; função run() retorna (uint) { a += 1; return b; } }
A função run( deve retornar 0, mas na verdade retorna 1. Isso ocorre porque o compilador não limpa corretamente os bits altos ao lidar com o estouro de inteiros, resultando na escrita dos bits de estouro em uma variável adjacente.
Versão afetada: >=0.8.13 <0.8.15
A vulnerabilidade decorre do processo de otimização de compilação. Por exemplo:
solidez contract C { function f)( public pure returns )uint( { montagem { mstore)0, 0x42( } uint x; assembly { x := mload)0( } return x; } }
A função f)( deve retornar 0x42, mas a versão com vulnerabilidade retornará 0. Isso ocorre porque o compilador removeu incorretamente a operação de escrita de memória no primeiro bloco assembly.
Versão afetada: >= 0.5.8 < 0.8.16
A vulnerabilidade envolve a codificação ABI do array calldata. Por exemplo:
solidity contrato C { function f)bytes( calldata a[1] public pure returns )bytes memory( { return abi.encode)a(; } }
f)( A função deve retornar o array de entrada, mas a versão com falha retorna uma string vazia. Isso se deve ao fato de que o compilador limpou erroneamente os dados adjacentes durante o processo de codificação.
![Análise de vulnerabilidades do compilador Solidity e medidas de resposta])https://img-cdn.gateio.im/webp-social/moments-c97428f89ed62d5ad8551cdb2ba30867.webp(
Para reduzir o risco de vulnerabilidades do compilador Solidity, os desenvolvedores devem:
Os auditores de segurança devem:
Recursos de referência úteis:
![Análise de vulnerabilidades do compilador Solidity e medidas de resposta])https://img-cdn.gateio.im/webp-social/moments-84f5083d8748f2aab71fd92671d999a7.webp(
Em suma, embora as vulnerabilidades do compilador não sejam comuns, o impacto pode ser grave. Os desenvolvedores e profissionais de segurança devem estar atentos e tomar as medidas adequadas para reduzir os riscos.