Fuzzing Solidity Smart Contracts with Echidna: Die Hard Level Tips
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?
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 .
Em vez de procurar travamentos como um fuzzer tradicional, o Echidna tentará quebrar as invariantes definidas pelo usuário.
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 EchidnaAbaixo 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





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)