
Bibliothek und CLI zum Mutieren strukturierter Daten (JSON, XML, X.509) zur Unterstützung von grammatikbasiertem Fuzzing, mit mehreren Mutationsstrategien und Integration mit Radamsa.
Umberto ist eine Bibliothek, die zum Mutieren generischer strukturierter Daten (z. B. JSON, XML, X.509) entwickelt wurde, sowie eine Kommandozeilenanwendung, die diese Funktionalität kapselt. Sie kann eine Vielzahl von Mutationen anwenden, völlig neue Werte synthetisieren und vorhandene Mutatoren (z. B. Radamsa) auf Strukturkomponenten anwenden. Wenn Sie versuchen, grammatikbasiertes Fuzzing durchzuführen, könnte sie sich als sehr nützlich erweisen. Am einfachsten ist es wahrscheinlich anhand eines Beispiels zu verstehen:
echo -n "{\"a\": 1, \"b\": 2, \"c\": \"test\"}" | umberto-mutate json knuth all
{"a":2,"c":"tesb","t":1}
echo -n "{\"a\": 1, \"b\": 2, \"c\": \"test\"}" | umberto-mutate json newvals nums
{"a":-2.8e-20,"b":-40000,"c":"test"}
echo -n "{\"a\": 1, \"b\": 2, \"c\": \"test\"}" | umberto-mutate json radamsa strings
{"c\u0008^\u001f":"ó ¨teï»â¨¿st","1313131313131313â":1,"ô ó ó ¶Db":2}
echo -n "{\"a\": 1, \"b\": 2, \"c\": \"test\"}" | umberto-mutate string replacement all
:"c2:tb{ :"{c"}t"as }c"e": "2
Umberto verwendet stack. Installieren Sie stack, klonen Sie dieses Repository und führen Sie dann stack build && stack install aus. Wenn Sie den Radamsa-Fuzzer verwenden möchten, müssen Sie ihn außerdem separat installieren.
Umberto stellt ein einfaches ausführbares Programm bereit, umberto-mutate, das den größten Teil seiner Funktionalität kapselt. Die typische Verwendung ist wie folgt:
echo -n mydata | umberto-mutate FORMAT MUTATOR TARGET
FORMAT kann einer der folgenden Werte sein:
json
string (oder im Wesentlichen "kein Format")
xml (relativ ungetestet)
der (X.509 DER, relativ ungetestet)
MUTATOR kann einer der folgenden Werte sein:
knuth: Knuth-Shuffle für gezielte Werte
replacement: Replacement-Shuffle für gezielte Werte
newvals: Neue gezielte Werte anstelle der alten synthetisieren
radamsa: Radamsa für die Mutation aufrufen (funktioniert nur mit Zeichenketten)
TARGET kann einer der folgenden Werte sein:
strings: Zeichenkettentypen
nums: Numerische Typen
all: Alle Typen
Der größte Teil der Funktionalität von Umberto ist in lib/Umberto.hs verfügbar. Mutatoren, die Typklassen-Polymorphie nutzen, erfordern die Verwendung von Template Haskell, um die Open-World-Annahme zu verletzen. Dies ist in Umberto.TH verfügbar, sollte aber nur in ausführbarem Code verwendet werden, niemals in Bibliotheken.