目录

  • 一、fuzz
  • 二、syzkaller简介
  • 三、syzkaller整体架构
  • 四、使用syzkaller进行Linux内核漏洞挖掘
    • 环境准备
    • 构建
    • 运行syzkaller

一、fuzz

模糊测试 (fuzz testing, fuzzing)是一种软件测试技术。其核心思想是自动或半自动的生成随机数据输入到一个程序中,并监视程序异常,如崩溃,断言(assertion)失败,以发现可能的程序错误,比如内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。

进行软件漏洞挖掘时,通常有静态分析(staticanalysis)、动态分析(dynamicanalysis)、符号执行(symbolicexecution)、模糊测试(fuzzing)这几种技术手段。

静态分析就是不真正的运行目标程序,但是通过对它进行各种语法、语义、数据流等的分析,来进行漏洞发掘。静态分析是由静态分析软件完成的;它的速度快,但是误报率高。

动态分析就是我们通常见到的大佬们用od一步步跟踪程序运行进行的分析。它的准确率很高,但是需要调试人员丰富的知识储备,而且这种调试方法很难进行大规模的程序漏洞挖掘。

符号执行简单来说,就是试图找到什么输入对应什么样的运行状态,它要去覆盖所有的执行路径。因此,当被分析的程序比较复杂,有很多执行路径时,就会遇到路径爆炸的问题。

模糊测试不需要人过多的参与,也不像动态分析那样要求分析人员有丰富的知识。简单解释,它就是用大量的输入数据自动去执行程序,从而发现哪些输入能够使程序发生异常,进而分析可能存在的漏洞。当前比较成功的fuzzer(执行模糊测试的程序)有AFL、libFuzzer、OSS-Fuzz等。

二、syzkaller简介

syzkaller是google的安全研究人员开发并维护的内核fuzz工具。它主要是用go写的,也有少部分C代码,支持akaros/fuchsia/linux/android/freebsd/netbsd/openbsd/windows等系统,发现的漏洞多达上千。不过它支持最全面的还是linux系统,对其它系统的支持都不同程度差一点,也不支持Darwin/XNU。有研究人员做过移植syzkaller fuzz windows WSL和Darwin/XNU的尝试,也都取得了较好的成果。可以说,syzkaller是当今宇宙最强大的内核fuzz工具了。

三、syzkaller整体架构

syz-manager通过ssh调用syz-fuzzer,syz-fuzzer和syz-manager之间通过RPC进行通信。syz-fuzzer将输入传给syz-executor,从kernel中读取代码覆盖率信息。syz-executor执行syscall系统调用。

我们再看一下代码的整体目录。

  • dashboard目录:主要与syzbot有关,syzbot会自动fuzz linux内核主线分支并向内核邮件列表报告发现的错误。我们可以在https://syzkaller.appspot.com上看到相关的情况。

  • docs目录:相关文档。

  • pkg目录:配置文件。

  • prog目录:目标系统相关信息以及需要执行的系统调用。

  • sys目录:系统调用描述。该目录下的结构如下图。

四、使用syzkaller进行Linux内核漏洞挖掘

环境准备

  • 准备一台linux机器

安装基本软件

sudo apt-get install debootstrap
sudo apt install qemu-kvm
sudo apt-get install subversion
sudo apt-get install git
sudo apt-get install make
sudo apt-get install qemu
sudo apt install libssl-dev libelf-dev
sudo apt-get install flex bison libc6-dev libc6-dev-i386 linux-libc-dev linux-libc-dev:i386 libgmp3-dev libmpfr-dev libmpc-dev
apt-get install g++
apt-get install build-essential
apt install golang-go
apt install gcc
  • 获取syzkaller源码
git clone https://github.com/google/syzkaller.git
  • 获取linux内核代码,可在linux kernel官网下载

https://www.kernel.org/

  • 生成小型Linux发行版所需的镜像(用debootstrap生成)
    这里使用官方提供的构建脚本。实际上我们可以参考脚本内容构建其他发行版的镜像。
wget https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh -O create-image.shchmod +x create-image.sh./create-image.sh

完成后可以看到出现了:stretch.id_rsa、stretch.id_rsa.pub、stretch.img 这几个文件。

构建

  • 编译syzkaller
root@kylinos:~/fuzz-kernel/syzkaller# cd ~/fuzz-kernel/syzkaller/
root@kylinos:~/fuzz-kernel/syzkaller# make
  • 编译kernel
    1、在内核源码目录同级创建目录build
    2、拷贝需要测试系统的内核config到build目录下并改名.config
    3、配置编译内核选项
make O=../build/ menuconfig

4、增加syzkaller测试所需要配置(通过3步的menuconfig进行查找配置,并修改配置。y代表编译到核内)

CONFIG_KCOV=y
CONFIG_DEBUG_INFO=y
CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y
CONFIG_CONFIGFS_FS=y
CONFIG_SECURITYFS=y

5、编译

make O=../build/ -j10

6、在内核源码目录同级创建目录install_path/boot目录
7、安装内核到…/install_path

export INSTALL_PATH=../install_path/boot && export INSTALL_MOD_PATH=../install_path/ && export INSTALL_MOD_STRIP=1 && make modules_install install O=../build
  • 添加内核核外模块到镜像。
root@kylinos:~/fuzz-kernel# ls
kernel  my.cfg  stretch  syzkaller  syzkaller.sh  vm.log
root@kylinos:~/fuzz-kernel# mount stretch/stretch.img /mnt/
mount: /mnt/: /root/fuzz-kernel/stretch/stretch.img 已经挂载.
root@kylinos:~/fuzz-kernel# cp kernel/install_path/lib/modules/5.4.18-32+ /mnt/lib/modules/ -rfa
root@kylinos:~/fuzz-kernel# chroot /mnt/
root@kylinos:/# depmod -a -b . 5.4.18-32+
root@kylinos:/# exit
exit
root@kylinos:~/fuzz-kernel# umount /mnt

运行syzkaller

  • 测试构建镜像是否正常。(使用以下qemu启动命令测试,正常无任何报错进入系统,然后init 0 关机。)
root@kylinos:~/fuzz-kernel# vim syzkaller.sh qemu-system-x86_64 \-kernel /root/fuzz-kernel/kernel/build/arch/x86/boot/bzImage \-append "console=ttyS0 root=/dev/sda debug earlyprintk=serial slub_debug=QUZ" \-hda /root/fuzz-kernel/stretch/stretch.img \-net user,hostfwd=tcp::10021-:22 -net nic \-enable-kvm \-nographic \-m 2G \-smp 2 \-pidfile vm.pid \2>&1 | tee vm.log
  • 运行syzkaller
    编写配置文件
root@kylinos:~/fuzz-kernel# vim ./syzkaller/my.cfg {"target": "linux/amd64","http": "127.0.0.1:56741","workdir": "/root/fuzz-kernel/syzkaller/workdir", #工作目录"kernel_obj": "/root/fuzz-kernel/kernel/build", #内核编译build目录"image": "/root/fuzz-kernel/stretch/stretch.img", #镜像位置"sshkey": "/root/fuzz-kernel/stretch/stretch.id_rsa", "syzkaller": "/root/fuzz-kernel/syzkaller", "procs": 8,"type": "qemu","vm": {"count": 4,"kernel": "/root/fuzz-kernel/kernel/build/arch/x86/boot/bzImage","cpu": 2,"mem": 2048}
}

配置无误后运行syzkaller

root@kylinos:~/fuzz-kernel/syzkaller# ./bin/syz-manager -config=my.cfg

启动成功如图示:

fuzz测试之syzkaller(linux kernel fuzz)相关推荐

  1. Fuzz测试之libfuzzer高频报错问题FAQ

    Fuzz测试之libfuzzer高频报错问题FAQ 场景问题 报错解决 编译阶段 运行阶段 进阶资料 本文小结fuzz测试遇到的高频问题及其解答. 场景问题 Q:fuzz主调函数OneInput/In ...

  2. Fuzz测试之libfuzzer使用小结

    Fuzz测试之libfuzzer使用小结 背景 基本原理 使用方法 主调DEMO 参考资料 背景 项目中,为测试算法的鲁棒性,经常会用到fuzz测试进行压力测试.fuzz测试是一种模糊测试方法,本质是 ...

  3. 【bsauce读论文】2022-CCS-DirtyCred: Escalating Privilege in Linux Kernel

    1. 介绍 简介:本文灵感来自 CVE-2022-0847 DirtyPipe漏洞,不需要绕过现有的防护机制就能成功提权,但问题是只要该漏洞被修补后,就无法再利用,并不通用.所以本文提出了 Dirty ...

  4. 谷歌宣布 Linux Kernel、Kubernetes 0day 漏洞奖励加倍

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 谷歌表示提高对 Linux Kernel.Kubernetes.Google Kubernetes Engine (GKE) 或kCTF 漏洞报 ...

  5. linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项

    Linux kernel debug技巧----开启DEBUG选项 作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧 kernel的source code中有很多使用p ...

  6. linux kernel内存回收机制

    http://www.wowotech.net/linux_kenrel/233.html 无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有 ...

  7. Linux kernel futex.c的bug导致JVM不可用

    JVM死锁导致线程不可用,然后会瞬间起N个线程,当然也是不可用的,因为需要的对象死锁,然后耗尽文件句柄导致外部TCP无法建议拒绝服务,jstack之后就会恢复. 解决办法:替换中间件类库 ,比如htt ...

  8. linux命令注入,Linux kernel本地命令注入漏洞

    Linux kernel本地命令注入漏洞 2005-10-19 eNet&Ciweek Linux kernel 2.2.6 Linux kernel 2.2.5 Linux kernel 2 ...

  9. 编译Linux Kernel(linux-4.19.178)并制作成rpm文件

    目录 一.安装依赖项 二.下载.解压缩.制作.config文件 三.编译内核及打包 四.升级内核 首次尝试编译Linux内核,记录过程,提供Linux Kernel(linux-4.19.178)下载 ...

最新文章

  1. python爬虫换电脑不能运行_python爬虫程序运行失败,求原因
  2. Linux 下安装 Android Studio
  3. 如何处理网络丢包故障?—Vecloud微云
  4. 华月互网获得2012全国十大IDC服务商
  5. CCIE-LAB-第二篇-端口聚合LACP+RSTP
  6. 虚拟化物理服务器参数,浅谈部署VMware物理系统虚拟化技术P2V(Physical to Virtual)
  7. asp.net mysql 论坛源码,基于asp.net的BBS论坛
  8. 第一个Java程序示例——Hello World!【转】
  9. Iris数据集可视化
  10. cmd命令行乱码 oracle_Oracle查询中文乱码问题
  11. rs232接口_串口,COM口,TTL,RS232,RS485,UART的区别详解
  12. 如何将ts格式文件转成MP4格式文件
  13. 美团校招,百度校招经历
  14. Kademlia详解
  15. 汉语教学备课工具推荐
  16. GdPicture.NET SDK Crack,提供多种打印功能
  17. 烽火十八台丨从3.15曝光的食品安全问题看供应链网络安全防护
  18. 11.2.5 云计算、大数据时代
  19. 计算机四级怎么算通过,计算机四级是如何规定的,怎样算合格?
  20. 立法保障交通权 日本交通政策基本法是如何制定的?

热门文章

  1. ifconfig、ip addr、ip route用法总结
  2. Zuul和Gateway请求IO模型比对(WebFlux优势)以及Reactor模型分析
  3. 3月8号女神节送什么礼物好?女神节礼物分享
  4. C# asp.net手机验证码登录,获取验证码(网页版)
  5. 亚马逊卖家转战独立站如何做
  6. Hive SQL执行mapreduce任务卡在Kill Command
  7. python工作岗位有哪些-请问掌握Python可以去哪些岗位?
  8. 2023年京东618预售数据:传统滋补成预售黑马,预售额超27亿
  9. 如何阅读他人的程序代码
  10. FormData 解析