Fuzzing de Ladybird avec les outils de Google Project Zero
- Domato est un fuzzer DOM développé par Google Project Zero, qui génère en grande quantité des pages web contenant du HTML, du CSS et du JavaScript principalement valides, mais étranges.
- Les pages web générées font environ 500 KiB et sont remplies de JS, CSS et HTML « intéressants » susceptibles de surprendre le moteur du navigateur.
- Domato aurait découvert de nombreux bugs dans les principaux navigateurs ; il a été appliqué à Ladybird pour identifier et corriger des problèmes.
Issue #1 : quand une balise <th> se trouve à l’intérieur de <mfrac>
- Dans la sortie générée par Domato, un problème a été repéré où
<th> se retrouvait à l’intérieur de <mfrac>.
- Une erreur de déréférencement de pointeur nul s’est produite dans Ladybird compilé avec UBSAN (Undefined Behavior SANitizer).
- Les éléments
<th> et <td> avaient été implémentés en supposant toujours qu’un <table> se trouvait plus haut dans l’arbre DOM, mais cette règle peut être violée lorsque des nœuds DOM sont créés manuellement via les API JavaScript.
- Pour corriger le problème, l’implémentation a été modifiée afin de ne plus supposer que
<th> et <td> appartiennent toujours à un <table>, en utilisant first_ancestor_of_type<HTMLTableElement>().
Issue #2 : affectation d’un gestionnaire d’événement window dans un DOM détaché
- En exécutant le fuzzer, un autre problème est rapidement apparu.
- Les documents créés via
DOMParser n’ont pas d’objet window, ce qui provoquait un dysfonctionnement.
Document::window() a été modifié pour renvoyer une valeur nullable, et plusieurs endroits ont été adaptés pour gérer le cas null.
- L’affectation de
document.body.onblur dans un document sans window a été modifiée pour ne rien faire.
Issue #3 : récursion infinie dans SVG <linearGradient>
- SVG permet de déclarer des dégradés qui héritent leurs couleurs d’autres dégradés.
- Le cas où un dégradé se référence lui-même n’avait pas été pris en compte, ce qui entraînait une boucle infinie.
- Pour gérer les cycles de référence sur plusieurs niveaux, tous les dégradés déjà visités sont désormais suivis, et la chaîne cesse d’être parcourue lorsqu’un dégradé déjà vu est rencontré.
Issue #4 : accès aux propriétés de window d’un iframe supprimé
- Lorsqu’un iframe est retiré du DOM, son document de contenu est détaché du contexte de navigation.
- Un bug dans la spécification HTML a été identifié : elle suppose l’existence d’un contexte de navigation lors de l’accès aux propriétés de l’objet window.
- Un ticket a été ouvert sur la spécification HTML et, côté Ladybird, le problème a été corrigé en ajoutant une vérification de null.
Issue #5 : boucle infinie dans Element.before()
- La page ne se chargeait pas et l’utilisation CPU restait à 100 %.
- Une erreur dans l’implémentation de
before() provoquait une boucle infinie.
- La correction a consisté à suivre la chaîne des siblings via
previous_sibling->previous_sibling au lieu de node->previous_sibling.
Conclusion
- Cinq vrais bugs ont été trouvés et tous corrigés en une journée.
- Les outils comme les fuzzers sont des ressources remarquables pour celles et ceux qui veulent rendre leurs logiciels plus robustes.
- Une fois Ladybird suffisamment stabilisé pour supporter des entrées de fuzzing en continu, il sera possible de l’exécuter automatiquement dans le cloud afin de découvrir davantage de problèmes.
Avis de GN⁺
- Cet article explique comment le moteur de navigateur Ladybird a corrigé des bugs découverts à l’aide du fuzzer Domato de Google Project Zero.
- Le fuzzing est une technique très efficace pour découvrir des vulnérabilités de sécurité dans les logiciels, et les développeurs peuvent l’utiliser pour rendre leur code plus robuste.
- L’article rappelle aux développeurs l’importance du fuzzing et fournit un aperçu de sa mise en pratique.
- D’un point de vue critique, le fuzzing teste la réaction d’un logiciel à des entrées inattendues ; il ne reflète donc pas toujours complètement les usages réels des utilisateurs.
- Parmi les autres outils de fuzzing offrant des fonctionnalités similaires, on peut citer AFL (American Fuzzy Lop) et LibFuzzer, que les développeurs peuvent utiliser pour tester leurs projets.
- En adoptant cette technique, les développeurs de Ladybird peuvent corriger les bugs découverts et améliorer la stabilité du navigateur, ce qui contribuera à une meilleure expérience utilisateur et à un renforcement de la sécurité.
1 commentaires
Avis Hacker News
La valeur d’une spécification est démontrée par la diversité des implémentations
Même un petit groupe peut créer des choses étonnantes
Étonnement face à la rapidité d’avancement du projet avec l’implémentation de SVG
Nécessité d’une approche approfondie de la résolution de problèmes en développement logiciel
Curiosité quant à la participation du moteur web de Ladybird au Web Engine Hackfest
Interrogation sur l’absence de nouvelles vidéos YouTube liées au hacking
Réaction amusée à l’expression « fuzzing ladybird »
Espère secrètement que Ladybird pourra conquérir le monde
[Commentaire supprimé]