Fuzzing und automatisiertes Testen
Kurz: Beim Fuzzing füttert man ein Programm automatisch mit riesigen Mengen zufälliger oder halb zufälliger Eingaben, um Abstürze und Sicherheitslücken zu finden.
Genauer: Ein Fuzzer erzeugt Eingaben, startet das Ziel und beobachtet. Coverage-geführte Fuzzer (AFL++, libFuzzer) merken, welche Eingaben neue Codepfade erreichen, und mutieren genau diese weiter. Mit Sanitizern (AddressSanitizer) fallen auch stille Speicherfehler auf.
Im Detail
- Arten: Blind (zufällig), mutationsbasiert, grammatikbasiert, coverage-geführt.
- Sanitizer: ASan (Speicherfehler), UBSan (undefiniertes Verhalten), TSan (Datenrennen).
- Harness: Kleine Funktion, die Fuzz-Daten an die zu testende Funktion übergibt.
- Property-based Testing: Eigenschaften statt Beispiele (z. B.
decode(encode(x)) == x), mit Bibliotheken wie Hypothesis, fast-check. - Corpus: Sammlung interessanter Eingaben, wird mitgepflegt.
- CI-Fuzzing: OSS-Fuzz, ClusterFuzz.
- Findet: Pufferüberläufe, Abstürze, Endlosschleifen, Parser-Fehler.
Siehe auch: OWASP Top 10, Lexer, Parser und Syntaxbaum