这是内核漏洞挖掘技术系列的第九篇。
第一篇:内核漏洞挖掘技术系列(1)——trinity
第二篇:内核漏洞挖掘技术系列(2)——bochspwn
第三篇:内核漏洞挖掘技术系列(3)——bochspwn-reloaded(1)
第四篇:内核漏洞挖掘技术系列(3)——bochspwn-reloaded(2)
第五篇:内核漏洞挖掘技术系列(4)——syzkaller(1)
第六篇:内核漏洞挖掘技术系列(4)——syzkaller(2)
第七篇:内核漏洞挖掘技术系列(4)——syzkaller(3)
第八篇:内核漏洞挖掘技术系列(4)——syzkaller(4)
在上一篇文章中我们主要分析了一遍进行fuzz的流程,一直追踪到了系统调用的执行。这一篇文章我们主要介绍Generate和Mutate的具体实现。回到loop函数中,我们接下来看看Generate和Mutate的部分。Generate函数随机生成含有ncalls个系统调用的程序。
跟进generateCall函数,r.target.Syscalls是RegisterTarget函数初始化的。如果有ChoiceTable调用上一篇文章说过的Choose函数选择一个,然后调用generateParticularCall函数继续根据系统调用号生成具体的系统调用类型。
依次调用了generateParticularCall->generateArgs->generateArg->generateArgImpl,generateArgImpl函数只是生成了参数本身而并没有生成具体的内容,后续调用不同的generate函数进行不同的处理。
比如对于指针类型,随机生成一个特殊的值或者正常的值。
这里的特殊值可能是0x0000000000000000这样的空指针,0xffffffffffffffff这样没有映射到的内核地址或者是0x9999999999999999这样不规范的地址。
对于数组类型,根据数组长度是否有指定的范围随机生成数组的长度,再根据数组的类型调用对应的generateArg函数生成每个元素的值。
Generate的部分分析完成之后我们来接着分析Mutate的部分。Mutate部分会随机选择下面几种变异类型。
squashAny函数对参数进行压缩,因为能够压缩参数的情况比较少,所以可能性是最低的。test中的例子如下。
之前:
`foo$any0(&(0x7f0000000000)={0x11,0x11223344,0x2233,0x1122334455667788,{0x1,0x7,0x1,0x1,0x1bc,0x4},[{0x0,@res32=0x0,0x0,@i8=0x44,"aabb"},{0x0,@res64=0x1,0x0,@i32=0x11223344,"1122334455667788"}]})`,
之后:
`foo$any0(&(0x7f0000000000)=ANY=[@ANYBLOB="1100000044332211223300000000000088776655443322113d0079230000000000000000",@ANYRES32=0x0,@ANYBLOB="00000000000000000000000044aabb000000000000000000",@ANYRES64=0x1,@ANYBLOB="000000000000000044332211112233445566778800000000"])`,
splice函数克隆一份系统调用拼贴到原来的中间再移除拼贴后的后半部分。
insertCall函数插入系统调用。
test中的例子如下。
(mutator的)mutateArg函数调用(Target的)mutateArg函数对参数进行变异,在(Target的)mutateArg函数中根据不同的类型调用不同的mutate函数。
这里的处理方式和前面Generate的部分比较相似,有一些类型甚至是直接调用regenerate函数调用generateArg函数然后替换掉原来的。比如对于flag类型其实就是int类型,变异的方法包括加一个随机数,减一个随机数和异或一个随机数。对于struct/union类型来说首先会检测是否含有SpecialTypes特殊的类型。SpecialTypes允许对某些struct/union类型进行定制的Generate/Mutate。在linux系统中下面这些成员是SpecialTypes。
没有SpecialTypes的话调用generateArg函数然后替换掉原来的。
test中的部分例子如下。
变异flag:
变异filename:
变异array:
变异len:
变异proc:
(mutator的)removeCall函数调用(Prog的)removeCall函数随机移除一个系统调用。
内核漏洞挖掘技术系列关于syzkaller的部分暂时就结束了。