内核漏洞挖掘技术系列(4)——syzkaller(5)

2019-06-16 约 89 字 预计阅读 1 分钟

声明:本文 【内核漏洞挖掘技术系列(4)——syzkaller(5)】 由作者 houjingyi 于 2019-06-16 08:32:00 首发 先知社区 曾经 浏览数 116 次

感谢 houjingyi 的辛苦付出!

这是内核漏洞挖掘技术系列的第九篇。
第一篇:内核漏洞挖掘技术系列(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。Map键是需要自定义Generate/Mutate的struct/union名称,Map值是将为相应类型调用的自定义Generate/Mutate函数,g是生成随机数、分配内存等的辅助对象,typ是struct/union类型,old是用于Mutate的struct/union的原来的值或用于Generate的nil。函数返回struct/union的新值,以及需要在arg引用之前插入的任何调用。

SpecialTypes map[string]func(g *Gen, typ Type, old Arg) (Arg, []*Call)

在linux系统中下面这些成员是SpecialTypes。

没有SpecialTypes的话调用generateArg函数然后替换掉原来的。

test中的例子如下。
变异array,删除/增加一个byte并更新size或者更新一个byte的值:
mutate4(data ptr[in, array[int8]], size bytesize[data])

变异flag:
mutate5(filename ptr[in, filename], flags flags[open_flags]) fd

变异filename:

变异array,增加一个元素:
mutate3(vec ptr[in, array[int32[0:1]]], vlen len[vec])

变异len:
mutate7(a0 ptr[in, string], a1 len[a0])

变异proc:
mutate8(a0 proc[100, 4, opt])

(mutator的)removeCall函数调用(Prog的)removeCall函数随机移除一个系统调用。

内核漏洞挖掘技术系列关于syzkaller的部分暂时就结束了

关键词:[‘安全技术’, ‘二进制安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now