Simple Science

Ciência de ponta explicada de forma simples

# Informática# Engenharia de software

Aprimorando Técnicas de Fuzzing com LLMs

Esse artigo fala sobre um novo método pra criar programas de fuzzing eficazes usando LLMs.

― 8 min ler


LLMs Potencializam TestesLLMs Potencializam Testesde Fuzzsoftware usando LLMs.Uma nova abordagem para testes de
Índice

Modelos de Linguagem Grande (LLMs) viraram uma ferramenta muito importante pra várias tarefas, incluindo programação. Mas, quando se trata de Bibliotecas de Deep Learning, podem rolar bugs que afetam não só as bibliotecas em si, mas também qualquer aplicativo construído em cima delas. É super importante manter a qualidade dessas bibliotecas, já que elas são usadas em áreas críticas como saúde e finanças.

Um jeito comum de encontrar bugs em software se chama Fuzzing. Esse método gera entradas aleatórias pra testar o software e procurar erros. No caso das bibliotecas de deep learning, criar programas de entrada válidos é um desafio. Esses programas precisam seguir regras específicas relacionadas à linguagem de programação e aos tipos de cálculos que estão sendo feitos.

Pesquisas recentes sugerem que LLMs podem ajudar a gerar esses programas de entrada. Eles foram treinados com uma quantidade enorme de código e dados, o que dá a eles a capacidade de entender a sintaxe e a semântica das linguagens de programação. Mas, mesmo assim, os LLMs costumam criar programas que seguem padrões comuns, parecidos com os que viram nos dados de treinamento, que podem não ser eficazes pra fuzzing.

A Necessidade de Testes de Casos Limite

Fuzzing é mais eficaz quando consegue gerar entradas incomuns ou raras. Esses casos limite podem revelar bugs que entradas comuns não mostrariam. Os métodos existentes usando LLMs nem sempre priorizam casos limite, se prendendo a padrões de código mais comuns. Por isso, uma nova abordagem é necessária pra usar LLMs pra gerar programas que possam efetivamente fuzzar bibliotecas de deep learning.

Esse artigo apresenta uma técnica que orienta os LLMs a criar programas de entrada que focam em casos limite pra fuzzing. A base dessa técnica é a ideia de que programas históricos que causaram bugs podem fornecer segmentos de código úteis que podem ajudar a descobrir novos bugs.

Abordagens Atuais de Fuzzing

Historicamente, as técnicas de fuzzing podem ser classificadas em duas categorias principais: fuzzing em nível de modelo e fuzzing em nível de API. O fuzzing em nível de modelo funciona reutilizando modelos existentes ou criando novos do zero, mas muitas vezes tem dificuldade em atender às complexas exigências das APIs de deep learning. Já o fuzzing em nível de API se concentra em APIs individuais, o que pode limitar a capacidade de encontrar bugs que surgem da interação de múltiplas APIs.

Ambos os métodos têm suas limitações, levando os pesquisadores a explorar alternativas que aproveitam as capacidades dos LLMs. A grande sacada é que esses modelos são treinados com um grande volume de código, o que os torna capazes de produzir programas de entrada válidos. Mesmo assim, a tendência deles de gerar código que segue padrões típicos pode limitar a eficácia em identificar bugs.

Nossa Técnica Proposta

A técnica proposta visa equipar os LLMs a gerar programas de entrada que focam em casos limite pra fuzzing eficaz. Essa abordagem é baseada na ideia de que programas históricos que causaram bugs contêm ingredientes valiosos pra descobrir bugs. Estudos anteriores mostraram que usar informações históricas pode ajudar a gerar casos de teste eficazes, mas os métodos tradicionais requerem um esforço manual extenso.

Nossa abordagem automatiza esse processo utilizando LLMs, que podem aprender com os programas históricos que causaram bugs e produzir novos exemplos que são semelhantes. Isso elimina a necessidade de anotações manuais intensivas de trechos de código e permite a geração de casos de teste mais diversos e úteis.

Construção do Conjunto de Dados

Pra implementar a técnica, começamos criando um conjunto de dados de trechos de código que causam bugs. Isso pode ser feito minerando relatórios de bugs de repositórios de código aberto relacionados a bibliotecas de deep learning. O conjunto de dados inclui duas partes críticas: o código que causa o bug e a API problemática correspondente.

Mineração da História de Bugs

Pra juntar os dados necessários, usamos um web crawler pra coletar problemas e pull requests do GitHub. Procuramos trechos de código dentro desses relatórios que ilustram os bugs. Esses trechos são fundamentais pra treinar os LLMs a replicar os padrões de código associados a bugs passados.

Muitas vezes, determinar a API problemática exata a partir do trecho de código não é claro. Pra resolver isso, implementamos um processo de rotulação automatizado que usa LLMs pra anotar os trechos de código com a API problemática correspondente. Isso minimiza as anotações necessárias de especialistas humanos e permite uma abordagem mais escalável.

Estratégias de Aprendizado

Uma vez que temos nosso conjunto de dados, podemos focar em gerar programas de entrada usando diferentes estratégias de aprendizado. Consideramos dois métodos principais: aprendizado em contexto e fine-tuning.

Aprendizado em Contexto

O aprendizado em contexto envolve fornecer aos LLMs exemplos de código que causam bugs, seja através de aprendizado com poucos exemplos ou fornecendo programas parciais que causam bugs. Isso permite que o modelo aprenda a gerar novos trechos de código que podem invocar bugs similares.

A ideia é apresentar ao LLM exemplos relevantes e deixar ele prever novos segmentos de código baseados no que aprendeu. Ao elaborar cuidadosamente os prompts de entrada, guiamos o LLM a entender os padrões associados a bugs e usar esse conhecimento pra criar novo código que pode ser problemático.

Fine-Tuning

Além do aprendizado em contexto, podemos fazer o fine-tuning do LLM no conjunto de dados de trechos de código que causam bugs. O fine-tuning ajusta os pesos do modelo com base nos exemplos específicos do nosso conjunto de dados, tornando-o mais apto a gerar trechos de código que refletem bugs históricos.

Ao treinar o modelo em um conjunto de dados que inclui vários padrões que causam bugs, melhoramos sua capacidade de gerar novos programas que mantenham os traços necessários pra um fuzzing eficaz. Esse método pode melhorar significativamente o desempenho do modelo em identificar bugs.

Avaliação da Técnica

Avaliamos a eficácia da técnica proposta aplicando-a a duas bibliotecas populares de deep learning e comparando os resultados com fuzzers existentes.

Detecção de Bugs

Uma das métricas principais pra avaliar a eficácia é o número de bugs únicos detectados através do fuzzing. A capacidade da nossa técnica de gerar entradas de casos limites pode levar à identificação de novos bugs que poderiam passar despercebidos por métodos tradicionais. Usamos múltiplos métodos de verificação pra conferir os bugs encontrados, incluindo checagens de crashes e inconsistências em vários ambientes de execução.

Métricas de Cobertura

Além de detectar bugs, medimos a cobertura dos programas gerados. Isso envolve avaliar quantas APIs diferentes foram testadas e quão grande parte do código foi executada durante o processo de fuzzing. Alta cobertura indica uma maior probabilidade de descobrir bugs ocultos.

Comparações com Outros Fuzzers

Pra entender melhor a eficácia da nossa abordagem, comparamos ela com fuzzers existentes, tanto em nível de modelo quanto em nível de API. Ao analisar o desempenho em métricas como taxas de detecção de bugs e cobertura de código, podemos demonstrar as vantagens oferecidas pela nossa técnica.

Resultados e Descobertas

Nossa avaliação revela que a técnica proposta supera significativamente os fuzzers existentes na detecção de bugs e na obtenção de maior cobertura de código. Nossa abordagem baseada em LLM leva à descoberta de novos bugs em ambas as bibliotecas, muitos deles sendo de alta prioridade ou relacionados à segurança.

As descobertas também destacam a eficácia da geração de programas de casos limite. Ao estruturalmente guiar o LLM a focar em padrões históricos que causam bugs, conseguimos facilitar a identificação de bugs sutis que costumam ficar escondidos durante testes rotineiros.

Conclusão

Em resumo, a técnica proposta mostra o potencial de usar códigos históricos que causaram bugs pra guiar LLMs no fuzzing de bibliotecas de deep learning. Esse método totalmente automatizado melhora a capacidade de gerar entradas de casos limite, aumentando significativamente a detecção de bugs e a cobertura de código em comparação com abordagens tradicionais de fuzzing.

O sucesso desse método não só indica o valor dos dados históricos nos testes de software, mas também fornece uma estrutura escalável que pode ser adaptada a várias linguagens de programação e bibliotecas. No geral, aproveitar LLMs pro fuzzing abre novas possibilidades pra melhorar a qualidade e a confiabilidade do software, especialmente em áreas de aplicação crítica.

Fonte original

Título: Large Language Models are Edge-Case Fuzzers: Testing Deep Learning Libraries via FuzzGPT

Resumo: Deep Learning (DL) library bugs affect downstream DL applications, emphasizing the need for reliable systems. Generating valid input programs for fuzzing DL libraries is challenging due to the need for satisfying both language syntax/semantics and constraints for constructing valid computational graphs. Recently, the TitanFuzz work demonstrates that modern Large Language Models (LLMs) can be directly leveraged to implicitly learn all the constraints to generate valid DL programs for fuzzing. However, LLMs tend to generate ordinary programs following similar patterns seen in their massive training corpora, while fuzzing favors unusual inputs that cover edge cases or are unlikely to be manually produced. To fill this gap, this paper proposes FuzzGPT, the first technique to prime LLMs to synthesize unusual programs for fuzzing. FuzzGPT is built on the well-known hypothesis that historical bug-triggering programs may include rare/valuable code ingredients important for bug finding. Traditional techniques leveraging such historical information require intensive human efforts to design dedicated generators and ensure the validity of generated programs. FuzzGPT demonstrates that this process can be fully automated via the intrinsic capabilities of LLMs (including fine-tuning and in-context learning), while being generalizable and applicable to challenging domains. While FuzzGPT can be applied with different LLMs, this paper focuses on the powerful GPT-style models: Codex and CodeGen. Moreover, FuzzGPT also shows the potential of directly leveraging the instruct-following capability of the recent ChatGPT for effective fuzzing. Evaluation on two popular DL libraries (PyTorch and TensorFlow) shows that FuzzGPT can substantially outperform TitanFuzz, detecting 76 bugs, with 49 already confirmed as previously unknown bugs, including 11 high-priority bugs or security vulnerabilities.

Autores: Yinlin Deng, Chunqiu Steven Xia, Chenyuan Yang, Shizhuo Dylan Zhang, Shujing Yang, Lingming Zhang

Última atualização: 2023-04-04 00:00:00

Idioma: English

Fonte URL: https://arxiv.org/abs/2304.02014

Fonte PDF: https://arxiv.org/pdf/2304.02014

Licença: https://creativecommons.org/licenses/by/4.0/

Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.

Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.

Mais de autores

Artigos semelhantes