Fuzzing de Ladybird con herramientas de Google Project Zero
- Domato es un fuzzer de DOM desarrollado por Google Project Zero que genera grandes cantidades de páginas web con HTML, CSS y JavaScript mayormente válidos, pero extraños.
- Las páginas web generadas tienen un tamaño de alrededor de 500 KiB y están llenas de JS, CSS y HTML "interesantes" que pueden sorprender al motor del navegador.
- Se dice que Domato ha encontrado muchos errores en los principales navegadores, y aquí se aplicó a Ladybird para encontrar y corregir problemas.
Problema #1: cuando una etiqueta <th> está dentro de <mfrac>
- En una salida generada por Domato se encontró el caso de poner un
<th> dentro de <mfrac>.
- En Ladybird compilado con UBSAN (Undefined Behavior SANitizer) se produjo un error de desreferencia de puntero nulo.
- Los elementos
<th> y <td> se implementaron asumiendo siempre que había un <table> más arriba en el árbol DOM, pero estas reglas pueden romperse cuando los nodos DOM se crean manualmente mediante la API de JavaScript.
- Para resolver el problema, se dejó de asumir que los elementos
<th> y <td> siempre contienen un <table> y se corrigió usando first_ancestor_of_type<HTMLTableElement>().
Problema #2: asignación de manejadores de eventos de window en un DOM separado
- Al ejecutar el fuzzer, rápidamente apareció otro problema.
- Los documentos creados mediante
DOMParser no tienen un objeto window, y eso causaba el problema.
- Se modificó
Document::window() para que devolviera un valor nullable, y se agregó manejo de null en varios lugares.
- También se corrigió para que no haga nada al asignar
document.body.onblur en documentos sin window.
Problema #3: recursión infinita en SVG <linearGradient>
- SVG puede declarar gradientes que heredan colores haciendo referencia a otros gradientes.
- Como no se consideró el caso en que un gradiente se referencie a sí mismo, se producía un bucle infinito.
- Para manejar ciclos de referencia que abarcan varios pasos, se rastrean todos los gradientes visitados y se deja de seguir la cadena al encontrar uno ya visitado.
Problema #4: acceso a propiedades de window de un iframe eliminado
- Cuando un iframe se elimina del DOM, su documento de contenido se desacopla del contexto de navegación.
- Se encontró un error en la especificación HTML, que asume la existencia del contexto de navegación al acceder a propiedades del objeto window.
- Se abrió un issue sobre la especificación HTML y, en Ladybird, el problema se resolvió agregando una verificación de null.
Problema #5: bucle infinito en Element.before()
- La página no cargaba y el uso de CPU se mantenía al 100%.
- Un error en la implementación de
before() provocaba un bucle infinito.
- Se corrigió para recorrer la cadena de hermanos mediante
previous_sibling->previous_sibling en lugar de node->previous_sibling.
Conclusión
- En un solo día se encontraron 5 errores reales y todos fueron corregidos.
- Herramientas como los fuzzers son un recurso increíble para quienes quieren hacer que el software sea más robusto.
- Cuando Ladybird se estabilice lo suficiente como para soportar entradas continuas de fuzzing, podrá ejecutarse automáticamente en la nube para encontrar aún más problemas.
Opinión de GN⁺
- Este artículo explica el proceso mediante el cual el motor de navegador Ladybird corrigió errores descubiertos usando el fuzzer Domato de Google Project Zero.
- El fuzzing es una técnica muy efectiva para encontrar vulnerabilidades de seguridad en el software, y los desarrolladores pueden usarla para hacer su código más robusto.
- El artículo recuerda a los desarrolladores la importancia del fuzzing y ofrece una visión de cómo se aplica en la práctica.
- Viéndolo de forma crítica, el fuzzing prueba cómo reacciona el software ante entradas inesperadas, por lo que puede no reflejar por completo los patrones de uso de los usuarios reales.
- Otras herramientas de fuzzing con funciones similares incluyen AFL (American Fuzzy Lop) y LibFuzzer, que los desarrolladores pueden usar para probar sus propios proyectos.
- Al adoptar esta técnica, los desarrolladores de Ladybird pueden corregir los errores encontrados y mejorar la estabilidad del navegador, lo que ayudará a mejorar la experiencia del usuario y reforzar la seguridad.
1 comentarios
Opiniones en Hacker News
El valor de una especificación se demuestra con implementaciones diversas
La posibilidad de que un grupo pequeño también pueda crear cosas sorprendentes
Sorpresa por el rápido avance del proyecto con la implementación de SVG
Necesidad de un enfoque profundo para resolver problemas en el desarrollo de software
Curiosidad sobre si el motor web de Ladybird participará en el hackfest de motores web
Duda por la ausencia de videos de YouTube sobre hacking
Reacción divertida a la combinación de palabras "fuzzing ladybird"
Esperanza secreta de que Ladybird pueda conquistar el mundo
[comentario eliminado]