Fazendo fuzzing no Ladybird com ferramentas do Google Project Zero
- Domato é um fuzzer de DOM desenvolvido pelo Google Project Zero que gera grandes quantidades de páginas web, em sua maioria válidas, mas estranhas, contendo HTML, CSS e JavaScript.
- As páginas web geradas têm cerca de 500 KiB e são cheias de JS, CSS e HTML "interessantes" para surpreender o motor do navegador.
- Diz-se que o Domato encontrou muitos bugs nos principais navegadores, e ele foi aplicado ao Ladybird para encontrar e corrigir problemas.
Problema #1: quando a tag <th> está dentro de <mfrac>
- Foi encontrado, na saída gerada pelo Domato, um caso em que
<th> era colocado dentro de <mfrac>.
- No Ladybird compilado com UBSAN (Undefined Behavior SANitizer), ocorreu um erro de desreferência de ponteiro nulo.
- Os elementos
<th> e <td> haviam sido implementados assumindo sempre que existia um <table> acima deles na árvore DOM, mas essa regra pode ser violada ao criar nós DOM manualmente usando a API de JavaScript.
- Para resolver o problema, a implementação foi corrigida para não assumir que
<th> e <td> sempre contêm um <table>, usando first_ancestor_of_type<HTMLTableElement>().
Problema #2: atribuição de manipulador de evento de window em um DOM desconectado
- Ao executar o fuzzer, outro problema apareceu rapidamente.
- Documentos criados por
DOMParser não têm um objeto window, e isso causava problemas.
Document::window() foi alterado para retornar um valor anulável, e o tratamento de null foi adicionado em vários pontos.
- Também foi corrigido para que, ao atribuir
document.body.onblur em um documento sem window, nada aconteça.
Problema #3: recursão infinita em SVG <linearGradient>
- O SVG pode declarar gradientes que herdam cores ao referenciar outros gradientes.
- Como o caso em que um gradiente referencia a si mesmo não foi considerado, isso causava um loop infinito.
- Para lidar com ciclos de referência que se estendem por várias etapas, todos os gradientes visitados passaram a ser rastreados, e quando um gradiente já visitado é encontrado, o encadeamento deixa de ser seguido.
Problema #4: acesso a propriedades de window de um iframe removido
- Quando um iframe é removido do DOM, seu documento de conteúdo é separado do contexto de navegação.
- Foi encontrado um bug na especificação HTML, que assumia a existência do contexto de navegação ao acessar propriedades do objeto window.
- Foi aberta uma issue para a especificação HTML e, no Ladybird, o problema foi resolvido com a adição de verificações de null.
Problema #5: loop infinito em Element.before()
- A página não carregava e o uso de CPU permanecia em 100%.
- Um erro na implementação de
before() causava um loop infinito.
- A correção fez com que a cadeia de irmãos fosse percorrida por
previous_sibling->previous_sibling em vez de node->previous_sibling.
Conclusão
- Em um dia, foram encontrados 5 bugs reais, e todos foram corrigidos.
- Ferramentas como fuzzers são recursos incríveis para quem quer tornar o software mais robusto.
- Quando o Ladybird estiver estável o suficiente para lidar com entradas contínuas de fuzzing, será possível executá-lo automaticamente na nuvem para descobrir ainda mais problemas.
Opinião do GN⁺
- Este artigo explica o processo de correção dos bugs encontrados no motor de navegador Ladybird usando o fuzzer Domato, do Google Project Zero.
- Fuzzing é uma técnica muito eficaz para descobrir vulnerabilidades de segurança em software, e os desenvolvedores podem usá-la para tornar seu código mais robusto.
- O artigo reforça para os desenvolvedores a importância do fuzzing e oferece uma visão de como ele é aplicado na prática.
- Em uma análise crítica, como o fuzzing testa a reação do software a entradas inesperadas, ele pode não refletir completamente os padrões de uso de usuários reais.
- Outras ferramentas de fuzzing com funcionalidades semelhantes incluem AFL (American Fuzzy Lop) e LibFuzzer, e os desenvolvedores podem usá-las para testar seus próprios projetos.
- Ao adotar essa técnica, os desenvolvedores do Ladybird podem corrigir os bugs encontrados e melhorar a estabilidade do navegador, o que ajuda a aprimorar a experiência do usuário e reforçar a segurança.
1 comentários
Comentários do Hacker News
O valor das especificações é comprovado por implementações diversas
A possibilidade de até grupos pequenos criarem coisas incríveis
Surpresa com o rápido progresso do projeto por causa da implementação de SVG
Necessidade de uma abordagem aprofundada para resolver problemas no desenvolvimento de software
Curiosidade sobre a participação do motor web do Ladybird no Web Engine Hackfest
Dúvida sobre a ausência de vídeos no YouTube relacionados a hacking
Reação divertida à combinação de palavras "fuzzing ladybird"
Esperança secreta de que o Ladybird possa dominar o mundo
[Comentário excluído]