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.

  • ๐Ÿ”˜ Origem: Barton Miller cunhou o termo na Universidade de Wisconsin-Madison, e as primeiras execuรงรตes de fuzzing em 1989 causaram a falha de aproximadamente um terรงo dos utilitรกrios UNIX testados.
  • โ˜‘๏ธ Loop de seis etapas: Identifique o alvo, identifique as entradas, gere dados fuzzificados, execute, monitore o comportamento e, em seguida, registre cada defeito que aparecer.
  • โœ… Trรชs estratรฉgias de geraรงรฃo: Os fuzzers de mutaรงรฃo alteram amostras vรกlidas, os fuzzers de geraรงรฃo constroem entradas a partir de um modelo e os fuzzers de protocolo funcionam a partir de uma especificaรงรฃo.
  • ๐Ÿงช O feedback da cobertura alterou o cenรกrio: Os mecanismos de busca modernos armazenam qualquer entrada que chegue ao novo cรณdigo, o que permite encontrar erros muito mais complexos do que dados puramente aleatรณrios.
  • ๐Ÿ› ๏ธ As ferramentas evoluรญram: Peach Fuzzer e WebScarab estรฃo arquivados, enquanto AFL++, libFuzzer, OSS-Fuzz, boofuzz โ€‹โ€‹e OWASP ZAP sรฃo as opรงรตes que recebem manutenรงรฃo.
  • โš™๏ธ Limites conhecidos: O fuzzing encontra falhas, nรฃo problemas de lรณgica, portanto complementa, em vez de substituir, a revisรฃo de cรณdigo e os testes de penetraรงรฃo.

Tutorial de teste Fuzz (Fuzzing)

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.

Fluxo de trabalho de teste de fuzzing: um fuzzer gera entradas malformadas e as envia para a aplicaรงรฃo em teste.

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:

  1. O teste nรฃo pode prosseguir atรฉ que a especificaรงรฃo esteja madura.
  2. 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รก.

Perguntas Frequentes

Um corpus inicial รฉ o conjunto inicial de entradas vรกlidas que o fuzzer modifica. Arquivos pequenos, variados e reais funcionam melhor, porque cada um deles jรก passa pelo analisador sintรกtico, permitindo que o mecanismo gaste seu orรงamento em cรณdigo mais complexo em vez da primeira verificaรงรฃo de validade.

Um "fusz harness" รฉ uma pequena funรงรฃo que entrega um buffer de bytes fuzzificados ao cรณdigo em teste. Ele deve evitar alteraรงรตes no estado global, escritas em arquivos e chamadas de rede, para que o mecanismo possa executรก-lo milhares de vezes por segundo.

Uma ou duas horas expรตem falhas superficiais. Campanhas sรฉrias duram muitas horas ou dias, porque a cobertura aumenta gradualmente. Um platรด na curva de cobertura, e nรฃo a leitura do relรณgio, รฉ o sinal honesto de que uma campanha parou de dar resultados.

O AddressSanitizer detecta estouros de buffer e uso apรณs liberaรงรฃo (use-after-free), o UndefinedBehaviorSanitizer detecta uso indevido de inteiros e ponteiros, e o MemorySanitizer detecta leituras de memรณria nรฃo inicializada. Sem eles, muitas corrupรงรตes passam silenciosamente e o fuzzer nรฃo reporta nenhuma falha.

Reproduza o problema, minimize a entrada para o menor caso de falha possรญvel e agrupe-o com falhas que compartilham a mesma pilha de erros. trace, em seguida, abra um chamado pelo mรฉtodo usual. processo de gerenciamento de defeitos e adicione a entrada a um corpus de regressรฃo.

Compartilham a aleatoriedade, mas nรฃo a intenรงรฃo. Teste com macacos O fuzzing lanรงa aรงรตes arbitrรกrias do usuรกrio em uma interface em execuรงรฃo, enquanto o fuzzing tem como alvo um analisador de entrada especรญfico e mede a cobertura de cรณdigo, podendo assim se direcionar para trechos de cรณdigo que as entradas anteriores nunca alcanรงaram.

Os modelos de linguagem estรฃo sendo usados โ€‹โ€‹para elaborar estruturas para APIs nรฃo fuzzificadas, sintetizar entradas iniciais para formatos exรณticos e agrupar e resumir relatรณrios de falhas. O mecanismo ainda fornece o feedback de cobertura; o modelo elimina principalmente o trabalho de configuraรงรฃo manual.

Copiloto do GitHub ร‰ possรญvel criar um ponto de entrada para o libFuzzer, um arquivo de compilaรงรฃo e um gerador de sementes a partir de uma assinatura de API existente. RevAnalise o resultado com atenรงรฃo, pois um sistema que ignora erros silenciosamente nรฃo reportarรก nenhuma falha.

Resuma esta postagem com: