
Biblioteca e CLI para mutação de dados estruturados (JSON, XML, X.509) para suportar fuzzing baseado em gramática, com múltiplas estratégias de mutação e integração com Radamsa.
Umberto é uma biblioteca projetada para mutar dados estruturados genéricos (por exemplo, JSON, XML, X.509) e um aplicativo de linha de comando que encapsula essa funcionalidade. Ela pode aplicar uma variedade de mutações, sintetizar valores totalmente novos e aplicar mutadores existentes (por exemplo, Radamsa) a componentes da estrutura. Se você está tentando realizar fuzzing baseado em gramática, pode achá-la muito útil. Provavelmente é mais fácil entender com um exemplo:
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. Instale o stack, clone este repositório e então execute stack build && stack install. Se você quiser usar o fuzzer Radamsa, você também precisará instalá-lo separadamente.
Umberto fornece um executável simples, umberto-mutate, que encapsula a maior parte da sua funcionalidade. O uso típico é o seguinte:
echo -n mydata | umberto-mutate FORMAT MUTATOR TARGET
FORMAT pode ser qualquer um dos seguintes:
json
string (ou essencialmente "sem formato")
xml (relativamente não testado)
der (X.509 DER, relativamente não testado)
MUTATOR pode ser qualquer um dos seguintes:
knuth: embaralhamento de Knuth de valores-alvo
replacement: embaralhamento por substituição de valores-alvo
newvals: sintetiza novos valores-alvo no lugar dos antigos
radamsa: chama o radamsa externamente para mutação (só funciona em strings)
TARGET pode ser qualquer um dos seguintes:
strings: tipos de string
nums: tipos numéricos
all: todos os tipos
A maior parte da funcionalidade do Umberto está disponível em lib/Umberto.hs. Mutadores que fazem uso de polimorfismo de typeclass exigem algum uso de Template Haskell para violar a pressuposição de mundo aberto. Isso está disponível em Umberto.TH, mas só deve ser usado em código executável, nunca em bibliotecas.