Umberto 是一个专为变异通用结构化数据(如 JSON、XML、X.509)而设计的库,也是一个封装了该功能的命令行应用程序。它可以应用多种变异、合成全新的值,并将现有的变异器(例如 Radamsa)应用于结构组件。如果你正在尝试进行基于语法的模糊测试,你可能会发现它非常有用。通过示例来理解可能最容易:
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 使用 stack。安装 stack,克隆此仓库,然后运行 stack build && stack install。如果你想使用 Radamsa 模糊器,还需要单独安装它。
Umberto 提供了一个简单的可执行文件 umberto-mutate,它封装了其大部分功能。典型用法如下:
echo -n mydata | umberto-mutate FORMAT MUTATOR TARGET
FORMAT 可以是以下任一值:
json
string(基本上等同于“无格式”)
xml(相对未经测试)
der(X.509 DER,相对未经测试)
MUTATOR 可以是以下任一值:
knuth:对目标值进行 Knuth 洗牌
replacement:对目标值进行替换洗牌
newvals:合成新的目标值以替代旧值
radamsa:调用 radamsa 进行变异(仅适用于字符串)
TARGET 可以是以下任一值:
strings:字符串类型
nums:数字类型
all:所有类型
Umberto 的大部分功能都可在 lib/Umberto.hs 中使用。使用类型类多态的变异器需要借助 Template Haskell 来打破开放世界假设。该功能位于 Umberto.TH 中,但只应在可执行代码中使用,切勿在库中使用。