内核破绽发掘手艺系列(4)——syzkaller(3) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

内核破绽发掘手艺系列(4)——syzkaller(3)

申博_安全防护 申博 97次浏览 未收录 0个评论

这篇文章从syz-manager入手剖析,重要来看看crash复现的历程。syzkaller的运用是经由过程这条敕令:./syz-manager -config=my.cfg

syzkaller\pkg\mgrconfig\testdata目次下供应的示例qemu.cfg以下。

{
    "target": "linux/amd64",
    "http": "myhost.com:56741",
    "workdir": "/syzkaller/workdir",
    "kernel_obj": "/linux/",
    "image": "/linux_image/wheezy.img",
    "sshkey": "/linux_image/ssh/id_rsa",
    "syzkaller": "/syzkaller",
    "disable_syscalls": ["keyctl", "add_key", "request_key"],
    "suppressions": ["some known bug"],
    "procs": 4,
    "type": "qemu",
    "vm": {
        "count": 16,
        "cpu": 2,
        "mem": 2048,
        "kernel": "/linux/arch/x86/boot/bzImage",
        "initrd": "linux/initrd"
    }
}

这些参数的寄义以下(有一些上面的示例中没有)。
http:显现正在运转的syz-manager历程信息的URL
email_addrs:第一次涌现bug时吸收关照的电子邮件地址,只支撑Mailx
workdir:syz-manager历程的事变目次的地位。发生的文件包罗:

  • workdir/crashes/*:crash输出文件
  • workdir/corpus.db:包罗一些递次的语料库
  • workdir/instance-x:每一个VM实例临时文件

syzkaller:syzkaller的地位,syz-manager将在bin子目次中查找二进制文件
kernel_obj:包罗目的文件的目次,比方linux中的vmlinux
procs:每一个VM中的并行测试历程数,一样平常是4或8
image:qemu实例的磁盘镜像文件的地位
sshkey:用于与假造机通讯的SSH密钥的地位
sandbox:沙盒形式,支撑以下形式:

初探BooFuzz

简介 Boofuzz是Sulley模糊测试框架的一个分支和继承者。除了修复了许多错误,boofuzz还提升了可扩展性。主要特性有以下几点: 轻松快速的数据生成方式; 仪表板支持AKA故障检测; 失败后的目标重置; 记录测试数据; 在线文档; 支持任意通信媒介; 内置支持串行模糊测试、以太网、IP层和UDP广播; 更好地记录测试数据——统一、彻底、清晰; 测试结果通过CSV导出; 可扩展的仪器/故障检测; 方便的安装体验; Install ubuntu;基于python2.x sudo apt-get install python-pip
git clone https://github.com/jtpereyda/boofuzz.git
cd boofuzz
sudo pip install . windows: git clone https://github.com/jtpereyda/boofuzz.git
pip install . 模块分析 Session pre_send() 发送数据后开始遍历Pgraph结构,并沿途fuzz每个组件。这个例子以’helo’ requet开头,一旦完成,将开始fuzz “maiL from” request。它通过在每个测试用例前面加上有效的“helo” request来实现。 接下来,将继续fuzz ‘rcpt to’ request。同样,这是通过在每个测试用例前面加上有效的“helo”和“mail from” request来实现的。等到该过程一直到”data” request完成后,又转回到从”ehlo”开始。通过构建的Pgraph

  • none:默许设置,不做任何特别的事变
  • setuid:假装用户nobody(65534)
  • namespace:运用定名空间删除权限(内核须要运用CONFIG_NAMESPACES,CONFIG_UTS_NS,CONFIG_USER_NS,CONFIG_PID_NS和CONFIG_NET_NS构建)

enable_syscalls:测试的体系挪用列表
disable_syscalls:禁用的体系挪用列表
suppressions:已知毛病的正则表达式列表
type:要运用的假造机范例,比方qemu
vm:特定VM范例相干的参数,比方关于qemu来讲参数包罗:

  • count:并行运转的VM数
  • kernel:要测试的内核的bzImage文件的地位
  • cmdline:启动内核的别的敕令行选项,比方root=/dev/sda1
  • cpu:要在VM中模仿的CPU数
  • mem:VM的内存大小,以MB为单元

除config参数之外,syz-manager还可以或许接收debug参数和bench参数。debug参数将VM一切输出打印到console资助我们排查运用中涌现的毛病;bench参数按期将实行的统计信息写入我们指定的文件。
内核破绽发掘手艺系列(4)——syzkaller(3)
main函数中起首启用日记缓存的功用,缓存在内存中的日记不能超过1000行或许1^29个字节。然后加载config文件,猎取操纵体系和架构信息,搜检是不是支撑。还记得syz-sysgen天生的.go文件中的RegisterTarget函数么?这里用GetTarget函数猎取参数对应的target。
内核破绽发掘手艺系列(4)——syzkaller(3)
在qemu.cfg中可以或许看到经由过程disable_syscalls指定消除的syscall,一样可以或许经由过程enable_syscalls指定测试的syscall,若是没有这两个参数默许会fuzz一切的syscall。那末接下来就是经由过程ParseEnabledSyscalls剖析这两个参数,以后就进入RunManager函数中了。
内核破绽发掘手艺系列(4)——syzkaller(3)
内核破绽发掘手艺系列(4)——syzkaller(3)
在RunManager函数中若是config文件中指定的type不为none则建立一个vmpool。将type指定为none是在调试/开辟顶用的,如许manager就不会启动VM而是须要手动启动。
内核破绽发掘手艺系列(4)——syzkaller(3)
一个vmPool可以或许用来建立多个自力的VM。前面在解说团体架构的时刻说过vm.go对分歧的假造化计划供应了一致的接口,这里会挪用到qemu.go的Ctor函数。个中重要搜检了一些参数,以是这里不再睁开。
内核破绽发掘手艺系列(4)——syzkaller(3)
接下来又经由一些初始化操纵以后在一个线程中按期纪录VM状况、crash数目等信息。若是设置了bench参数还要在指定的文件中纪录一些信息。末了挪用vmLoop函数。
内核破绽发掘手艺系列(4)——syzkaller(3)
crash被保存在reproQueue中,经由过程len(reproQueue) != 0推断以后是不是有守候复现的crash。
内核破绽发掘手艺系列(4)——syzkaller(3)

vmIndexes := append([]int{}, instances[len(instances)-instancesPerRepro:]...)
instances = instances[:len(instances)-instancesPerRepro]

这两行代码把instances分红vmIndexes和instances两个局部,vmIndexes对crash举行复现,instances运转新的实例。我们先看Run函数复现局部的代码。在经由一些设置以后,重如果挪用到了repro函数。
内核破绽发掘手艺系列(4)——syzkaller(3)
在repro函数中起首挪用extractProg函数提掏出触发crash的递次。Timeouts有三个取值:10s,1min和5min。10s是用来复现比较简单的crash用的,5min是用来复现前提合作如许比较复杂的crash用的。若是单个递次没法复现,则接纳二分查找的要领找出那些触发crash的递次。依照时候从短到长,从后向前(一般末了一个递次就是触发crash的递次),从单个到多个的递次实验复现出crash。
内核破绽发掘手艺系列(4)——syzkaller(3)
内核破绽发掘手艺系列(4)——syzkaller(3)
若是可以或许胜利复现,则继承挪用minimizeProg函数对其最小化。
内核破绽发掘手艺系列(4)——syzkaller(3)
minimizeProg函数重要挪用了Minimize函数。
内核破绽发掘手艺系列(4)——syzkaller(3)
Minimize函数起首挪用了SanitizeCall函数,由于有些体系挪用须要做一些特别的处置惩罚。
内核破绽发掘手艺系列(4)——syzkaller(3)
内核破绽发掘手艺系列(4)——syzkaller(3)
然后实验逐一移除体系挪用。
内核破绽发掘手艺系列(4)——syzkaller(3)
test中的例子以下,open体系挪用被移除。
内核破绽发掘手艺系列(4)——syzkaller(3)
以后再去除体系挪用的无关参数。
内核破绽发掘手艺系列(4)——syzkaller(3)
在do函数中,依据分歧的参数范例挪用分歧的minimize函数。
内核破绽发掘手艺系列(4)——syzkaller(3)
好比若是参数是指针范例的,把指针或许指针指向的内容置空。
内核破绽发掘手艺系列(4)——syzkaller(3)
内核破绽发掘手艺系列(4)——syzkaller(3)
若是参数是数组范例的,实验一个一个移除数组中的元素。
内核破绽发掘手艺系列(4)——syzkaller(3)
以后,挪用extractC函数提掏出C递次。
内核破绽发掘手艺系列(4)——syzkaller(3)
extractC函数重如果挪用了testCProg函数,后者挪用csource中的Write函数天生C代码,csource中的Build函数编译出可实行文件。比较简单,以是不再详细剖析。
内核破绽发掘手艺系列(4)——syzkaller(3)
内核破绽发掘手艺系列(4)——syzkaller(3)
接下来挪用simplifyProg函数对之前的效果举行简化,simplifyProg函数再次挪用extractC函数提掏出C递次,然后挪用simplifyC函数对提掏出的C递次举行简化。这里简化的是复现crash时设置的一些选项,好比线程、并发、沙盒等等。

内核破绽发掘手艺系列(4)——syzkaller(3)
我们返回到manager.go中,这一局部的代码就剖析完了。鄙人一篇文章中我们将引见vmLoop函数中是怎样举行fuzz的。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明内核破绽发掘手艺系列(4)——syzkaller(3)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址