Análise de vulnerabilidades do compilador Solidity e estratégias de resposta
O compilador é um dos componentes fundamentais dos sistemas de computação modernos, e a sua principal função é converter o código-fonte em linguagem de programação de alto nível em código de instruções executáveis pelo computador.
Embora a maioria dos desenvolvedores e profissionais de segurança esteja mais preocupada com a segurança do código do aplicativo, a segurança do próprio compilador não deve ser ignorada. Como programas de computador, os compiladores também podem ter vulnerabilidades de segurança, que em certos casos podem causar riscos de segurança graves. Por exemplo, ao compilar e executar código JavaScript no frontend, os navegadores podem, devido a vulnerabilidades do mecanismo de análise do JavaScript, permitir que usuários sejam alvos de ataques de execução remota de código ao acessar páginas da web maliciosas, resultando em um controle do navegador ou até mesmo do sistema operacional da vítima por parte do atacante.
O compilador Solidity não é exceção, existem vulnerabilidades de segurança em várias versões do compilador Solidity. O papel do compilador Solidity é converter o código de contrato inteligente em código de instrução da Máquina Virtual Ethereum (EVM), que será executado na EVM.
É importante notar que há uma diferença entre as vulnerabilidades do compilador Solidity e as vulnerabilidades da própria EVM. As vulnerabilidades da EVM referem-se a problemas de segurança que ocorrem durante a execução de instruções pela máquina virtual, que podem afetar toda a rede Ethereum. Por outro lado, as vulnerabilidades do compilador Solidity são problemas que surgem ao converter o código 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 consequências de uma vulnerabilidade no compilador Solidity é que pode levar a um código EVM gerado que não está em conformidade com as expectativas dos desenvolvedores de contratos inteligentes. Como os contratos inteligentes na Ethereum geralmente envolvem os ativos de criptomoeda dos usuários, qualquer bug causado pelo compilador pode resultar em perdas de ativos dos usuários, com consequências graves.
Os desenvolvedores e auditores de contratos muitas vezes estão mais focados na implementação lógica do código do contrato e em questões de segurança ao nível do Solidity, ignorando as vulnerabilidades do compilador. É difícil detectar vulnerabilidades do compilador apenas auditando o código-fonte do contrato; é necessário analisar em conjunto a versão específica do compilador e os padrões de código específicos.
Aqui estão alguns exemplos reais de vulnerabilidades do compilador Solidity:
SOL-2016-9 HighOrderByteCleanStorage
A vulnerabilidade existe em versões antigas do compilador Solidity (>=0.1.6 <0.4.4). Em certas situações, o compilador não limpa corretamente os bytes mais significativos, levando a uma sobrecarga de inteiros onde o bit 1 mais significativo é gravado no armazenamento, sobrescrevendo os valores das variáveis adjacentes. Esse comportamento inconsistente com o esperado pode ter consequências graves em casos que envolvem verificação de permissões ou contabilidade de ativos.
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. Devido a problemas na estratégia de otimização do compilador, em certas situações, pode remover incorretamente instruções de escrita na memória, levando a que o valor de retorno da função não corresponda ao esperado. Este bug relacionado à otimização é difícil de ser detectado através de uma simples revisão de código.
A vulnerabilidade afeta os compiladores da versão 0.5.8 até 0.8.16. Ao realizar a operação abi.encode em arrays do tipo calldata, o compilador limpa incorretamente certos dados, resultando na modificação de dados adjacentes, causando inconsistências nos dados após a codificação e decodificação. Este problema também pode ocorrer durante chamadas externas e eventos de emissão, uma vez que essas operações executam implicitamente abi.encode.
Com base na análise das vulnerabilidades do compilador Solidity, são apresentadas as seguintes recomendações de segurança:
Para os desenvolvedores:
Usar uma versão mais recente do compilador Solidity, problemas de segurança conhecidos geralmente são menos frequentes.
Melhorar os casos de teste unitário, aumentar a cobertura do código, ajuda a descobrir problemas causados pelo compilador.
Evite usar assembly inline, operações complexas de codificação e decodificação abi, e use novos recursos e funcionalidades experimentais com cautela.
Para o pessoal de segurança:
Considere os riscos de segurança que o compilador pode introduzir durante a auditoria.
No processo SDL, urge-se a atualização da versão do compilador, considerando a introdução de uma verificação automática de versão no CI/CD.
Avaliar o impacto real das vulnerabilidades do compilador com base nas circunstâncias específicas do projeto, evitando preocupações excessivas.
Alguns recursos úteis:
Aviso de segurança publicado oficialmente pela Solidity
Lista de bugs atualizada regularmente no repositório Solidity
Lista de bugs do compilador de várias versões, pode ser utilizada para verificação automática
Aviso de vulnerabilidade do compilador na página de código do contrato do Etherscan
Em suma, embora as vulnerabilidades do compilador Solidity não sejam comuns, podem ter consequências graves. Os desenvolvedores e profissionais de segurança devem manter-se alerta e tomar as medidas adequadas para reduzir os riscos.
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
20 gostos
Recompensa
20
5
Partilhar
Comentar
0/400
AltcoinAnalyst
· 07-21 10:23
Tenha cuidado, é um velho problema da versão 0.8.x.
Ver originalResponder0
MemecoinResearcher
· 07-21 10:12
rekt à espera de acontecer fr baseado na minha análise (p<0.01)
Ver originalResponder0
just_another_wallet
· 07-21 10:12
Jovens desenvolvedores, dêem uma olhada rapidamente!
Ver originalResponder0
FarmHopper
· 07-21 10:11
Caramba, essa falha parece assustadora!
Ver originalResponder0
YieldWhisperer
· 07-21 10:10
vi este mesmo padrão de exploração do compilador desde 2021... os desenvolvedores nunca aprendem smh
Análise de vulnerabilidades do compilador Solidity: riscos de segurança e formas de mitigação
Análise de vulnerabilidades do compilador Solidity e estratégias de resposta
O compilador é um dos componentes fundamentais dos sistemas de computação modernos, e a sua principal função é converter o código-fonte em linguagem de programação de alto nível em código de instruções executáveis pelo computador.
Embora a maioria dos desenvolvedores e profissionais de segurança esteja mais preocupada com a segurança do código do aplicativo, a segurança do próprio compilador não deve ser ignorada. Como programas de computador, os compiladores também podem ter vulnerabilidades de segurança, que em certos casos podem causar riscos de segurança graves. Por exemplo, ao compilar e executar código JavaScript no frontend, os navegadores podem, devido a vulnerabilidades do mecanismo de análise do JavaScript, permitir que usuários sejam alvos de ataques de execução remota de código ao acessar páginas da web maliciosas, resultando em um controle do navegador ou até mesmo do sistema operacional da vítima por parte do atacante.
O compilador Solidity não é exceção, existem vulnerabilidades de segurança em várias versões do compilador Solidity. O papel do compilador Solidity é converter o código de contrato inteligente em código de instrução da Máquina Virtual Ethereum (EVM), que será executado na EVM.
É importante notar que há uma diferença entre as vulnerabilidades do compilador Solidity e as vulnerabilidades da própria EVM. As vulnerabilidades da EVM referem-se a problemas de segurança que ocorrem durante a execução de instruções pela máquina virtual, que podem afetar toda a rede Ethereum. Por outro lado, as vulnerabilidades do compilador Solidity são problemas que surgem ao converter o código 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 consequências de uma vulnerabilidade no compilador Solidity é que pode levar a um código EVM gerado que não está em conformidade com as expectativas dos desenvolvedores de contratos inteligentes. Como os contratos inteligentes na Ethereum geralmente envolvem os ativos de criptomoeda dos usuários, qualquer bug causado pelo compilador pode resultar em perdas de ativos dos usuários, com consequências graves.
Os desenvolvedores e auditores de contratos muitas vezes estão mais focados na implementação lógica do código do contrato e em questões de segurança ao nível do Solidity, ignorando as vulnerabilidades do compilador. É difícil detectar vulnerabilidades do compilador apenas auditando o código-fonte do contrato; é necessário analisar em conjunto a versão específica do compilador e os padrões de código específicos.
Aqui estão alguns exemplos reais de vulnerabilidades do compilador Solidity:
A vulnerabilidade existe em versões antigas do compilador Solidity (>=0.1.6 <0.4.4). Em certas situações, o compilador não limpa corretamente os bytes mais significativos, levando a uma sobrecarga de inteiros onde o bit 1 mais significativo é gravado no armazenamento, sobrescrevendo os valores das variáveis adjacentes. Esse comportamento inconsistente com o esperado pode ter consequências graves em casos que envolvem verificação de permissões ou contabilidade de ativos.
A vulnerabilidade existe nas versões 0.8.13 a 0.8.15 do compilador. Devido a problemas na estratégia de otimização do compilador, em certas situações, pode remover incorretamente instruções de escrita na memória, levando a que o valor de retorno da função não corresponda ao esperado. Este bug relacionado à otimização é difícil de ser detectado através de uma simples revisão de código.
A vulnerabilidade afeta os compiladores da versão 0.5.8 até 0.8.16. Ao realizar a operação abi.encode em arrays do tipo calldata, o compilador limpa incorretamente certos dados, resultando na modificação de dados adjacentes, causando inconsistências nos dados após a codificação e decodificação. Este problema também pode ocorrer durante chamadas externas e eventos de emissão, uma vez que essas operações executam implicitamente abi.encode.
Com base na análise das vulnerabilidades do compilador Solidity, são apresentadas as seguintes recomendações de segurança:
Para os desenvolvedores:
Para o pessoal de segurança:
Alguns recursos úteis:
Em suma, embora as vulnerabilidades do compilador Solidity não sejam comuns, podem ter consequências graves. Os desenvolvedores e profissionais de segurança devem manter-se alerta e tomar as medidas adequadas para reduzir os riscos.