Avanços em Fuzzing de Motores JavaScript
Nova técnica melhora a detecção de bugs em motores JavaScript usando modelos avançados.
― 7 min ler
Índice
Fuzzing é uma técnica de teste usada pra encontrar bugs em software. Ela funciona jogando dados aleatórios ou inesperados nos programas pra ver como eles reagem. Esse método ajuda a identificar erros, travamentos ou vulnerabilidades de segurança. Fuzzing é especialmente importante pra programas que têm que lidar com diferentes tipos de entrada, tipo motores JavaScript.
Motores JavaScript são componentes de software essenciais que rodam código JavaScript em navegadores. Eles são responsáveis por interpretar, compilar e executar JavaScript. Sendo que JavaScript é super usado na web, garantir a segurança e a confiabilidade desses motores é crucial. Encontrar bugs nesses motores pode prevenir vários tipos de ataques, como vazamentos de dados e bypass de medidas de segurança.
Desafios no Fuzzing de Motores JavaScript
Fuzzing de motores JavaScript pode ser complicado. Um problema principal é que esses motores precisam que as entradas sigam regras gramaticais específicas. Se a entrada não estiver de acordo com a gramática, o motor vai dar um erro de sintaxe, impedindo que o código rode e descubra qualquer bug subjacente. Além disso, mesmo que a entrada esteja gramaticalmente correta, ela ainda pode causar erros semânticos, onde o programa roda mas se comporta de forma inesperada.
Duas abordagens comuns no fuzzing de motores JavaScript são fuzzing em nível de gramática e fuzzing em nível de token. O fuzzing em nível de gramática cria entradas que seguem estritamente as regras de gramática do motor. Esse método é confiável mas dá muito trabalho pra definir essas regras. Por outro lado, o fuzzing em nível de token permite mais flexibilidade. Ele muda a entrada alterando sequências de tokens em vez de seguir rigorosamente a gramática. Porém, essa abordagem muitas vezes leva a entradas que não são gramaticalmente corretas.
A Necessidade de Melhorar as Técnicas de Fuzzing
Pesquisas recentes têm olhado pra usar modelos de linguagem avançados, que são ferramentas poderosas pra gerar e entender texto, pra melhorar o processo de fuzzing. Esses modelos de linguagem podem ajudar a criar entradas melhores que têm mais chances de descobrir erros em motores JavaScript. Porém, muitos métodos existentes simplesmente usam esses modelos sem considerar o quanto eles guiam o processo de fuzzing.
Uma nova abordagem chamada Aprendizado por Reforço Orientado por Cobertura (CovRL) tem como objetivo lidar com esses desafios. Essa técnica combina grandes modelos de linguagem com aprendizado por reforço, que é um método onde um algoritmo aprende a tomar decisões melhores com base em feedback. Integrando dados de cobertura, que mostram quais partes do código foram testadas, o CovRL consegue criar entradas que exploram mais caminhos e encontram mais bugs.
CovRL: Um Novo Método para Fuzzing
CovRL usa um fuzzer especial chamado CovRL-Fuzz. Esse fuzzer aproveita o feedback sobre a cobertura do código. Ele constrói um mapa baseado em quão frequentemente diferentes seções do código são executadas quando as entradas são testadas. Analisando esse mapa, o fuzzer pode identificar quais áreas do código ainda não foram executadas e devem ser testadas mais.
CovRL-Fuzz usa um método chamado Frequência de Termo-Frequência Inversa de Documento (TF-IDF) pra atribuir pesos a diferentes seções do código. Isso significa que partes do código que são menos frequentemente cobertas ganham mais importância no processo de fuzzing. A ideia é ajudar o fuzzer a gerar entradas que provavelmente vão alcançar aquelas áreas inexploradas.
Resultados e Descobertas
Nas avaliações, o CovRL-Fuzz mostrou que superou outros fuzzer de ponta em encontrar bugs e melhorar a cobertura do código. Ele identificou com sucesso 48 bugs relacionados à segurança em motores JavaScript, incluindo muitos que eram desconhecidos. Isso demonstra a eficácia de usar técnicas orientadas por cobertura no fuzzing.
A pesquisa envolveu testar vários motores JavaScript, como V8 e JavaScriptCore. Os resultados indicaram que o CovRL-Fuzz consistentemente alcançou uma cobertura maior do que outros fuzzer. Isso significa que ele conseguiu testar mais seções do código, levando à descoberta de mais bugs.
Como o CovRL Funciona
O CovRL tem uma abordagem estruturada pro fuzzing que pode ser dividida em várias fases:
Seleção de Entrada: O processo começa com a escolha de uma entrada inicial de uma fila de entradas previamente testadas.
Mutação de Máscara: A entrada selecionada passa por um processo de mutação de máscara. Nessa etapa, partes da entrada são mascaradas, e o fuzzer usa o modelo de linguagem pra prever o que colocar nesses lugares. Isso ajuda a gerar novos casos de teste.
Execução e Medição de Cobertura: A nova entrada é rodonda no motor JavaScript, e a cobertura do código resultante é medida. Isso indica quais partes do código foram executadas por essa entrada.
Sistema de Recompensa: Com base nos dados de cobertura, uma recompensa é atribuída. Entradas que levam a uma nova cobertura de código recebem uma pontuação maior. Essa recompensa retroalimenta o processo de aprendizado, ajudando o fuzzer a melhorar ao longo do tempo.
Aperfeiçoamento: Por fim, as recompensas guiam o processo de aprendizado do fuzzer ao longo do tempo, ajudando ele a se tornar mais eficaz em gerar casos de teste que podem revelar bugs.
Importância do Fuzzing Consciente do Contexto
Um dos principais avanços do CovRL-Fuzz é sua capacidade de entender o contexto do código JavaScript. Fuzzers tradicionais muitas vezes dependiam de mutações aleatórias de tokens. No entanto, isso pode levar a uma falta de diversidade nas entradas geradas, tornando menos eficaz na hora de encontrar bugs. Usando um modelo de linguagem, o CovRL-Fuzz consegue gerar entradas que não só seguem regras gramaticais, mas também fazem sentido no contexto.
Essa mutação consciente do contexto significa que o CovRL-Fuzz pode produzir entradas únicas que têm uma chance maior de revelar bugs ocultos. Ele consegue explorar melhor a estrutura do código e identificar vulnerabilidades que outros fuzzers poderiam perder.
Descobertas dos Experimentos
Durante os testes do CovRL-Fuzz, várias descobertas importantes surgiram:
Cobertura Melhorada: O CovRL-Fuzz consistentemente alcançou uma cobertura de código substancialmente maior em comparação tanto com fuzzers baseados em heurísticas quanto com outros fuzzers baseados em modelos de linguagem. Isso se traduz em explorar mais caminhos potenciais através do código.
Taxas de Erro Menores: O fuzzer demonstrou uma taxa menor de erros de sintaxe e semânticos nos casos de teste que gerou. Isso significa que ele conseguiu produzir mais entradas válidas que executaram corretamente sem causar travamentos.
Detecção Eficaz de Bugs: O CovRL-Fuzz foi eficaz em descobrir um grande número de bugs em motores JavaScript. Ele encontrou muitas vulnerabilidades que nunca tinham sido relatadas antes, indicando seu potencial pra aumentar a segurança do software.
Pesquisas e Aplicações Futuras
A implementação do CovRL-Fuzz abre novas possibilidades de pesquisa e desenvolvimento em técnicas de fuzzing. Existe potencial pra aplicar essa estrutura a outras linguagens de programação e ambientes de software. Adaptando os conceitos de aprendizado por reforço orientado por cobertura, técnicas similares poderiam ser usadas pra melhorar o fuzzing em diversos tipos de aplicações.
Uma exploração mais profunda poderia focar em refinar a interação entre os modelos de linguagem e o processo de fuzzing. Melhorias poderiam incluir formas melhores de quantificar a cobertura do código e integrar algoritmos de aprendizado mais sofisticados.
Conclusão
Fuzzing continua sendo uma técnica vital pra encontrar bugs e melhorar a segurança do software, especialmente em sistemas complexos como motores JavaScript. A introdução do CovRL e do CovRL-Fuzz representa um grande passo à frente nesse campo, aproveitando técnicas modernas de aprendizado de máquina pra aprimorar as capacidades de fuzzing.
Combinando abordagens orientadas por cobertura com modelos de linguagem avançados, o CovRL-Fuzz mostrou que pode superar métodos tradicionais de fuzzing, gerando entradas melhores que levam à descoberta de vulnerabilidades do mundo real. À medida que a tecnologia evolui, os avanços contínuos em técnicas de fuzzing vão desempenhar um papel essencial em garantir a robustez e segurança dos sistemas de software.
Título: CovRL: Fuzzing JavaScript Engines with Coverage-Guided Reinforcement Learning for LLM-based Mutation
Resumo: Fuzzing is an effective bug-finding technique but it struggles with complex systems like JavaScript engines that demand precise grammatical input. Recently, researchers have adopted language models for context-aware mutation in fuzzing to address this problem. However, existing techniques are limited in utilizing coverage guidance for fuzzing, which is rather performed in a black-box manner. This paper presents a novel technique called CovRL (Coverage-guided Reinforcement Learning) that combines Large Language Models (LLMs) with reinforcement learning from coverage feedback. Our fuzzer, CovRL-Fuzz, integrates coverage feedback directly into the LLM by leveraging the Term Frequency-Inverse Document Frequency (TF-IDF) method to construct a weighted coverage map. This map is key in calculating the fuzzing reward, which is then applied to the LLM-based mutator through reinforcement learning. CovRL-Fuzz, through this approach, enables the generation of test cases that are more likely to discover new coverage areas, thus improving vulnerability detection while minimizing syntax and semantic errors, all without needing extra post-processing. Our evaluation results indicate that CovRL-Fuzz outperforms the state-of-the-art fuzzers in terms of code coverage and bug-finding capabilities: CovRL-Fuzz identified 48 real-world security-related bugs in the latest JavaScript engines, including 39 previously unknown vulnerabilities and 11 CVEs.
Autores: Jueon Eom, Seyeon Jeong, Taekyoung Kwon
Última atualização: 2024-02-19 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2402.12222
Fonte PDF: https://arxiv.org/pdf/2402.12222
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.