1 pontos por GN⁺ 2024-03-17 | 1 comentários | Compartilhar no WhatsApp

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

 
GN⁺ 2024-03-17
Comentários do Hacker News
  • O valor das especificações é comprovado por implementações diversas

    Este texto mostra por que é importante haver implementações diversas de uma especificação. Um problema já foi encontrado, e é esperado que haja mais.

  • A possibilidade de até grupos pequenos criarem coisas incríveis

    Expressa entusiasmo com grupos pequenos tocando projetos incríveis. Isso é algo difícil de fazer em empresas com partes interessadas.

  • Surpresa com o rápido progresso do projeto por causa da implementação de SVG

    Expressa fascínio com a notícia de que o projeto está avançando mais rápido do que o esperado e que a implementação de SVG foi concluída.

  • Necessidade de uma abordagem aprofundada para resolver problemas no desenvolvimento de software

    Defende que os desenvolvedores não devem parar em encontrar e corrigir problemas, mas também entender a causa raiz e procurar erros semelhantes em toda a base de código. Enfatiza que a instabilidade e os bugs do software moderno são resultado das limitações do capitalismo, mas que um desenvolvimento de software melhor é possível.

  • Curiosidade sobre a participação do motor web do Ladybird no Web Engine Hackfest

    Expressa interesse em saber se o Ladybird participará do Web Engine Hackfest este ano.

  • Dúvida sobre a ausência de vídeos no YouTube relacionados a hacking

    Expressa decepção com o fato de que vídeos no YouTube sobre hacking não estão mais sendo atualizados.

  • Reação divertida à combinação de palavras "fuzzing ladybird"

    Opina que a combinação de palavras "fuzzing ladybird" soa engraçada e brutal.

  • Esperança secreta de que o Ladybird possa dominar o mundo

    Diz que secretamente torce para que o Ladybird possa dominar o mundo algum dia, e pede para não contar isso a ninguém.

  • [Comentário excluído]

    Informa que um comentário específico foi excluído.