Fuzzing Solidity Smart Contracts with Echidna: Die Hard Level Tips

Mar 21 2023
Saudações queridos leitores! O ensaio de hoje é o próximo de uma série que explora soluções criativas para os desafios que um auditor pode encontrar. Em nosso artigo anterior, descrevemos o Slither e como usá-lo; mas hoje gostaríamos de discutir o fuzzing e a ferramenta para isso, o Echidna.

Saudações queridos leitores! O ensaio de hoje é o próximo de uma série que explora soluções criativas para os desafios que um auditor pode encontrar. Em nosso artigo anterior, descrevemos o Slither e como usá-lo; mas hoje gostaríamos de discutir o fuzzing e a ferramenta para isso, o Echidna.

Em primeiro lugar, gostaríamos de expressar nossa sincera gratidão aos criadores desta ferramenta, a todos que a apoiam, aos autores de todos os materiais de recursos e, claro, aos auditores de nossa equipe que nos ajudaram revelando informações e levantamentos tão necessários a cortina do segredo. E hoje, queridos leitores, será disponibilizado para vocês.

Nesta série, focaremos apenas nos aspectos que podem ser realmente úteis para auditoria e hacking de bug bounty e que não são descritos em nenhum lugar! Podemos dizer com segurança que essas dicas podem ser lidas publicamente em alguns lugares, e nosso blog é um desses lugares!

Siga -nos agora, confira nosso artigo recente sobre Slither e vamos começar! A propósito, há algumas vagas agora, portanto, se o seu projeto precisar de uma auditoria - sinta-se à vontade para nos escrever , visite nossa página de relatórios públicos aqui .

I — Fuzzing: Iniciando

Vamos nos familiarizar com os fundamentos antes de passar para o material desafiador. O que é esse fuzzing e como ele pode ser usado por pesquisadores de segurança, hackers éticos e caçadores de recompensas de bugs?

researchgate.net/figure/Working-process-of-fuzzing_fig1_334986695

O teste fuzz, geralmente conhecido como fuzzing , é uma técnica de teste de software automatizada usada para identificar falhas de aplicativos, riscos de segurança e vulnerabilidades. Usando uma ferramenta fuzzing, o objetivo é introduzir entradas errôneas, impróprias ou inesperadas no aplicativo e rastrear como o sistema responde a elas (por exemplo, exceções, vazamento de informações ou travamentos do aplicativo).

Fuzzers para softwares tradicionais (como AFL ou LibFuzzer ) são conhecidos por serem ferramentas eficientes para encontrar bugs. Além da geração puramente aleatória de insumos, existem muitas técnicas e estratégias para gerar bons insumos, incluindo:

  • Obtenha feedback de cada execução e oriente a geração a usá-lo. Por exemplo, se uma entrada recém-gerada leva à descoberta de um novo caminho, faz sentido gerar novas entradas mais próximas a ela.
  • Gerar entrada em relação a uma restrição estrutural. Por exemplo, se sua entrada contiver um cabeçalho com uma soma de verificação, faz sentido deixar o fuzzer gerar uma entrada validando a soma de verificação.
  • Use entradas conhecidas para gerar novas entradas. Se você tiver acesso a um grande conjunto de dados de entradas válidas, seu fuzzer poderá gerar novas entradas a partir delas, em vez de começar do zero a cada geração. Estes são geralmente chamados de sementes .
  • tutorialspoint.com/software_testing_dictionary/fuzz_testing.htm

Em vez de procurar travamentos como um fuzzer tradicional, o Echidna tentará quebrar as invariantes definidas pelo usuário.

researchgate.net/publication/343048222_Echidna_functional_usable_and_fast_fuzzing_for_smart_contracts

Características de Equidna:

  • Gera entradas adaptadas ao seu código real.
  • Coleta opcional de corpus, mutação e orientação de cobertura para encontrar bugs mais profundos.
  • Desenvolvido por Slither para extrair informações úteis antes da campanha difusa.
  • Integração do código-fonte para identificar quais linhas são cobertas após a campanha de fuzzing.
  • IU retrô baseada em Curses, somente texto ou saída JSON.
  • Minimização automática de casos de teste para triagem rápida.
  • Integração perfeita no fluxo de trabalho de desenvolvimento, mas, de acordo com nossa experiência neste caso, a ferramenta pode se comportar de forma imprevisível e o sucesso não é garantido.
  • Relatório de uso máximo de gás da campanha fuzzing.

Nos contratos inteligentes, as invariantes são funções do Solidity , que podem representar qualquer estado incorreto ou inválido que o contrato possa atingir, incluindo:

  • Controle de acesso incorreto : o invasor tornou-se o proprietário do contrato.
  • Máquina de estado incorreta : os tokens podem ser transferidos enquanto o contrato está em pausa.
  • Aritmética incorreta : o usuário pode estourar seu saldo e obter tokens gratuitos ilimitados.
  • Em primeiro lugar, pode-se descrever um procedimento de inicialização com Truffle e Etheno e usá-lo como o estado base para Echidna.
  • Em segundo lugar, o Echidna pode entrar em qualquer contrato com um ABI conhecido passando na fonte de solidez correspondente no CLI.
  • Echidna suporta três drivers de saída diferentes. Existe o driver de texto padrão , um driver json e um driver nenhum , que deve suprimir toda a saída stdout.

As informações apresentadas a seguir são baseadas principalmente nos dados que obtivemos de nossas auditorias, alguns deles são detalhados o suficiente para você estudá-los e entender melhor a essência do nosso trabalho e a aplicação do fuzzing nele. Tenha em mente algumas declarações importantes. Eles serão úteis quando você iniciar o programa:

  • Slither é necessário para executar o Echidna corretamente.
  • A instalação é feita dependendo do sistema operacional usado (você pode escolher um sistema operacional específico para o seu trabalho).
  • Preste atenção na versão a ser instalada, instale sempre a versão mais recente (e não se esqueça de atualizar).
  • Compile o projeto de destino.
  • Executar Slither . Se não iniciar, faça alterações no projeto/resolva o problema de outra forma.
  • Lançar Equidna. Execute echidna sem nenhuma propriedade da seguinte maneira: «
    — echinda-test . — contrato de contrato — afirmação em modo de teste. »
  • Se não iniciar, modifique/atualize o equidna de acordo com as mensagens do terminal.
  • Crie um contrato de teste. Herde o contrato de destino, escreva uma propriedade básica simples e tente novamente.
  • Escreva uma propriedade completa e comece a difundir.

IV — Limitações e problemas conhecidos

Echidna tem algumas limitações na versão mais recente. Alguns deles são herdados do hevm , enquanto outros são resultados de decisões de design/desempenho ou simplesmente bugs no código.

Os problemas são listados a seguir:

  • As informações de depuração podem ser insuficientes.
  • O suporte do Vyper é limitado.
  • Suporte de biblioteca limitado para testes.
  • Se o contrato não estiver vinculado corretamente, o Echidna falhará.
  • Asserções não são detectadas em transações internas.
  • A geração de valor pode falhar no modo multi-abi, pois o hash da função não é preciso o suficiente.

Os seguintes problemas também podem ocorrer:

  • A asserção do modo de teste não funciona em contratos ^0.8 se a versão Echidna anterior a 2.0.0 estiver instalada.
  • Se o projeto usar bibliotecas, todas as funções nelas devem ser internas .
  • Slither luta com expressões ternárias, muitas vezes você terá que reescrevê-las como regular if .
  • Se o projeto não encontrar erro na propriedade simples, é necessário / revertido dentro do projeto. Tente reconfigurar o projeto para que exija passes.
  • O erro Echidna IllegalOverflow aparece quando você deseja limitar os parâmetros de custos de gás para chamadas de função no arquivo config.

V — Dicas Adicionais

O conselho acima é suficiente para você começar. Se você tiver algum problema, não hesite em nos perguntar nos comentários!

Se você deseja obter mais informações sobre os truques do Echidna, navegue neste repositório , assista a este vídeo e escolha um sistema operacional específico para o seu trabalho.

Examine todos os recursos listados - a maioria deles são verdadeiras joias e fornecem ótimas informações sobre como executar o Echidna com exemplos .

Use outros instrumentos também! Por exemplo, Mantictore ( mais informações ) — ou apenas veja esta seleção e separadamente esta ferramenta ultra-específica ( 2 ); há muitos deles.

Mais importante ainda, mesmo testes de unidade manuais admiravelmente bem feitos não encontram o tipo de bugs estranhos que os invasores estão procurando .

Auditoria automatizada parte 1 — fuzzing com Echidna

Abaixo você encontrará uma lista de recursos utilizados — eles contêm muitos bons manuais que o ajudarão no trabalho de seu auditor. Aproveito esta oportunidade para apresentar meus respeitos aos Autores!

Fontes:

  • blog.pessimistic.io/slither-an-auditors-cornucopia-a8793ea96e67
  • github.com/crytic/echidna
  • fuzzinglabs.com/fuzzing-ethereum-smart-contract-echidna
  • github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna
  • blog.finxter.com/ethereum-smart-contract-fuzz-testing-with-echidna
  • immunobytes.com/blog/effective-usable-and-fast-echidna-a-smart-contract-fuzzing-tool
  • github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial
  • blog.trailofbits.com/2020/08/17/using-echidna-to-test-a-smart-contract-library
  • researchgate.net/publication/343048222_Echidna_functional_usable_and_fast_fuzzing_for_smart_contracts
  • /coinmonks/smart-contract-fuzzing-d9b88e0b0a05
  • blog.trailofbits.com/2022/03/02/optimizing-a-smart-contract-fuzzer
  • 0xmacro.com/blog/fuzzing-with-echidna

Concluindo, gostaríamos de dizer que esperamos que este artigo tenha sido informativo e útil para você! Obrigado por ler!

A coisa mais importante que queríamos dizer e mostrar a você é que um novo instrumento não significa bom e um instrumento antigo não significa ruim. É saber usar e estar disposto a buscar algo novo. Esperamos que você tenha se interessado nisso!

Que instrumentos devemos rever? Sobre o que você estaria interessado em ler? Por favor, deixe seus comentários, ficaremos felizes em respondê-los, e as melhores respostas e perguntas podem ser incluídas no próximo artigo!

  • blog.pessimistic.io