内核漏洞挖掘技术系列(4)——syzkaller(1)
字数 2242 2025-08-05 08:16:32
Syzkaller 内核漏洞挖掘工具详解
1. Syzkaller 概述
Syzkaller 是 Google 安全团队开发并维护的内核模糊测试工具,被认为是当前最强大的内核 fuzz 工具之一。
1.1 主要特点
- 主要用 Go 语言编写,部分使用 C 代码
- 支持多种操作系统:Linux、Android、FreeBSD、NetBSD、OpenBSD、Windows 等
- 对 Linux 系统的支持最为全面
- 已发现上千个内核漏洞
- 采用覆盖率引导的模糊测试方法
1.2 分支情况
- master 分支:主分支
- long-line 分支
- usb-fuzzer 分支:专门用于挖掘 USB 驱动漏洞的分支
2. 整体架构
2.1 组件组成
- syz-manager:管理整个模糊测试过程
- syz-fuzzer:执行实际的模糊测试
- syz-executor:执行系统调用
2.2 工作流程
- syz-manager 通过 SSH 调用 syz-fuzzer
- syz-fuzzer 和 syz-manager 之间通过 RPC 进行通信
- syz-fuzzer 将输入传给 syz-executor
- syz-executor 执行系统调用并从内核读取代码覆盖率信息
3. 目录结构解析
3.1 主要目录
- Godeps:Go 的依赖包管理
- dashboard:与 syzbot 相关,用于自动报告发现的错误
- docs:文档
- executor:包含 syz-executor 实现
- pkg:核心功能实现
- sys:系统调用描述
- tools:实用工具
- vm:虚拟机管理
3.2 pkg 目录详解
- ast:解析并格式化 sys 文件
- bisect:通过二分查找确定引入漏洞的 commit
- build:构建内核的辅助函数
- compiler:从文本描述生成系统调用
- config:加载配置文件
- cover:处理代码覆盖信息
- csource:生成等价的 C 程序
- db:存储语料库
- gce/gcs:Google 云服务 API 包装
- host:检测主机支持特性
- ifuzz:生成和变异 x86 机器码
- ipc:进程间通信
- kd:Windows 调试相关
- report:处理内核输出和 crash 信息
- repro:crash 复现
- symbolizer:符号处理
- vcs:版本控制辅助函数
- prog:系统调用相关信息
4. 系统调用描述系统
4.1 描述语言
Syzkaller 使用自定义的声明式语言来描述系统调用模板,语法详见 syscall_descriptions_syntax.md。
4.2 生成流程
- syz-extract:从 Linux 源码提取符号常量值,生成
.const文件 - syz-sysgen:根据系统调用模板和
.const文件生成 Go 代码
4.3 系统调用模板位置
/sys/linux/*.txt:特定子系统的系统调用/sys/linux/sys.txt:常规系统调用
5. 更新系统调用模板
5.1 更新步骤
- 比较内核版本间
uapi/*.h的变化:git diff -U0 v4.20 v4.19 include/uapi/*.h | grep "+++" - 修改相应的
.txt文件 - 编译
syz-extract和syz-sysgen - 用
syz-extract生成.const文件 - 运行
syz-sysgen生成代码
5.2 示例:BPF 模块
- 修改
bpf.txt根据linux/include/uapi/linux/bpf.h - 确保内核配置开启
CONFIG_BPF_SYSCALL - 在配置文件中指定
enable_syscalls为bpf
6. 实用工具
6.1 主要工具
- syz-execprog:执行单个或一组程序
- syz-repro:自动化复现 crash
- syz-prog2c:将程序转换为 C 代码
6.2 Crash 复现流程
- 确认引发 crash 的程序:
./syz-execprog -executor=./syz-executor -repeat=0 -procs=16 -cover=0 crash-log - 缩小范围:
./syz-execprog -executor=./syz-executor -repeat=0 -procs=16 -cover=0 single-program - 尝试简化程序(注释系统调用、合并 mmap 等)
- 使用
-threaded=0 -collide=0确认 crash - 转换为 C 程序:
./syz-prog2c program-file
7. 虚拟机支持
7.1 支持的虚拟化方案
- QEMU/KVM
- VMM
- gVisor(Google 轻量沙箱)
- Google 云服务
- Odroid C2
- 远程物理机
7.2 常见问题
编译较老内核启用 KASAN 时可能遇到错误,需要参考相关补丁修改代码。
8. 参考资料
- PanicXNU 3.0
- WSL Reloaded
- Syzkaller crash DEMO
- use-after-free in ip6_setup_cork
- Drill the Apple Core:Up & Down
- Kernel panic when kasan is applied
- Coverage-Guided USB Fuzzing with Syzkaller
- Exploiting the Linux kernel via packet sockets
9. 总结
Syzkaller 是一个功能强大的内核模糊测试框架,通过覆盖率引导的测试方法能够有效发现内核漏洞。其系统调用描述语言和自动化测试流程大大提高了漏洞挖掘的效率。掌握 Syzkaller 的使用和定制方法对于内核安全研究具有重要意义。