syzkaller 黑盒测试1:环境搭建

news2024/11/15 13:56:03

syzkaller 黑盒测试1:环境搭建

  近期需要使用syzkaller对某Linux发行版系统内核进行测试,但是未提供内核源码,只能在黑盒条件下测试。这是笔者第一次接触syzkaller,对测试流程不太熟悉。另外,网上很少有syzkaller黑盒测试的内容,所以在此记录以下。可以预见,黑盒测试之后还会有很多难点,如适应性函数评估、崩溃信息搜集等,后续内容或许在后期能够记录。

ps: 中间因为一些事情拖更了,可能有部分细节遗忘,但主要问题应该都有描述。有疑问的读者朋友可以评论区讨论。

环境配置

环境准备

syzkaller 在安装前,需要一些依赖环境(包、go环境等)。国内的go环境需要换源,否则可能连接不稳定,而且速度较慢

如果准备在docker环境中运行,可以直接使用官方提供的镜像,只需要另外安装go环境即可。

syzkaller install

环境配置好后,安装过程比较简单:

git clone https://github.com/google/syzkaller
cd syzkaller
make

编译后的文件在syzkaller/bin中,可以将其添加到环境变量,方便以后直接使用。

虚拟机配置

  1. 准备好待测试的虚拟机镜像

  2. 使用qemu-img为虚拟机建立一个虚拟磁盘

    qemu-img create -f qcow2 disk_name size
    qemu-img create -f qcow2 ubuntu.qcow2 20G	# example
    
  3. 启动虚拟机,安装镜像

    安装脚本示例:(部分现代系统需要图形化安装界面才能启动,可以使用VNC远程连接)

    #! zsh
    qemu-system-x86_64 \
        -smp 6,cores=3,threads=2 \
        -enable-kvm \
        -m 4G \
    	-drive file=test.qcow2,format=qcow2,if=virtio \
    	-cdrom /data/downloads/test.iso \
    	-machine usb=on \
    	-device usb-tablet \
    	-vnc :0 \
    	-cpu host \
    	-daemonize
    
  4. 为虚拟机配置SSH端口映射

    -netdev user,id=net0,restrict=on,hostfwd=tcp:127.0.0.1:10022-:22
    
  5. 虚拟机配置SSH相关信息(注册公钥等)注意:一定要注册一个公钥,并验证登录,syzkaller使用公钥连接SSH

syzkaller 试启动

在选定的测试目录下,创建my.cfg syzkaller 配置文件

{
  "target": "linux/amd64",		# 目标架构
  "http": "127.0.0.1:8080",		# syzkaller 监控终端的IP和端口号
  "workdir": "/data/exp/workdir",	# 工作目录,用于存放corpus, crash等
  # "kernel_obj": "/root/kernel_test/linux",	# kernel object文件,黑盒测试没有
  "image": "/data/exp/test.qcow2",	# 虚拟机镜像文件路径
  "sshkey": "/root/.ssh/id_rsa",	# 注册的SSH key对应私钥
  "syzkaller": "/root/syzkaller",	# syzkaller home
  "cover": false,					# 不使用coverage导向,因为黑盒环境镜像编译时默认不适用kcov
  "procs": 8,				# 每个虚拟机中并行的进程数
  "type": "qemu",			# qemu mode
  # "enable_syscalls": [	# 限制syscall范围,后面测试会用到
  #     "open$proc",
  #     "read$proc",
  #     "write$proc",
  #     "close$proc"
  # ],
  "vm": {					# vm配置
    "count": 4,				# 虚拟机总数,一般4台,根据服务器资源配置
	"image_device": "drive format=qcow2,if=virtio,file=",	# 镜像文件附加参数,可以允许现代接口,如virtio等,这些参数会被syzkaller内部整合
    "cpu": 2,				# 虚拟机CPU数
    "mem": 2048				# 内存大小(MB)
  }
}
  • 有关参数配置的详细内容,参见源码config

使用以下命令启动:

syz-manager -config=my.cfg

若启动失败,可使用-debug选项导出启动虚拟机所用的参数,在单独环境中测试排查。

若启动成功,进入运行状态,也可从web端监控syzkaller状态
在这里插入图片描述

若成功启动,可以退出。注意:目前syzkaller无法捕获任何warning或panic,原因在后面会说到

崩溃测试

syzkaller的原理是监听dmesg内核消息,通过正则表达式分析dmesg中新出现的内核信息,可以捕获warning, panic, KASAN等消息

本节,我们将手动注入一个内核驱动漏洞,验证syzkaller能否捕获这个漏洞。

驱动编写

编写一个字符设备驱动,使用WARNING触发内核警告,以模拟漏洞。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#include <linux/slab.h>

#define MY_DEV_NAME "panic_test"
#define DEBUG_FLAG "PROC_TEST_DEV: "
MODULE_AUTHOR("Zheng");
MODULE_LICENSE("Dual BSD/GPL");

int test_open (struct inode *, struct file *);
ssize_t test_read (struct file *, char __user *, size_t, loff_t *);
ssize_t test_write (struct file *, const char __user *, size_t, loff_t *);


static struct file_operations my_drv = {
	.open = test_open,
	.read = test_read,
	.write = test_write,
};

int test_open (struct inode * test_inode, struct file * test_file) {
	// Do nothing
	return 0;
}

ssize_t test_read (struct file *test_file, char __user *buf, size_t size, loff_t *offset)
{
	// panic
	WARN(1, DEBUG_FLAG"device read invoked, panic\n");
	return (ssize_t)size;
}

ssize_t test_write (struct file *test_file, const char __user *buf, size_t size, loff_t *offset)
{
	// panic
	WARN(1, DEBUG_FLAG"device write invoked, panic\n");
	return (ssize_t)size;
}

int __init test_init(void)
{
	struct proc_dir_entry *test_entry;
	const struct file_operations *my_fops = &my_drv;
	
	test_entry = proc_create(MY_DEV_NAME, S_IRUGO|S_IWUGO, NULL, my_fops);
	if (!test_entry)
		printk(DEBUG_FLAG "proc init failed\n");
	printk(DEBUG_FLAG "panic test drive is up");
	return 0;
}

module_init(test_init);

  • 该驱动程序将在/proc内创建一个名为panic_test的文件,对该文件进行读写操作,都会触发系统Warning,可以用echo命令+重定向手动触发测试
  • 以上程序基于kernel v4开发,ubuntu20.04及以后的内核相关接口有变化,具体驱动参考panic_proc

驱动编译、加载

使用Makefile编译

ifneq ($(KERNELRELEASE),)
	obj-m := panic_test.o
else
	KERN_DIR ?= /home/zheng/Temp/osFuzz/4.19.90-24.4.v2101.ky10.x86_64
	PWD := $(shell pwd)
default:
	$(MAKE) -C $(KERN_DIR) M=$(PWD) modules
endif
clean:
	rm -rf *.o *.o.d *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order *.mod Module.symvers

关于将驱动加载进内核的操作,请参见我的另一篇博客Linux modules-load 启动时加载驱动模块

驱动测试

在一个终端中使用dmesg -w命令监视内核消息,再另一个终端中执行:

echo "1" > /proc/panic_test

不出意外的话,可以看到dmesg监控终端捕获到了Warning,并显示了back trace(图中是Panic,大体类似)

在这里插入图片描述

syzkaller测试

增加规则

syzkaller/sys/linux下增加一条panic_test.txt接口配置,

include <linux/fs.h>
 
open$proc(file ptr[in, string["/proc/panic_test"]], flags flags[proc_open_flags], mode flags[proc_open_mode]) fd
read$proc(fd fd, buf buffer[out], count len[buf])
write$proc(fd fd, buf buffer[in], count len[buf])
close$proc(fd fd)
 
proc_open_flags = O_RDONLY, O_WRONLY, O_RDWR, O_APPEND, FASYNC, O_CLOEXEC, O_CREAT, O_DIRECT, O_DIRECTORY, O_EXCL, O_LARGEFILE, O_NOATIME, O_NOCTTY, O_NOFOLLOW, O_NONBLOCK, O_PATH, O_SYNC, O_TRUNC, __O_TMPFILE
proc_open_mode = S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH

重新编译

首先使用syz-extract工具将txt配置转换为.const文件,该工具需要提前编译

cd syzkaller
make bin/syz-extract
syz-extract -os linux -sourcedir "header_dir" -arch amd64 panic_test.txt

接下来,将文件转为go文件,供syzkaller直接使用,并重新编译syzkaller

syz-sysgen
make TARGETOS=linux TARGETARCH=amd64

运行syzkaller

将配置文件中enable_syscalls的注释删除,限定只测试这些syscall,加快实验效率

如果正常工作,应当马上发现crash,并开始复现过程

但是,由于qemu mode的一些机制,syzkaller捕获不到dmesg消息

修改 syzkaller

经过分析,qemu mode的syzkaller需要内核源码文件手动编译,使用配套的create-image.sh创建文件系统,并在其中进行测试,在启动时增加参数earlyprintk,将dmesg信息打印到serial中,syzkaller直接读取,获得信息。

但是,黑盒测试中,我们无法做到(因为没有kernel object文件),所以需要使用SSH监听dmesg这与isolated mode相同

qemu.go文件中的Run函数开头,增加以下内容(部分是原有代码):

func (inst *instance) Run(timeout time.Duration, stop <-chan bool, command string) (
	<-chan []byte, <-chan error, error) {

	// Listening on remote dmesg (for blackbox fuzzing only)
	argsDmesg := append(vmimpl.SSHArgs(inst.debug, inst.sshkey, inst.port), inst.sshuser+"@localhost")
	dmesg, err := vmimpl.OpenRemoteConsole("ssh", argsDmesg...)
	if err != nil {
		return nil, nil, err
	}

	rpipe, wpipe, err := osutil.LongPipe()
	if err != nil {
		dmesg.Close()
		return nil, nil, err
	}

	inst.merger.Add("ssh", rpipe)
	inst.merger.Add("dmesg", dmesg)
    ...
}

以上代码将SSH连接监控dmesg也作为消息源加入管道,使syzkaller能够捕获消息

修改完后,编译测试,能够捕获到测试驱动的warning信息。

问题和解决方案

RPC connection failed

After SSH connection is established,fail to create an RPC client, conncetion refused

Edit target SSH security policy, /etc/ssh/sshd_config

AllowTcpForwarding yes

then restart SSH Service

aller能够捕获消息**

修改完后,编译测试,能够捕获到测试驱动的warning信息。

问题和解决方案

RPC connection failed

After SSH connection is established,fail to create an RPC client, conncetion refused

Edit target SSH security policy, /etc/ssh/sshd_config

AllowTcpForwarding yes

then restart SSH Service

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言版扫雷——从0到1实现扫雷小游戏

&#x1f412;博客名&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;有志者&#xff0c;事竟成&#xff0c;破釜沉舟&#xff0c;百二秦关终属楚&#xff1b;苦心人&#xff0c;天不负&#xff0c;卧薪尝胆&#xff0c;三千越甲可吞吴。 扫雷思维导图 目录 扫雷思维…

9_2、Java基本语法之常用类日期、时间类的使用

一、JDK 8之前时间日期API jdk8之前的日期时间类 1.System的currentTimeMillis() 2.java.util.Date以及子类java.sql.Date 3.SimpleDateFormat 4.Calender类&#xff1a;日历类 1、获取系统当前时间&#xff1a;System类下的currentTimeMillis(); //返回的是当前时间与1970年…

MySQL--整合Keepalived进行双机热备自动切换(升级版)

原文网址&#xff1a;MySQL--整合Keepalived进行双机热备自动切换&#xff08;升级版&#xff09;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL整合Keepalived进行双机热备自动切换&#xff08;升级版&#xff09;。 服务器要考虑高可用问题。nginx、tomcat、缓存、队列、数…

Java开发的古董拍卖系统竞标系统拍卖网

简介 古董展品拍卖网站 用户可以注册成为买家也可以申请开店成为卖家&#xff0c;发布古董展品&#xff0c;设置拍卖起止时间进行展品的拍卖。如果早于拍卖开始时间或者晚于拍卖结束时间&#xff0c;则不可以竞拍。多人竞拍&#xff0c;买家可以根据最高价设置谁中标&#xff…

系分 - 结构化方法【概念】

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 系分 - &#xff08;概念&#xff09;结构化方法 结构化方法贯穿整个软件工程全部&#xff0c;可以单独细分出来作为某个软件工程环节的技术指引 结构化方法&#xff0c;由结构化分析&#xff08;SA&#xff0c;St…

【C语言进阶】速学,不会用数据库可不能再错过文本与二进制文件操作

目录 ✨前言✨&#xff1a; &#x1f388;一、文本文件与二进制文件&#x1f388;&#xff1a; &#x1f381;二、文件读取结束的判定&#x1f381;&#xff1a; 1.错误使用 feof 函数&#xff1a; 2.判断文件读取结束&#xff1a; &#x1f38a;三、文件缓冲区&#x1f38…

Ubuntu虚拟机图文安装详细教程

Hello, 小伙伴们&#xff0c;大家好&#xff01;今天教大家一步一步进行ubuntu虚拟机的安装。俗话说的好&#xff1a;“工欲善其事必先利其器”&#xff0c;作为一名嵌入式软件开发人员&#xff0c;我们必须熟悉Linux系统的操作及使用&#xff0c;熟练掌握Linux系统下的开发&am…

java 接口的私有方法

其实java8就已经做下伏笔了 在拥有静态和默认 两种拥有方法体的方法之后 接口出现私有方法也是一种必然 然后我们来创建一个包 包下创建一个接口 subInterface 参考代码如下 public interface subInterface {private void show2() {System.out.println("我是一个私有方…

头条权重在线查询,头条号增加权重的4个妙招

头条号权重可以简单理解为头条号指数&#xff0c;刚开通头条号的时候&#xff0c;会根据头条号的领域、介绍等等给予相应的权重。后期会根据账号使用情况进行调整权重&#xff0c;提高或者降低。 头条权重在线查询方法 打开“站长工具”之后&#xff0c;输入网站网址。…

LeetCodeday04

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3…

JavaScript篇.day08-DOM,节点,事件,定时器,位置及坐标

目录 1.DOM 2.DOM相关操作 (1)获取元素 (2)操作元素 (3)操作元素属性 (4)操作元素类名 (5)操作元素样式 3.节点操作 4.事件 5.事件传播 6.定时器 7.位置及坐标 1.DOM Document Object Model 文档对象模型一整套操作文档流相关内容的属性和方法可以做的操作: 修改样…

前端框架搭建(六)搭建页面框架【vite】

1.安装所需依赖 需要安装 vue-routernaive视图框架 npm npm install vue-router4 yarn yarn add vue-router4npm i -D naive-ui2.搭建naive适配框架 创建文件夹——存放通用组件 在components下创建文件夹common 全局配置常用组件 在之前创建的global.d.ts中添加Window…

枚举的应用

枚举&#xff1a; 在数学和计算机科学理论中&#xff0c;一个集的枚举是列出某些有穷序列集的所有成员的程序&#xff0c;或者是一种特定类型对象的计数。这两种类型经常&#xff08;但不总是&#xff09;重叠。 [1] 是一个被命名的整型常数的集合&#xff0c;枚举在日常生活…

基于CAS操作的atomic原子类型

原子操作 C A S (compare And Swap&#xff09;也叫比较交换&#xff0c;是一种无锁原子算法&#xff0c;映射到操作系统就是一条cmpxchg硬件汇编指令&#xff08;保证原子性)&#xff0c;其作用是让CPU将内存值更新为新值&#xff0c;但是有个条件&#xff0c;内存值必须与期望…

站长权重在线查询,怎么查询网站权重是多少?

什么是网站权重 当站长们辛辛苦苦建立起来一个网站&#xff0c;怎么才能知道自己的网站在搜索引擎中的权重情况呢&#xff1f; 对于很多人而言&#xff0c;权重这个词可能听到最多的场景就是淘宝京东店铺权重。淘宝或京东会根据商家网店的浏览量、好评率、转化率、是否…

4A(统一安全管控平台)解析

4A是指帐号&#xff08;Account&#xff09;、认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;和审计&#xff08;Audit&#xff09;&#xff0c;4A统一安全管控平台是以身份为中心&#xff0c;实现帐号、认证、授权和审计统一管控的安…

Spark注意事项

一、Spark理解 数据的操作只有两种 大数据领域中对数据的操作只有两种:聚合 & 处理 无论是多华丽算法,最终都是这两个平平无奇的操作组合而成的 action理解 在spark中,一个action操作为一个jobId(在源码中可以看到runjob 是只有在action操作后才会调用) , 所以一个…

Mac内存空间不足导致无法安装Ventura?可用这些方法释放储存空间

安装Macos新版系统Ventura需要非常多的内存空间&#xff0c;本身我们的Mac磁盘空间就掣襟肘见&#xff0c;我们又该如何释放Mac磁盘空间来安装Ventura呢&#xff1f;今日&#xff0c;小编将分享一些能够释放大量Mac内存空间的方法&#xff0c;以便大家能够优化Mac的运行速度外还…

摄影基础笔记

https://www.icourse163.org/learn/UESTC-1001958013?tid1450439527#/learn/content 这里写目录标题景深 焦距 光圈视角快门测光 感光度构图井字曝光色温白平衡光光的强度光的方向色彩色相明度饱和度色相环反差影调手机瞬间后期处理景深 焦距 光圈 当我们把镜头对着一个景物聚…

Annoconda常见用法

打开conda命令行窗口 点击开始&#xff0c;选择A-选择Anaconda里面的prompt 查看环境 conda env list #查看虚拟环境 创建环境 conda create -n 虚拟环境名字 python3.8 #创建虚拟环境 python3.8 指定python版本 激活环境 conda activate 虚拟环境名字 #进入虚拟环境 …