WEB3DEV

Cover image for Proteja Seu Contrato Inteligente Com Diligence Fuzzing
Isabela Curado Nehme
Isabela Curado Nehme

Posted on

Proteja Seu Contrato Inteligente Com Diligence Fuzzing

Diligence Fuzzing!

https://cdn.hashnode.com/res/hashnode/image/upload/v1684492015685/61e6c7bb-8be9-4e82-bd05-4c01e92727ae.png?w=1600&h=840&fit=crop&crop=entropy&auto=compress,format&format=webp

À medida que o ecossistema Ethereum cresce, aumenta também a necessidade de contratos inteligentes seguros. Com bilhões de dólares bloqueados em protocolos DeFi e outras aplicações descentralizadas, os riscos são altos para os desenvolvedores garantirem que seu código esteja livre de vulnerabilidades. Auditorias manuais de contratos inteligentes são o padrão ouro, mas a demanda é alta e bons auditores são raros. Os resultados são longas listas de espera e preços que podem atingir rapidamente a faixa dos seis dígitos. Uma auditoria geralmente é realizada quando o projeto está quase concluído e a possível dívida de segurança já está acumulada.

Além disso, o olho humano não é perfeito e pode ainda deixar escapar bugs críticos; você precisa de mais do que auditorias antes do lançamento para proteger adequadamente seus fundos bloqueados. É aqui que as ferramentas de segurança entram em ação.

As melhores práticas de segurança defendem o uso de ferramentas de análise de segurança na fase inicial do processo de desenvolvimento. A abordagem “Shift Left” (ou deslocamento para a esquerda) tem como objetivo testar desde o início e evitar a acumulação sistemática de dívidas de segurança. Adicionar camadas de segurança pode reduzir significativamente o risco de acabar na tabela de classificação do Rekt (o que significa que o investidor perdeu tudo, arruinando seu patrimônio, naufragando).

Muitos projetos já aumentaram a conscientização sobre segurança e algumas ferramentas obrigatórias estão nos kits de ferramentas de desenvolvedores, auditores e caçadores de recompensas, como Mythril, Slither, VSCode com desenvolvedor visual do Solidity e Semgrep. Ainda assim, existe potencial para novas técnicas e ferramentas que facilitem a vida.

Fuzzing e o Poder do Exército de Macacos

Uma abordagem cada vez mais popular é o Fuzzing, pois oferece o poder do “exército de macacos” para lançar milhares de entradas aleatórias contra o seu código para provocar casos extremos que você nunca teria pensado em testar. Mais formalmente: fuzzing é uma técnica automatizada de detecção de bugs que envolve a injeção de milhões de pontos de dados não válidos, inesperados ou (semi) aleatórios para causar comportamento inesperado.

A abordagem mais básica é o fuzzing de Black Box (caixa preta), em que as entradas são criadas e alteradas aleatoriamente. Esse é o proverbial “exército de macacos”, como pensamos de forma preconceituosa. Mas todos sabemos que os nossos parentes próximos são mais inteligentes do que isso. Se ao menos pudéssemos ensinar-lhes a diferença entre uma entrada desinteressante e entradas que levam a uma maior cobertura da base de código. Ou se pudéssemos ensiná-los a memorizar um corpus de entradas interessantes e modificar o seguinte com base nisso? E se pudéssemos até ensiná-los a prever entradas que levam a outro caminho percorrido? Isso não tornaria o fuzzer muito mais preciso e cobriria mais código em menos tempo?

A velha narrativa:
❌ O projeto tem auditoria?

Não é bom o suficiente. Precisamos fazer pelo menos estas perguntas:

✅ Auditado?
✅ Testes Fuzz sem estado e com estado?
✅ Invariantes compreendidas?
✅ Documentação?
✅ Análise estática aprovada?

Opcional:
Verificado formalmente?

— Patrick Collins (@PatrickAlphaC) 2 de maio de 2023.

Insira o Fuzzing de Grey Box

Com técnicas como previsão de entrada, fuzzing guiado por cobertura, simulação de transações e muito mais, a equipe da Consensys Diligence, especialmente Valentin Wüstholz, expande os limites do fuzzing de Grey Box (caixa cinza) para aumentos de desempenho de tempos múltiplos, tornando-a uma das abordagens mais promissoras no cenário. Com o Harvey, o motor do fuzzing, o exército de macacos de repente fica excepcionalmente bem treinado e parece mais um esquadrão tático único do que um bando de brutos.

https://bafybeihy4pymztcfbbztfvzpdeavrgi5znywdisriwgymjgbw6c2eh2csm.ipfs.cf-ipfs.com/image2.png

Fuzzing Baseado em Propriedades

O fuzzing baseado em propriedades é outra abordagem que está se tornando cada vez mais popular. Isso envolve a definição de um conjunto de propriedades que um contrato inteligente deve manter e usar para gerar casos de teste. O fuzzing baseado em propriedades pode revelar uma gama mais ampla de vulnerabilidades, concentrando-se nas propriedades em vez de em entradas específicas. Para tornar a escrita de propriedades mais acessível, a equipe da ConsenSys Diligence criou o Scribble, uma ferramenta de verificação de tempo de execução e linguagem de especificação para escrever propriedades no Solidity. Com comentários simples embutidos, o Scribble estende automaticamente sua base de código com asserções e verificações que um fuzzer pode usar para encontrar inconsistências em suas propriedades. Em combinação com o fuzzing de caixa cinza, o Scribble se torna uma ferramenta poderosa que permite verificar bugs técnicos e explorar vulnerabilidades da lógica de negócios. É aqui que acontecem muitos hacks interessantes.

Existem alguns fuzzers de contrato inteligente muito populares no mercado, como o Echidna da Trail of Bits e o fuzzer Forge da Foundry, que utilizam fuzzing baseado em propriedades e fazem um ótimo trabalho na localização de muitos bugs. No entanto, nem todos os fuzzers são criados da mesma forma.

Diligence Fuzzing, Fuzzing Poderoso Agora Acessível Para Você

O Harvey, combinado com o Scribble, traz para você o Diligence Fuzzing, o mais poderoso serviço de fuzzing de contratos inteligentes.

Como não havia referências (benchmarks) padronizadas para fuzzers de contratos inteligentes no mercado, arriscamos e construímos uma. Apresentamos o Daedaluzz, um framework de benchmarking para comparar o maior número possível de fuzzers, apesar de suas diferentes abordagens. Leia a postagem completa do blog para obter informações sobre a configuração do teste e as especificações do sistema.

Qual fuzzer de contrato inteligente os desenvolvedores devem usar? Seria ótimo ter referências para comparar facilmente diferentes ferramentas! Acabamos de lançar o Daedaluzz (https://t.co/pJXyP7SyOF), uma ferramenta de código aberto que gera automaticamente referências desafiantes para muitos fuzzers. [1/3]

— Valentin Wüstholz (@vwuestholz) 19 de abril de 2023.

Durante uma execução de fuzz de 4 horas (também conhecida como campanha de fuzzing), o Harvey detectou 28% mais violações do que o fuzzer Forge da Foundry e 52% mais do que o Echidna da Trail of Bits. Quando comparado ao fuzzer da Foundry, é notável que o Harvey supera o número de violações encontradas em apenas 15 minutos. Isso nos permite acreditar que você vai se divertir muito com o Harvey.

Comece em 3 Etapas

Melhorar a postura de segurança do seu contrato inteligente requer apenas três etapas.

Etapa 1: definir as especificações do Scribble

Adicione as propriedades do Scribble sobre como seu contrato inteligente deve funcionar. O Scribble cria automaticamente afirmações em seu código que o Harvey usará para verificar inconsistências. O Harvey também é executado nos seus testes! Você só precisa implantar seu sistema e escrever uma ou mais propriedades do Scribble. Se você tiver testes da Foundry, poderá até pular as propriedades do Scribble para começar.

Etapa 2: enviar seu código

Envie seu código para a plataforma Fuzzing para iniciar sua primeira campanha. O Harvey analisará sistemas complexos de vários contratos inteligentes para detectar violações de suas propriedades personalizadas.

Etapa 3: receber os resultados

Receba os resultados da campanha por meio do painel de relatórios do Fuzzing e corrija as violações em seu código.

Não acredite apenas na nossa palavra. Convença-se.

Equipe do Diligence.

Este artigo foi escrito por Tobias Vogel e traduzido por Isabela Curado Nehme. Seu original pode ser lido aqui.

Top comments (0)