内核漏洞挖掘技术系列(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 工作流程

  1. syz-manager 通过 SSH 调用 syz-fuzzer
  2. syz-fuzzer 和 syz-manager 之间通过 RPC 进行通信
  3. syz-fuzzer 将输入传给 syz-executor
  4. 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 生成流程

  1. syz-extract:从 Linux 源码提取符号常量值,生成 .const 文件
  2. syz-sysgen:根据系统调用模板和 .const 文件生成 Go 代码

4.3 系统调用模板位置

  • /sys/linux/*.txt:特定子系统的系统调用
  • /sys/linux/sys.txt:常规系统调用

5. 更新系统调用模板

5.1 更新步骤

  1. 比较内核版本间 uapi/*.h 的变化:
    git diff -U0 v4.20 v4.19 include/uapi/*.h | grep "+++"
    
  2. 修改相应的 .txt 文件
  3. 编译 syz-extractsyz-sysgen
  4. syz-extract 生成 .const 文件
  5. 运行 syz-sysgen 生成代码

5.2 示例:BPF 模块

  1. 修改 bpf.txt 根据 linux/include/uapi/linux/bpf.h
  2. 确保内核配置开启 CONFIG_BPF_SYSCALL
  3. 在配置文件中指定 enable_syscallsbpf

6. 实用工具

6.1 主要工具

  • syz-execprog:执行单个或一组程序
  • syz-repro:自动化复现 crash
  • syz-prog2c:将程序转换为 C 代码

6.2 Crash 复现流程

  1. 确认引发 crash 的程序:
    ./syz-execprog -executor=./syz-executor -repeat=0 -procs=16 -cover=0 crash-log
    
  2. 缩小范围:
    ./syz-execprog -executor=./syz-executor -repeat=0 -procs=16 -cover=0 single-program
    
  3. 尝试简化程序(注释系统调用、合并 mmap 等)
  4. 使用 -threaded=0 -collide=0 确认 crash
  5. 转换为 C 程序:
    ./syz-prog2c program-file
    

7. 虚拟机支持

7.1 支持的虚拟化方案

  • QEMU/KVM
  • VMM
  • gVisor(Google 轻量沙箱)
  • Google 云服务
  • Odroid C2
  • 远程物理机

7.2 常见问题

编译较老内核启用 KASAN 时可能遇到错误,需要参考相关补丁修改代码。

8. 参考资料

  1. PanicXNU 3.0
  2. WSL Reloaded
  3. Syzkaller crash DEMO
  4. use-after-free in ip6_setup_cork
  5. Drill the Apple Core:Up & Down
  6. Kernel panic when kasan is applied
  7. Coverage-Guided USB Fuzzing with Syzkaller
  8. Exploiting the Linux kernel via packet sockets

9. 总结

Syzkaller 是一个功能强大的内核模糊测试框架,通过覆盖率引导的测试方法能够有效发现内核漏洞。其系统调用描述语言和自动化测试流程大大提高了漏洞挖掘的效率。掌握 Syzkaller 的使用和定制方法对于内核安全研究具有重要意义。

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 的变化: 修改相应的 .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 的程序: 缩小范围: 尝试简化程序(注释系统调用、合并 mmap 等) 使用 -threaded=0 -collide=0 确认 crash 转换为 C 程序: 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 的使用和定制方法对于内核安全研究具有重要意义。