Fuzzing von Ladybird mit Tools von Google Project Zero
- Domato ist ein von Google Project Zero entwickelter DOM-Fuzzer, der große Mengen an Web-Seiten erzeugt, die überwiegend gültiges, aber ungewöhnliches HTML, CSS und JavaScript enthalten.
- Die erzeugten Web-Seiten sind etwa 500 KiB groß und voller „interessantem“ JS, CSS und HTML, das Browser-Engines überraschen soll.
- Domato soll in großen Browsern viele Bugs gefunden haben; hier wurde es auf Ladybird angewendet, um Probleme zu finden und zu beheben.
Issue #1: Wenn sich ein <th>-Tag innerhalb von <mfrac> befindet
- In der von Domato erzeugten Ausgabe wurde ein Problem gefunden, bei dem ein
<th> innerhalb von <mfrac> platziert war.
- In Ladybird, kompiliert mit UBSAN (Undefined Behavior SANitizer), trat ein Null-Pointer-Dereferenzierungsfehler auf.
- Die Implementierung von
<th>- und <td>-Elementen ging stets davon aus, dass sich im DOM-Baum oberhalb ein <table> befindet. Diese Regel kann jedoch verletzt werden, wenn DOM-Knoten manuell über die JavaScript-API erzeugt werden.
- Zur Behebung wurde die Annahme entfernt, dass
<th>- und <td>-Elemente immer zu einem <table> gehören, und stattdessen first_ancestor_of_type<HTMLTableElement>() verwendet.
Issue #2: Zuweisung eines window-Event-Handlers in einem getrennten DOM
- Beim Ausführen des Fuzzers stieß man schnell auf ein weiteres Problem.
- Über
DOMParser erzeugte Dokumente besitzen kein window-Objekt, was zu Problemen führte.
Document::window() wurde so geändert, dass ein nullable Wert zurückgegeben wird, und an mehreren Stellen wurde Null-Handling ergänzt.
- Die Zuweisung von
document.body.onblur in Dokumenten ohne window wurde so geändert, dass in diesem Fall nichts geschieht.
Issue #3: Unendliche Rekursion bei SVG-<linearGradient>
- SVG kann Gradients deklarieren, die Farben von anderen Gradients erben, indem sie auf diese verweisen.
- Der Fall, dass ein Gradient auf sich selbst verweist, wurde nicht berücksichtigt, wodurch eine Endlosschleife entstand.
- Um Referenzzyklen über mehrere Ebenen hinweg zu behandeln, werden nun alle besuchten Gradients verfolgt; trifft man auf einen bereits besuchten Gradient, wird das Verfolgen der Kette abgebrochen.
Issue #4: Zugriff auf window-Eigenschaften eines entfernten iframe
- Wenn ein iframe aus dem DOM entfernt wird, wird sein Inhaltsdokument vom Browsing-Kontext getrennt.
- Dabei wurde ein Fehler in der HTML-Spezifikation entdeckt, die beim Zugriff auf Eigenschaften des
window-Objekts vom Vorhandensein eines Browsing-Kontexts ausgeht.
- Es wurde ein Issue zur HTML-Spezifikation eingereicht, und in Ladybird wurde das Problem durch zusätzliche Null-Prüfungen behoben.
Issue #5: Endlosschleife in Element.before()
- Die Seite lud nicht, und die CPU-Auslastung blieb bei 100 %.
- Durch einen Fehler in der
before()-Implementierung entstand eine Endlosschleife.
- Die Kette der Geschwisterknoten wurde korrigiert, sodass statt über
node->previous_sibling über previous_sibling->previous_sibling iteriert wird.
Fazit
- An einem Tag wurden fünf echte Bugs gefunden und alle behoben.
- Tools wie Fuzzer sind eine erstaunliche Ressource für alle, die Software robuster machen wollen.
- Sobald Ladybird stabil genug ist, um kontinuierliche Fuzzing-Eingaben zu verarbeiten, könnte das automatisch in der Cloud ausgeführt werden, um noch mehr Probleme zu finden.
Meinung von GN⁺
- Dieser Artikel beschreibt den Prozess, mit dem im Browser-Engine Ladybird mithilfe des Domato-Fuzzers von Google Project Zero gefundene Bugs behoben wurden.
- Fuzzing ist eine sehr effektive Technik, um Sicherheitslücken in Software zu finden, und Entwickler können sie nutzen, um ihren Code robuster zu machen.
- Der Artikel erinnert Entwickler an die Bedeutung von Fuzzing und bietet Einblicke, wie es in der Praxis angewendet wird.
- Kritisch betrachtet testet Fuzzing die Reaktion von Software auf unerwartete Eingaben und bildet daher reale Nutzungsmuster tatsächlicher Anwender nicht vollständig ab.
- Andere Fuzzing-Tools mit ähnlichen Funktionen sind etwa AFL (American Fuzzy Lop) oder LibFuzzer; Entwickler können solche Werkzeuge verwenden, um ihre eigenen Projekte zu testen.
- Durch die Einführung dieser Technik können die Ladybird-Entwickler entdeckte Bugs beheben und die Stabilität des Browsers verbessern, was zur Verbesserung der Benutzererfahrung und zur Stärkung der Sicherheit beitragen dürfte.
1 Kommentare
Hacker-News-Kommentare
Der Wert einer Spezifikation wird durch verschiedene Implementierungen belegt
Die Möglichkeit, dass auch kleine Gruppen Erstaunliches schaffen können
Überraschung über den schnellen Fortschritt des Projekts durch die SVG-Implementierung
Die Notwendigkeit eines tiefgehenden Ansatzes zur Problemlösung in der Softwareentwicklung
Neugier, ob Ladybird am diesjährigen Web Engine Hackfest teilnehmen wird
Frage nach dem Fehlen von YouTube-Videos zum Thema Hacking
Eine amüsierte Reaktion auf die Wortkombination "fuzzing ladybird"
Die heimliche Hoffnung, dass Ladybird die Welt erobern könnte
[Gelöschter Kommentar]