恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

syzkaller 伪系统调用(Pseudo-syscalls)实战指南:原理、编写规范与完整接入流程

  • 首页
  • 资讯中心
  • /
  • syzkaller 伪系统调用(Pseudo-syscalls)实战指南:原理、编写规范与完整接入流程

相关资讯

express-validator ValidationChain 完全指南:内置校验器、净化器与修饰器精讲 2026/10/10 5:10:09
Claude Code 接入 Google 搜索 MCP:让 AI 编程助手拥有实时信息能力 2026/10/10 5:10:09
企业AI代理可控部署:从数据安全到成本优化的实践指南 2026/10/10 5:10:09

最新资讯

JESD204B配置——从硬件到逻辑配置
PaddleX 多硬件模型贡献指南:NPU/XPU/DCU/MLU 模型适配与提交流程全解析
google-drive-ocamlfuse 元数据缓存一致性:`DriveMetadataRefresh.get_metadata` 的刷新与变更对账机制深度解析
鸿冠特材规模怎么样
idea 引入公司内部中转站openAI
2026 人才盘点联动绩效结果,4 种盘点数据落地业务路径

今日推荐

Codex 总用英文回答?从 AGENTS.md 到 config.toml 的中文输出调优指南
OpenClaw 自定义插件开发完整指南(2026最新版):从 TypeScript 到 npm 发布
基于Spark的电影推荐系统全链路实战:从爬虫到Web展示

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

syzkaller 伪系统调用(Pseudo-syscalls)实战指南:原理、编写规范与完整接入流程

发布时间:2026/10/10 5:10:09
syzkaller 伪系统调用(Pseudo-syscalls)实战指南:原理、编写规范与完整接入流程 网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/sy/syzkaller点击查看免费下载本文面向 syzkaller 内核模糊测试器的开发与研究者系统讲解伪系统调用pseudo-syscalls的设计动机、适用边界与完整接入流程。通过本文读者将掌握在executor/common*.h中编写syz_前缀 C 函数、在linuxSyscallChecks中注册可用性检查、生成描述并配套sys/OS/test测试的完整方法同时理解为什么官方在多数场景下不推荐使用伪系统调用。原文docs/pseudo_syscalls.md及其中文翻译docs/translations/zh_CN/pseudo_syscalls.md为本篇的主体骨架仓库内执行器、系统调用描述与测试源码作为实现层面的佐证。什么是伪系统调用除了常规系统调用之外系统调用描述文件即 syzlang 描述的*.txt文件中还可以包含伪系统调用。伪系统调用本质上是定义在执行器executor中的 C 函数当测试程序使用某个伪系统调用时执行器会在生成的 C 程序中直接内联该伪系统调用的函数代码。伪系统调用的存在使测试程序可以携带一段执行特定操作的特定代码块而不是只能逐条调用裸系统调用。同时它们也经常被用作对底层原始系统调用的、更利于模糊测试的包装器wrapper。典型例子见下文 io_uring 伪系统调用它把io_uring_setup与一系列mmap操作打包成一个函数让模糊器不需要自行拼出正确的 mmap 长度参数。为什么官方不推荐使用使用伪系统调用通常是不被建议的原因在于它破坏了声明式描述syzlang的所有优势声明性系统调用描述是纯声明式的行为一目了然简洁性描述文件简洁无冗余 C 代码模糊器全方面控制所有参数、资源、依赖关系都由模糊器按描述生成而非埋在 C 代码里全局逻辑改进的可能性例如资源类型、校验和、长度字段等可以统一优化静态检查描述可以被编译器静态检查更少的 bug描述越少出错面越小。此外伪系统调用还带来了维护负担、不可复用性每个目标系统都要单独维护并会使C 重现器C reproducers更长重现代码必须包含整个伪系统调用函数体。不过syzlang 的表达能力并不足以覆盖所有可能场景因此是否使用伪系统调用需要根据具体情况逐一权衡额外收益有多大、代码量有多少、是否有扩展 syzlang 本身来覆盖该场景的可能性等。如何向执行器添加伪系统调用第一步确定代码放置位置首先考虑伪系统调用的适用范围以及它涉及的系统和子系统。执行器包含一组固定的 C 头文件executor/common*.h伪系统调用的代码全部存放在这些头文件中。在创建新文件之前先检查新伪系统调用是否可以放进现有的某个文件。例如如果新的伪系统调用是 Linux 特有的那么 executor/common_linux.h 就是合适的放置位置同理BSD 系列头文件、Fuchsia、Windows 等平台各有对应的common_*.h。仓库中实际的头文件集合包括common.h、common_linux.h、common_bsd.h、common_fuchsia.h、common_windows.h、common_openbsd.h等见 executor 目录。第二步编写函数体一个真正的伪系统调用函数可能看起来像下面这样#if SYZ_EXECUTOR || __NR_syz_mycall /* Add all the necessary #include and #define headers */ static long syz_mycall(volatile long a0, volatile long a1) { /* Function body */ } #endif编写时需要满足以下硬性要求函数名必须以syz_开头参数个数可变但每个参数的类型必须是volatile long返回类型必须是long确保函数满足所有编译要求能够成功编译用条件编译宏#if SYZ_EXECUTOR || __NR_syz_mycall包裹其中__NR_syz_mycall由make generate生成用于保证仅在执行器构建或描述引用该调用时编译这段代码。为什么参数和返回类型必须是long因为伪系统调用最终会被转换成接受long的函数指针来调用使用long可以避免潜在的调用约定问题。为什么需要volatile这一点很有意思许多 libc 函数都用各种参数约束做了注解例如此参数不应为NULL、该参数必须是有效的文件描述符。C 重现器可能用常量参数调用这些函数而编译器可能发现某些约束被违反比如把NULL传给non-NULL参数或者把-1作为文件描述符传入从而产生错误或警告。volatile能防止这类误报。第三步在linuxSyscallChecks中注册可用性为了正确处理伪系统调用需要更新 pkg/vminfo/linux_syscalls.go 中的linuxSyscallChecks为该系统调用添加特定情况并在必要时启用它。linuxSyscallChecks是一个从系统调用名映射到检查函数的表其底层调用链位于 pkg/vminfo/linux_syscalls.go 的(linux) syscallCheck它先查表取出对应检查函数若表中不存在则回退到默认的实际执行系统调用探测逻辑在目标 VM 中运行一个只关心ENOSYS的测试程序来探测支持情况若检查函数返回非空字符串则说明该系统调用在当前环境不受支持。如果你想无条件启用某个伪系统调用直接为它使用alwaysSupported即可——该函数在 pkg/vminfo/syscalls.go 中实现简单返回空字符串表示总是支持。仓库中实际大量使用了这一模式例如syz_io_uring_setup: alwaysSupported, syz_io_uring_submit: alwaysSupported, syz_io_uring_complete: alwaysSupported, syz_clone: alwaysSupported, syz_clone3: alwaysSupported, syz_open_pts: alwaysSupported, syz_execute_func: alwaysSupported, syz_create_resource: alwaysSupported,完整列表见 pkg/vminfo/linux_syscalls.go。如果伪系统调用只在特定硬件或内核特性存在时才可用则需要像syz_kvm_setup_cpulinuxSyzKvmSupported、syz_usb_connectlinuxCheckUSBEmulation、syz_mount_imagelinuxSyzMountImageSupported那样编写条件检查函数返回表示支持、返回非空字符串表示不支持的原因。第四步运行make generate并编写描述最后在仓库根目录运行make generate重新生成执行器代码与系统调用描述所需的常量包括__NR_syz_mycall等。此后就可以在系统调用描述文件中像使用普通系统调用一样使用它了syz_mycall(arg0 pid, arg1 const[0])以仓库中的 io_uring 伪系统调用为例其描述位于 sys/linux/io_uring.txtsyz_io_uring_setup(entries int32[1:IORING_MAX_ENTRIES], params ptr[inout, io_uring_params], ring_params_ptr ptr[out, ring_params_ptr], ring_ptr ptr[out, ring_ptr], sqes_ptr ptr[out, sqes_ptr]) fd_io_uring对应的 C 实现在 executor/common_linux.h 中它完成了io_uring_setup调用、根据内核返回的sq_off/cq_off偏移计算环形缓冲区大小、执行两次mmap映射 SQ/CQ 环形区与 SQEs并初始化 SQ array。正如描述文件中的注释所说io_uring_setup之后紧跟着用mmap映射 ring 和 sqes模糊器很难用自己生成的 mmap 长度参数拼出正确程序因此这个包装器保证了长度的正确计算——这正是伪系统调用作为更测试友好的原始系统调用包装器的典型例证。每个参数用注释与 syzlang 描述一一对应例如// syzlang: syz_io_uring_setup(entries int32[1:IORING_MAX_ENTRIES], params ptr[inout, io_uring_params], ring_params_ptr ptr[out, ring_params_ptr], ring_ptr ptr[out, ring_ptr], sqes_ptr ptr[out, sqes_ptr]) fd_io_uring // C: syz_io_uring_setup(uint32 entries, struct io_uring_params* setup_params, void** ring_params_ptr_out, void** ring_ptr_out, void** sqes_ptr_out) // returns uint32 fd_io_uring同一个伪系统调用也可以注册多个变体以$后缀区分例如syz_io_uring_modify_offsets$generic与syz_io_uring_modify_offsets$flags见 sys/linux/io_uring.txt分别用不同的 flags 集合约束偏移量取值范围帮助模糊器更容易生成合法程序。外部依赖限制伪系统调用的实现不能使用任何外部库或外部头文件除了一些最基本、最标准的库例如unistd.h和sys/mman.h。特别是不能依赖附加软件包安装的库或头文件不能依赖最近新增内核子系统的头文件。外部依赖已被证明是脆弱的很容易导致构建中断因为模糊测试器上任何构建与运行、以及任何 C 重现器都需要所有依赖项。举例来说软件包或头文件可能在某些发行版上缺失、命名不同、版本错误、损坏或与其他头文件冲突。不幸的是目前没有办法可靠地为 C 程序指定这类依赖和要求。因此如果伪系统调用需要某些结构体、常量或辅助函数的定义应尽可能简短地在执行器代码中自行描述这些定义会成为 C 重现器的一部分。从仓库实现中可以看到这一原则的实际应用例如 executor/common_linux.h 中 io_uring 实现仅引入sys/mman.h、unistd.h并自行#define IORING_OFF_SQ_RING 0ULL、IORING_OFF_SQES 0x10000000ULL而非依赖外部头文件。测试要求每个新的伪系统调用应该在sys/OS/test中至少有一个测试OS替换为目标系统名如sys/linux/test。测试本身就是一段检查系统调用返回值的程序。具体要求如下至少有一个测试包含使用该伪系统调用的**主要成功场景**main successful scenario这类测试至关重要因为它们能确保伪系统调用的代码不包含愚蠢的错误例如每次都因 NULL 解引用而崩溃确保模糊器能够组合出成功场景伪系统调用与周围描述的搭配并保证该功能在未来持续可用。仓库中的 sys/linux/test/io_uring 是一个很好的范例它完整走了一遍创建实例 → 修改标志 → 提交 SQE → 进入内核等待完成 → 取出 fd → 关闭的成功路径# Create an io_uring instance r0 syz_io_uring_setup(0xF00, ...) # Set IORING_CQ_EVENTFD_DISABLED. Has no side-effect for the test, # only tests syz_io_uring_modify_offsets(). syz_io_uring_modify_offsets$flags(r1, r2, 0x38, 0x1) # Write an openat2 operation to the submission queue syz_io_uring_submit(r1, r2, r3, AUTOIORING_OP_OPENAT2{...}) # Notify the kernel about the submission and wait until completion io_uring_enter(r0, 0x1, 0x1, 0x1, 0x0, 0x0) # Get the resulting fd from the completion queue r4 syz_io_uring_complete(r1, r2) # Close the file close(r4)同类测试还有 sys/linux/test/io_uring_large大容量 SQ 配置场景以及基于同一组伪系统调用的 sys/linux/test/ublk。这些测试文件也印证了文档中测试只是检查系统调用返回值的程序的说法它们用#注释描述每个步骤的意图并用返回值变量如r0、r4串联后续调用任何一步返回异常值都会导致测试失败。关于这些测试的详细机制例如它们如何被执行、如何检查返回值请参见 系统调用描述的测试 一节。完整接入流程速查综合以上内容向 syzkaller 添加一个伪系统调用的完整步骤为评估必要性确认 syzlang 无法表达该场景且额外收益大于维护成本与 C 重现器膨胀的代价。选择位置根据目标系统把 C 实现放入合适的executor/common*.hLinux 放 executor/common_linux.h。编写函数以syz_开头参数volatile long、返回long用#if SYZ_EXECUTOR || __NR_syz_xxx包裹只依赖标准库头文件。注册可用性在 pkg/vminfo/linux_syscalls.go 的linuxSyscallChecks中为该调用添加条目无条件支持用alwaysSupported有条件支持则编写专用检查函数。生成与描述运行make generate然后在sys/linux/*.txt描述文件中按 syzlang 语法声明该伪系统调用及其参数/资源类型。编写测试在sys/linux/test下新增至少一个包含主要成功场景的测试文件确保调用链可稳定运行。验证确保执行器与描述均能编译、测试通过且实现无外部依赖。按此流程新增的伪系统调用即可被模糊器当作普通系统调用参与程序生成与变异同时具备经得起长期运行的测试保障。赞分享网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/sy/syzkaller点击查看免费下载相关推荐syzkaller 伪系统调用Pseudo-syscalls完全指南从 executor 实现到 syzlang 描述与测试syzkaller 伪系统调用Pseudo syscalls完全指南从 executor 实现到 syzlang 描述与测试 伪系统调用pseudo s网络安全开发工具质量保障syzkaller KVM 模糊测试实战x86/amd64 SYZOS 虚拟化约束与伪系统调用编写指南syzkaller KVM 模糊测试实战x86/amd64 SYZOS 虚拟化约束与伪系统调用编写指南 本文是 syzkaller 仓库中面向 LLM Age网络安全开发工具质量保障syzkaller 贡献指南从系统调用描述到 Pull Request 的完整实战流程syzkaller 贡献指南从系统调用描述到 Pull Request 的完整实战流程 本篇指南围绕 syzkaller 官方贡献文档展开系统梳理了一个外部网络安全开发工具质量保障上一篇如何参与Tetragon开源安全项目完整贡献指南下一篇【亲测免费】 Fay 开源数字人框架教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号