Tutorial de teste Fuzz (Fuzzing)
โก Resumo Inteligente
O teste de fuzzing alimenta um programa com dados invรกlidos, inesperados ou aleatรณrios e monitora falhas, travamentos e erros de memรณria, expondo defeitos de seguranรงa que testes funcionais automatizados quase nunca detectam por conta prรณpria.
O que รฉ teste Fuzz?
Teste de Fuzzing ou Fuzzing Fuzzing รฉ uma tรฉcnica de teste de software que consiste em inserir dados invรกlidos ou aleatรณrios, chamados de FUZZ, em um sistema de software para descobrir erros de codificaรงรฃo e falhas de seguranรงa. O objetivo do fuzzing รฉ inserir dados usando tรฉcnicas automatizadas ou semiautomatizadas e testar o sistema em busca de vรกrias exceรงรตes, como travamentos do sistema ou falhas no cรณdigo interno.
O teste de fuzzing foi originalmente desenvolvido por Barton Miller na Universidade de Wisconsin-Madison, que cunhou o termo depois que o ruรญdo na linha de um modem causou a falha dos programas que ele estava usando. Seus alunos executaram os primeiros fuzzers em 1989 e descobriram que aproximadamente um terรงo dos utilitรกrios UNIX que eles testaram travavam ou congelavam. O teste de fuzzing รฉ uma ferramenta para testar a compatibilidade entre software e tecnologia. teste de software tรฉcnica, e รฉ um tipo de Teste de Seguranรงa.
O diagrama abaixo mostra o ciclo bรกsico de fuzzing, onde os dados gerados sรฃo enviados para a aplicaรงรฃo em teste e a resposta รฉ observada.
Por que fazer testes Fuzz?
O fuzzing conquista seu espaรงo em um plano de testes porque explora entradas para as quais ninguรฉm pensou em escrever um caso de teste. Os principais motivos pelos quais as equipes o adotam estรฃo listados abaixo.
- Os testes de fuzzing geralmente encontram as falhas e defeitos de seguranรงa mais graves, pois uma falha รฉ uma evidรชncia direta de um caminho de entrada nรฃo tratado.
- O teste de fuzzing oferece um resultado mais eficaz quando usado com Preto Box Testes, testes beta e outros mรฉtodos de depuraรงรฃo.
- O teste de fuzzing รฉ usado para verificar a vulnerabilidade de softwares e รฉ uma tรฉcnica de teste muito econรดmica, pois as entradas sรฃo geradas em vez de escritas manualmente.
- O teste de fuzzing รฉ uma das tรฉcnicas de teste de caixa preta. O fuzzing tambรฉm รฉ um dos mรฉtodos mais comuns usados โโpor hackers para encontrar vulnerabilidades em um sistema, portanto, executรก-lo primeiro elimina a rota de acesso mais fรกcil para um atacante.
Tipos de Testes de Fuzzing
Os fuzzers geralmente sรฃo agrupados de acordo com o quanto eles sabem sobre o programa que estรฃo atacando. Quanto mais o fuzzer souber, mais profundamente ele poderรก penetrar no cรณdigo.
| Formato | O que o fuzzer sabe | Uso tรญpico |
| desfoque de caixa preta | Nada sobre os componentes internos; ele apenas vรช entradas e saรญdas. | Execuรงรตes rรกpidas de testes de fumaรงa em um endpoint binรกrio ou em um endpoint ativo. |
| desfoque de caixa branca | Cรณdigo-fonte completo, frequentemente combinado com execuรงรฃo simbรณlica para resolver ramificaรงรตes de difรญcil acesso. | Anรกlise aprofundada de um componente cuja fonte estรก disponรญvel. |
| desfoque de caixa cinza | Sem revisรฃo do cรณdigo-fonte, mas com feedback em tempo de execuรงรฃo, como por exemplo, quais ramificaรงรตes de cรณdigo uma entrada alcanรงou. | O padrรฃo para mecanismos modernos como AFL++ e libFuzzer. |
Uma segunda divisรฃo, mais antiga, separa distorรงรฃo burra da fuzzing inteligenteUm fuzzer burro inverte bits sem qualquer noรงรฃo do formato de entrada, portanto, a maior parte dos seus dados รฉ rejeitada pelo primeiro analisador sintรกtico que encontra. Um fuzzer inteligente entende checksums, campos de comprimento e estrutura da mensagem, de modo que suas entradas sobrevivem ร validaรงรฃo e chegam ร lรณgica subjacente. Fuzzing guiado por cobertura ร o refinamento da caixa cinza que tornou o fuzzing popular: o mecanismo instrumenta o binรกrio, mantรฉm qualquer entrada que alcance um novo ramo e modifica os sobreviventes, de modo que o conjunto de dados evolua constantemente em direรงรฃo a um cรณdigo inexplorado, em vez de recomeรงar a partir de ruรญdo aleatรณrio.
Como fazer testes Fuzz
As etapas para o teste de fuzzing incluem as etapas bรกsicas de teste:
Etapa 1) Identifique o sistema de destino โ escolha o endpoint binรกrio, biblioteca, serviรงo ou protocolo que serรก atacado e confirme que vocรช tem permissรฃo para testรก-lo.
Etapa 2) Identificar entradas โ listar todos os pontos de entrada dos quais o alvo lรช: arquivos, argumentos de linha de comando, variรกveis โโde ambiente, pacotes de rede, campos de formulรกrio e payloads de API.
Etapa 3) Gerar dados difusos โ produzir entradas malformadas atravรฉs da mutaรงรฃo de amostras vรกlidas, da geraรงรฃo delas a partir de um modelo do formato ou da combinaรงรฃo de ambos.
Etapa 4) Execute o teste usando dados fuzzy โ execute o alvo em relaรงรฃo ร s entradas geradas, idealmente em um loop que reinicie o processo automaticamente apรณs cada falha.
Etapa 5) Monitore o comportamento do sistema โ fique atento a travamentos, congelamentos, falhas de asserรงรฃo, uso descontrolado de memรณria e relatรณrios de sanitizaรงรฃo, em vez de verificar apenas a saรญda impressa.
Etapa 6) Registrar defeitos โ Salve a entrada exata que desencadeou cada falha, reduza-a ao menor caso reproduzรญvel e arquive-a junto com a pilha de chamadas. trace anexado.
Exemplos de Fuzzers
Os fuzzers tambรฉm sรฃo classificados pela forma como constroem sua entrada, e as trรชs abordagens abaixo sรฃo as que vocรช encontrarรก com mais frequรชncia.
- Fuzzers baseados em mutaรงรฃo Alterar amostras de dados existentes para criar novos dados de teste. Esta รฉ uma abordagem muito simples e direta: comeรงa com amostras vรกlidas de um protocolo e continua a manipular cada byte ou arquivo.
- Fuzzers baseados em geraรงรฃo Eles definem novos dados com base na entrada do modelo. Em seguida, comeรงam a gerar entradas do zero, com base na especificaรงรฃo.
- Fuzzers baseados em protocolo Dependem de um conhecimento detalhado do formato do protocolo que estรก sendo testado, e esse conhecimento vem da especificaรงรฃo. Envolve escrever uma matriz da especificaรงรฃo na ferramenta e, em seguida, usar uma tรฉcnica de geraรงรฃo de testes baseada em modelo para percorrer a especificaรงรฃo e adicionar irregularidades no conteรบdo dos dados, na sequรชncia e assim por diante. Isso tambรฉm รฉ conhecido como teste de sintaxe, teste de gramรกtica ou teste de robustez. Um fuzzer pode gerar casos de teste a partir de um existente ou pode usar entradas vรกlidas ou invรกlidas.
Existem duas limitaรงรตes da difusรฃo baseada em protocolo:
- O teste nรฃo pode prosseguir atรฉ que a especificaรงรฃo esteja madura.
- Muitos protocolos รบteis sรฃo uma extensรฃo de protocolos publicados. Se o teste fuzz for baseado em especificaรงรตes publicadas, Cobertura de teste para novos protocolos serรก limitado.
A forma mais simples de tรฉcnica de fuzzing consiste em enviar entradas aleatรณrias para o software, seja como pacotes de protocolo ou como um evento. Essa tรฉcnica de envio de entradas aleatรณrias รฉ muito poderosa para encontrar bugs em diversos aplicativos e serviรงos. Outras tรฉcnicas tambรฉm estรฃo disponรญveis e sรฃo muito fรกceis de implementar. Para implementรก-las, basta alterar as entradas existentes, o que pode ser feito simplesmente trocando seus bits.
Tipos de bugs detectados pelo Fuzz Testing
Como o fuzzing avalia uma execuรงรฃo com base em como o programa se comporta, em vez de um valor esperado, os defeitos que ele revela se agrupam em trรชs famรญlias.
- Falhas de asserรงรฃo e vazamentos de memรณria: Essa metodologia รฉ amplamente utilizada em grandes aplicaรงรตes onde os bugs afetam a seguranรงa da memรณria, o que representa uma vulnerabilidade grave. Buffer Overflows, uso apรณs liberaรงรฃo e leituras fora dos limites aparecem aqui.
- Entrada invรกlida: Em testes de fuzzing, os fuzzers sรฃo usados โโpara gerar entradas invรกlidas, que sรฃo utilizadas para testar rotinas de tratamento de erros. Isso รฉ importante para softwares que nรฃo controlam suas entradas. O fuzzing simples pode ser visto como uma forma de automatizar... teste negativo.
- Erros de correรงรฃo: O fuzzing tambรฉm pode ser usado para detectar alguns tipos de bugs de "correรงรฃo", como um banco de dados corrompido ou resultados de pesquisa ruins. O fuzzing diferencial, que alimenta a mesma entrada para duas implementaรงรตes e compara as respostas, รฉ a maneira usual de detectar esses bugs.
Ferramentas de teste Fuzz
Ferramentas utilizadas em seguranรงa web podem ser amplamente usadas em testes de fuzzing, tais como: Burp Suite e Peach Fuzzer. Vรกrios dos nomes clรกssicos abaixo agora estรฃo arquivados, portanto, seu status atual รฉ indicado ao lado de cada entrada.
- Fuzzer de pรชssegoO Peach Fuzzer oferece uma cobertura de seguranรงa mais robusta do que um scanner. Outras ferramentas de teste sรณ conseguem procurar ameaรงas conhecidas, enquanto o Peach Fuzzer permite que os usuรกrios encontrem ameaรงas conhecidas e desconhecidas. A Peach Tech foi adquirida pela GitLab e a Community Edition v3 nรฃo recebe mais manutenรงรฃo; a versรฃo sucessora com manutenรงรฃo รฉ a [nome da versรฃo com manutenรงรฃo]. GitLab Protocol Fuzzer Community Edition.
- Proxy de picoSPIKE Proxy รฉ uma ferramenta de nรญvel profissional que busca vulnerabilidades em aplicaรงรตes web. Ele abrange os recursos bรกsicos, como: SQL Injeรงรฃo e cross-site scripting em um ambiente completamente aberto. Python infraestrutura, e estava disponรญvel para Linux e WindowsNรฃo recebe manutenรงรฃo hรก muitos anos e estรก incluรญdo aqui para fins de contexto histรณrico.
- Escaravelho WebO WebScarab foi escrito em Java e, portanto, รฉ portรกtil para diversas plataformas. O framework WebScarab se comunica usando os protocolos HTTP e HTTPS e funciona como um proxy interceptador: ele permite que o operador revise e modifique as requisiรงรตes criadas pelo navegador antes que o servidor as receba, e revise e atualize as respostas geradas pelo servidor antes que o navegador as receba. Qualquer vulnerabilidade encontrada pelo WebScarab รฉ adicionada ร sua lista de problemas relatados. O repositรณrio foi arquivado em abril de 2024 e agora รฉ somente leitura.
- OWASP WSFuzerWSFuzzer รฉ um programa licenciado sob a GPL, escrito em Python que tinha como alvo serviรงos web e, em sua รบltima versรฃo, era baseado em HTTP. Serviรงos SOAP eram o principal alvo. Foi lanรงado como parte do WebScarab e descontinuado juntamente com ele; OWASP ZAP e seu complemento Fuzzer sรฃo os substitutos recomendados.
- Alternativas mantidas: AFL++ e libFuzzer sรฃo os mecanismos padrรฃo guiados por cobertura para cรณdigo nativo, OSS Fuzz executa-os continuamente e gratuitamente para projetos de cรณdigo aberto, e boofuzz aborda a anรกlise de fuzzing de protocolos de rede em PythonUma lista mais completa estรก compilada no guia para ferramentas de teste de seguranรงa.
Melhores prรกticas para testes de fuzzing
Um fuzzer apontado para um alvo e deixado em execuรงรฃo raramente encontra muita coisa. As prรกticas abaixo diferenciam uma campanha que produz defeitos registrados de uma que apenas consome tempo de CPU.
- Comece com um bom conjunto de sementes. Colete entradas reais e vรกlidas que o aplicativo jรก aceite. Modificar um arquivo genuรญno permite que o cรณdigo de anรกlise seja executado muito mais rapidamente do que modificar bytes aleatรณrios.
- Crie um chicote de fios pequeno e rรกpido. O ponto de entrada deve executar uma รบnica aรงรฃo por vez, evitar chamadas de rede e gravaรงรตes em disco, e retornar rapidamente, pois a taxa de transferรชncia รฉ medida em execuรงรตes por segundo.
- Ligue os desinfetantes. A corrupรงรฃo silenciosa de memรณria geralmente nรฃo causa travamentos. AddressSanitizer e UndefinedBehaviorSanitizer a convertem em uma falha imediata e diagnosticรกvel.
- Corra por muito tempo e corra continuamente. Uma execuรงรฃo de uma ou duas horas detecta bugs superficiais; caminhos mais complexos geralmente exigem muitas horas, e รฉ por isso que o fuzzing deve ser realizado em uma tarefa de CI noturna, em vez de uma sessรฃo manual.
- Minimize e elimine duplicatas de cada falha. Reduza a entrada com falha ร sua menor forma e agrupe as falhas por pilha. tracCaso contrรกrio, um รบnico bug pode se transformar em centenas de chamados.
- Mantenha um corpus de regressรฃo. Adicione cada entrada que reproduz o problema a um conjunto permanente que รฉ executado em todas as compilaรงรตes, para que um defeito corrigido nรฃo possa retornar silenciosamente.
- Defina o alvo legalmente. Realizar testes de compatibilidade (fuzzing) em um serviรงo de terceiros em produรงรฃo sem autorizaรงรฃo por escrito รฉ indistinguรญvel de um ataque.
Vantagens do teste Fuzz
Utilizado com expectativas realistas, o fuzzing agrega valor que outras tรฉcnicas tรชm dificuldade em igualar.
- O teste de fuzzing melhora os testes de seguranรงa de software.
- Os bugs encontrados em testes de fuzzing ร s vezes sรฃo graves e frequentemente sรฃo os mesmos usados โโpor atacantes, incluindo travamentos, vazamentos de memรณria e exceรงรตes nรฃo tratadas.
- Se algum bug nรฃo for detectado pelos testadores devido a limitaรงรตes de tempo e recursos, esse bug tambรฉm serรก encontrado nos testes de fuzzing.
- Os dados de entrada sรฃo gerados por uma mรกquina, portanto a cobertura continua a crescer durante a noite sem esforรงo manual adicional.
Desvantagens do teste Fuzz
As mesmas propriedades que tornam o fuzzing barato tambรฉm limitam o que ele pode provar.
- Os testes de fuzzing, por si sรณ, nรฃo conseguem fornecer uma visรฃo completa de uma ameaรงa de seguranรงa geral ou de um conjunto de bugs.
- Os testes de fuzzing sรฃo menos eficazes no combate a ameaรงas de seguranรงa que nรฃo causam falhas no programa, como alguns vรญrus, worms e cavalos de Troia.
- O teste de fuzzing sรณ consegue detectar falhas ou ameaรงas relativamente simples e nรฃo leva em consideraรงรฃo a lรณgica de negรณcios.
- Para funcionar eficazmente, requer um tempo de mรกquina significativo.
- Definir uma condiรงรฃo de valor limite com entradas aleatรณrias รฉ muito problemรกtico, embora os testadores agora resolvam grande parte disso com algoritmos determinรญsticos orientados por entradas do usuรกrio.
Teste de Fuzzing vs. Teste de Penetraรงรฃo
Ambas as atividades procuram falhas de seguranรงa, mas respondem a perguntas diferentes e raramente sรฃo intercambiรกveis.
| Critรฉrios | Teste Fuzz | Teste de Penetraรงรฃo |
| Conduzido por | Um mecanismo automatizado que gera entrada malformada | Um testador habilidoso raciocinando sobre o sistema. |
| Procura por | Travamentos, congelamentos e falhas de seguranรงa de memรณria. | Vulnerabilidades explorรกveis, incluindo falhas de lรณgica e configuraรงรฃo. |
| Profundidade | Ampla cobertura de entrada, raciocรญnio superficial. | Cobertura restrita, raciocรญnio profundo |
| saรญda | Reproduzindo entradas e pilha traces | Um relatรณrio de descobertas com caminhos de exploraรงรฃo e classificaรงรตes de risco. |
| Melhor momento | Continuamente, no pipeline de construรงรฃo | Periodicamente, contra uma versรฃo candidata a lanรงamento |
Na prรกtica, os dois se retroalimentam: o fuzzing elimina as falhas baratas e automatizรกveis, permitindo que as horas limitadas de um testador sejam dedicadas ร s falhas que apenas um humano detectarรก.

