Skip to main content

Por que ferramentas de fuzzing devem fazer parte do seu kit de segurança

Escrito por

Kuria Macharia

28 de outubro de 2022

0 minutos de leitura

Fuzzing é uma técnica de teste de segurança de software que fornece automaticamente entradas inválidas e aleatórias a um aplicativo para revelar bugs. O objetivo é levar o aplicativo ao limite para provocar comportamentos inesperados, falhas ou vazamentos de recursos. Isso permite que nós, desenvolvedores, entendamos de forma mais abrangente o comportamento e as vulnerabilidades dos aplicativos. Usamos ferramentas de fuzzing, chamadas fuzzers, para realizar esse tipo de teste. Um fuzzer é um aplicativo que gera entradas aleatórias direcionadas ao software testado.

O termo fuzzing foi criado na década de 1980 pelo professor Barton Miller, enquanto investigava o que fazia seu sistema UNIX falhar. Ele pediu aos alunos que bombardeassem o sistema Unix com dados gerados automaticamente para entender melhor a causa da falha.

Como melhorar a segurança com ferramentas de fuzzing

Para entender como as ferramentas de fuzzing melhoram a segurança, vamos explorar os benefícios do fuzzing, discutir alguns casos de uso e analisar um exemplo de como ele funcionaria em um teste no mundo real.

Benefícios do fuzzing

O fuzzing oferece diversos benefícios, incluindo os listados abaixo:

  • Testar a segurança do nosso aplicativo com fuzzing desde o início ajuda a evitar exploits de dia zero, nos quais hackers se aproveitam de vulnerabilidades não identificadas. A abordagem multidimensional do fuzzing ajuda a identificar bugs que hackers podem explorar e que, de outra forma, seriam difíceis de detectar. Entre eles estão a falta de criptografia de dados, algoritmos com falhas e ausência de validação de entrada.

  • O custo em tempo e dinheiro é baixo, pois, depois de iniciado, o processo não exige intervenção humana.

  • Um fuzzer pode ajudar a identificar casos extremos que não seriam descobertos em testes manuais.

  • Além de identificar o problema, ele também gera um relatório detalhado de como um hacker poderia explorar uma vulnerabilidade.

Casos de uso do fuzzing

Você pode fazer testes de fuzzing em componentes individuais e separados de um aplicativo. Veja abaixo alguns casos de uso.

Fuzzing de aplicações web

O fuzzing de aplicações web revela bugs que podem deixar nossos aplicativos vulneráveis a ataques comuns, como injeção de SQL (https://learn.snyk.io/lessons/sql-injection/javascript/) e falsificação de solicitação entre sites (CSRF) (https://learn.snyk.io/lessons/csrf-attack/javascript/). Durante o fuzzing de aplicações web, o teste envia dados aleatórios aos endpoints, revelando bugs no aplicativo. Corrigir os bugs identificados melhora a postura de segurança do aplicativo. Por exemplo, o fuzzing pode ajudar você a identificar as páginas em que é preciso adicionar validação de entrada no front-end para aumentar a segurança do servidor.

Fuzzing de API

O fuzzing de API revela vulnerabilidades no acesso ao banco de dados. Entre elas estão a exposição de senhas e a falta de validação de parâmetros. O fuzzing de API permite controlar melhor a interação da API com os servidores de back-end. Por exemplo, podemos usá-lo para testar se uma API de pagamentos valida corretamente números de cartão de crédito e assinaturas de autorização.

Fuzzing de URL

Podemos usar o fuzzing de URL para descobrir arquivos e diretórios ocultos em um servidor web. Ele revela arquivos e diretórios que deveriam estar ocultos, mas estão acessíveis publicamente. Isso ajuda a proteger esses arquivos e diretórios no servidor web contra acessos não autorizados. O fuzzing de URL pode evitar a exposição de informações confidenciais, como credenciais de banco de dados e formatos de consulta, que um hacker poderia usar para criar solicitações falsificadas em um ataque CSRF.

Fuzzing de protocolos

O fuzzing de protocolos funciona enviando pacotes falsificados a um aplicativo para encontrar bugs na implementação. Por exemplo, se um fuzzer souber o tamanho de uma mensagem, poderá aumentá-lo para ver como o aplicativo lida com essa solicitação.

Fuzzing de formatos de arquivo

O fuzzing de formatos de arquivo é um processo simples e direto. Ele funciona alterando uma amostra de arquivo legítima e abrindo as versões modificadas no aplicativo-alvo para provocar uma falha. Esse tipo de fuzzing revela bugs que podem derrubar um sistema, destacando áreas em que podemos controlar melhor os tipos de arquivo que um aplicativo pode abrir. Isso aumenta a segurança e a estabilidade do aplicativo. A técnica pode evitar falhas em aplicativos que exigem o envio e a abertura de documentos digitalizados em formatos específicos, como JPEG, PNG e PDF.

Limitações das ferramentas de teste de fuzzing

Embora as ferramentas de teste de fuzzing sejam relativamente eficazes, elas têm algumas limitações:

  • Usar apenas ferramentas de teste de fuzzing não garante a segurança completa de um aplicativo.

  • Elas não são muito eficazes para detectar ameaças que não provoquem falhas no aplicativo.

  • Elas levam bastante tempo para concluir um teste.

  • Elas não conseguem identificar falhas e ameaças complexas.

Fuzzing versus scanners de vulnerabilidades da Snyk

O fuzzing é essencial para melhorar a postura de segurança de um aplicativo, mas não é totalmente eficaz por si só. Isso porque ele só consegue encontrar bugs associados aos endpoints do aplicativo.

Para testar um aplicativo com fuzzing, precisamos configurar o fuzzer e dar tempo suficiente para concluir o processo. Isso torna o desenvolvimento mais lento e aumenta o tempo necessário para lançar novos aplicativos no mercado.

No entanto, isso não basta no cenário atual de desenvolvimento e entrega contínuos (CI/CD). Você precisa monitorar as vulnerabilidades do aplicativo desde a etapa de escrita do código. A Snyk verifica continuamente se há vulnerabilidades no seu código, nas solicitações de pull do Git e nos contêineres. Você também pode adicioná-la a um pipeline de CI/CD para garantir a verificação contínua de vulnerabilidades durante todo o ciclo de vida do aplicativo.

Outro recurso dos scanners de vulnerabilidades da Snyk são as recomendações práticas de correção. Com elas, você pode corrigir algumas das implementações sinalizadas com apenas alguns cliques.

Um exemplo de fuzzing

Para entender como, quando e por que usaríamos fuzzing, vamos analisar o exemplo a seguir.

Digamos que acabamos de lançar um serviço online de entrega de refeições, disponível em HealthyTastyMeals.com. Durante o desenvolvimento, testamos cada recurso várias vezes e pedimos a amigos e colegas que experimentassem o aplicativo para avaliar a usabilidade.

No entanto, todos os testes que fizemos se concentraram em enviar solicitações e inserir valores no formato esperado. Então, como nos preparamos para o inesperado?

Se quisermos entender como nosso site se comportará diante de uma enxurrada de entradas inesperadas, precisamos testá-lo com fuzzing. Como nosso site usa APIs REST, podemos usar a ferramenta de fuzzing RESTler. Ela é uma ferramenta de código aberto para fuzzing de APIs REST.

Vamos executar o RESTler no modo “Fuzz”, pois temos poucos endpoints e é fácil de executar. O teste será executado em cada endpoint do nosso aplicativo web para encontrar bugs. Ele enviará aos endpoints diferentes combinações de parâmetros e sequências de solicitações.

Sempre que encontrar um bug, o RESTler exibirá no console uma visão geral do tipo de bug encontrado.

Entre as vulnerabilidades que nosso teste pode revelar estão as listadas abaixo.

Combinações inseguras de parâmetros

As APIs REST usam diferentes parâmetros, como URIs de solicitação, métodos de solicitação e parâmetros de consulta. Esses parâmetros podem ser combinados de várias maneiras, que precisam ser testadas para evitar estados incorretos no programa. O fuzzing pode ajudar a identificar combinações inseguras de parâmetros, que podemos corrigir validando todos os parâmetros de consulta e limitando os parâmetros necessários ao mínimo indispensável.

Parâmetros de consulta sem mecanismo de validação

A validação robusta de entradas no cliente e no servidor melhora a postura de segurança de um aplicativo. Uma ferramenta de fuzzing como o RESTler nos ajuda a identificar esse problema no aplicativo. Podemos corrigi-lo adicionando validação robusta de entradas no cliente e no servidor. A validação no cliente impede que dados inválidos sobrecarreguem o servidor. A validação no servidor garante que ele processe apenas solicitações válidas. Corrigir esse problema ajuda a reduzir o risco de um ataque de negação de serviço (DoS).

Senhas desprotegidas

O RESTler também sinaliza parâmetros de senha sem hash. Podemos resolver esse problema usando um algoritmo de hash. Entre os algoritmos disponíveis estão bcrypt e PBKDF2. Corrigir essa vulnerabilidade dificulta a invasão do sistema por hackers. Isso porque, mesmo que eles obtenham acesso ao sistema, ainda não conseguirão acessar as senhas.

Nossas 5 principais ferramentas de fuzzing

Há muitas ferramentas de fuzzing de código aberto disponíveis no mercado. Abaixo estão cinco ferramentas gratuitas e eficazes que podemos usar facilmente para aumentar a segurança dos nossos aplicativos.

1. OSS-Fuzz

OSS-Fuzz é uma ferramenta de fuzzing de código aberto desenvolvida pelo Google. Ela combina técnicas modernas de fuzzing com execução distribuída e escalável. O Google a criou para tornar os softwares de código aberto mais seguros e estáveis. O OSS-Fuzz funciona testando continuamente o programa-alvo com fuzzing.

2. ClusterFuzz

ClusterFuzz é uma infraestrutura de código aberto e escalável que revela vulnerabilidades de segurança e problemas de estabilidade. O Google a usa para detectar bugs no navegador Chrome. Ao contrário do OSS-Fuzz, o ClusterFuzz funciona com qualquer aplicativo, não apenas com os de código aberto. Ele é altamente escalável e pode ser executado em clusters de qualquer tamanho.

3. go-fuzz

go-fuzz é um fuzzer de código aberto para testar pacotes de Golang. Ele se concentra em pacotes com entradas complexas, que são alvos atraentes para agentes mal-intencionados. É uma ferramenta essencial para quem quer reforçar a segurança de programas Go que analisam entradas. Ao contrário dos dois fuzzers anteriores, o go-fuzz funciona apenas com pacotes Go.

4. Peach Fuzzer

Peach Fuzzer é uma ferramenta desenvolvida pela PeachTech, posteriormente adquirida pelo GitLab. Ela é altamente configurável e eficiente para quem precisa de testes personalizados. Ao contrário do go-fuzz, essa solução pode ser configurada para funcionar com qualquer linguagem. No entanto, a PeachTech não oferece mais suporte nem atualizações para essa ferramenta.

5. ffuf

ffuf é um fuzzer web gratuito e rápido, escrito em Go. É uma solução avançada para testar rigorosamente um aplicativo com solicitações POST e GET desconhecidas. Como desenvolvedores, interagimos com essa ferramenta pela linha de comando, pois ela não tem interface.

Seu kit de segurança

Fuzzing é uma técnica de teste de software que consiste em fornecer entradas aleatórias e inválidas a um aplicativo para revelar bugs. Diante de entradas inesperadas, ele ajuda a entender o comportamento de um aplicativo ou API. Há muitas ferramentas de fuzzing de código aberto disponíveis, criadas para cenários específicos de teste. Os fuzzers têm baixo custo em tempo e dinheiro; além de identificar problemas, eles também geram relatórios detalhados de como um hacker pode explorar uma vulnerabilidade.

Um teste de fuzzing bem executado pode melhorar a postura de segurança de um aplicativo ao revelar vulnerabilidades difíceis de detectar. O fuzzing pode ajudar a descobrir bugs, como falta de criptografia de dados, algoritmos com falhas e ausência de validação de entrada. Ele também pode identificar problemas que passariam despercebidos em testes manuais.

Os recursos de um fuzzer ajudam a evitar exploits de dia zero, nos quais hackers se aproveitam de vulnerabilidades não identificadas. Os resultados do fuzzing ajudam a reduzir riscos de ataques como CSRF, ataques de injeção e negação de serviço (DoS), entre outros.

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.