
Libreria e CLI per la mutazione di dati strutturati (JSON, XML, X.509) a supporto del fuzzing basato su grammatica, con molteplici strategie di mutazione e integrazione con Radamsa.
Umberto è una libreria progettata per mutare dati strutturati generici (ad es. JSON, XML, X.509) e un'applicazione a riga di comando che incapsula questa funzionalità. Può applicare una varietà di mutazioni, sintetizzare valori completamente nuovi e applicare mutatori esistenti (ad es. Radamsa) ai componenti della struttura. Se stai cercando di eseguire fuzzing basato su grammatica, potresti trovarlo molto utile. Probabilmente è più facile capirlo con un esempio:
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 usa stack. Installa stack, clona questo repository, quindi esegui stack build && stack install. Se vuoi usare il fuzzer Radamsa, dovrai anche installarlo separatamente.
Umberto fornisce un semplice eseguibile, umberto-mutate, che incapsula la maggior parte delle sue funzionalità. L'uso tipico è il seguente:
echo -n mydata | umberto-mutate FORMATO MUTATORE OBIETTIVO
FORMATO può essere uno dei seguenti:
json
string (o essenzialmente "nessun formato")
xml (relativamente non testato)
der (X.509 DER, relativamente non testato)
MUTATORE può essere uno dei seguenti:
knuth: valori mirati mescolati con Knuth shuffle
replacement: valori mirati mescolati per sostituzione
newvals: sintetizza nuovi valori mirati al posto di quelli vecchi
radamsa: richiama radamsa per la mutazione (funziona solo su stringhe)
OBIETTIVO può essere uno dei seguenti:
strings: tipi stringa
nums: tipi numerici
all: tutti i tipi
La maggior parte delle funzionalità di Umberto è disponibile in lib/Umberto.hs. I mutatori che fanno uso del polimorfismo tramite typeclass richiedono un uso di Template Haskell per violare l'assunzione del mondo aperto. Questo è disponibile in Umberto.TH ma dovrebbe essere usato solo in codice eseguibile, mai in librerie.