
Biblioteca y CLI para mutar datos estructurados (JSON, XML, X.509) para admitir fuzzing basado en gramáticas, con múltiples estrategias de mutación e integración con Radamsa.
Umberto es una biblioteca diseñada para mutar datos estructurados genéricos (p. ej., JSON, XML, X.509) y una aplicación de línea de comandos que envuelve esta funcionalidad. Puede aplicar una variedad de mutaciones, sintetizar valores totalmente nuevos y aplicar mutadores existentes (p. ej., Radamsa) a componentes de la estructura. Si intentas realizar fuzzing basado en gramáticas, puede resultarte muy útil. Probablemente sea más fácil de entender con un ejemplo:
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 utiliza stack. Instala stack, clona este repositorio y luego ejecuta stack build && stack install. Si quieres usar el fuzzer Radamsa, también tendrás que instalarlo por separado.
Umberto proporciona un ejecutable simple, umberto-mutate, que envuelve la mayor parte de su funcionalidad. El uso típico es el siguiente:
echo -n mydata | umberto-mutate FORMAT MUTATOR TARGET
FORMAT puede ser cualquiera de los siguientes:
json
string (o esencialmente "sin formato")
xml (relativamente poco probado)
der (X.509 DER, relativamente poco probado)
MUTATOR puede ser cualquiera de los siguientes:
knuth: baraja Knuth aplicada a los valores seleccionados
replacement: baraja por reemplazo aplicada a los valores seleccionados
newvals: sintetiza nuevos valores seleccionados en lugar de los antiguos
radamsa: invoca radamsa externamente para la mutación (solo funciona con cadenas)
TARGET puede ser cualquiera de los siguientes:
strings: tipos de cadena
nums: tipos numéricos
all: todos los tipos
La mayor parte de la funcionalidad de Umberto está disponible en lib/Umberto.hs. Los mutadores que hacen uso del polimorfismo de typeclasses requieren cierto uso de Template Haskell para violar la suposición de mundo abierto. Esto está disponible en Umberto.TH, pero solo debe usarse en código ejecutable, nunca en bibliotecas.