0xCCF4/ufuzz

GitHub: 0xCCF4/ufuzz

首个利用微码覆盖率信息作为反馈指导的后硅 x86 CPU 模糊测试框架,用于在真实处理器上发现微码及推测执行层面的安全漏洞。

Stars: 12 | Forks: 2

# Fuzzilicon 利用微码覆盖率的 x86 CPU 模糊测试器 内部代号:uFuzz ## 概述 uFuzz 是首个利用微码覆盖率信息作为反馈来指导模糊测试活动的 x86 CPU 模糊测试器。有关更多详细信息,请参阅[论文](https://arxiv.org/pdf/2512.23438)。 ## 结构 uFuzz 由三个不同的系统组成: 1. 模糊测试代理:这是运行被测设备的目标设备。我们使用了搭载 Intel Apollo Lake (Celeron, Goldmont) N3350 处理器(`CPUID[1].EAX=0x506ca`)的 [Gigabyte Brix (GB-BPCE-3350C-BWUP)](https://www.gigabyte.com/de/Mini-PcBarebone/GB-BPCE-3350C-rev-10);该设备存在 Red-unlock 漏洞。 2. 模糊测试控制器:该设备用于模拟 USB 存储(用于提供 UEFI 应用程序)和 USB 键盘(用于自动跳过 BIOS 界面),并进一步控制模糊测试代理设备的电源。(Raspberry Pi 4) 3. 模糊测试主控:主要的模糊测试循环在此运行,任务被调度到模糊测试代理设备上执行。(Raspberry Pi 4) ## 项目结构 uFuzz 项目的结构如下: 组件 | 描述 --------------- | ----------- [`corpus-gen`](corpus-gen/) | 生成初始模糊测试输入的语料库。参见论文的评估部分。 [`coverage`](coverage/) | 通过部署微码更新从 CPU 收集微码覆盖率 [`custom_processing_unit`](custom_processing_unit/) | 包含派生自 [CustomProcessingUnit*](https://github.com/pietroborrello/CustomProcessingUnit) 的实用工具函数。 [`data_types`](data_types/) | 包含用于编写自定义微码更新的共享数据类型。 [`fuzzer_data`](fuzzer_data/) | 包含模糊测试代理和模糊测试主控之间共享的数据。 [`fuzzer_device`](fuzzer_device/) | 包含运行在目标设备/CPU 上的模糊测试代理的实现。 [`fuzzer_master`](fuzzer_master/) | 包含控制模糊测试代理的模糊测试主控实现。 [`fuzzer_node`](fuzzer_node/) | 包含模糊测试设备控制器的实现 - 为模糊测试设备模拟 USB 设备。 [`hypervisor`](hypervisor/) | 包含 hypervisor 环境的实现。 [`literature_search`](literature_search/) | 包含通过论文关联搜索相关/关联作品的工具。 [`nix`](nix/) | 包含模糊测试主控和模糊测试控制器的系统定义。 [`performance_timing`](performance_timing/) | 包含用于从模糊测试设备收集计时信息的工具, [`performance_timing_macros`](performance_timing_macros/) | 包含用于自动从目标函数收集计时信息的实用工具宏。 [`spec_fuzz`](spec_fuzz/) | 包含推测性微码模糊测试的实现。 [`speculation_x86`](speculation_x86/) | 包含一些用于检查推测执行行为的测试场景。 [`speculation_ucode`](speculation_ucode/) | 包含一些用于检查推测执行行为的测试场景。 [`ucode_compiler_bridge`](ucode_compiler_bridge/) | 包含用于与 [CustomProcessingUnit*](https://github.com/pietroborrello/CustomProcessingUnit) 中的微码编译器交互的桥接实现,以及用于派生多文件微码更新的预处理器宏。 [`ucode_compiler_derive`](ucode_compiler_derive/)| 包含用于自动生成微码更新的实用工具宏。 [`ucode_compiler_dynamic`](ucode_compiler_dynamic/) | 包含运行时微码更新编译。 [`ucode_dump`](ucode_dump/) | 包含 CPU 的微码转储。 [`uefi_udp4`](uefi_udp4/) | 包含 UDP 的基本 UEFI 驱动程序实现。 [`x86_perf_counter`](x86_perf_counter/) | 包含使用 x86 性能计数器的实现。 [`xtask`](xtask/) | 包含该项目的构建自动化。 \* CustomProcessingUnit:根据 Apache License, Version 2.0 获得许可 ## 安装依赖 要构建和运行 uFuzz 项目,您需要带有 nightly 工具链和 UEFI 目标支持的 Rust 编译器。 ``` # 安装 python (ubuntu/debian);CustomProcessingUnit 微码编译器所需 sudo apt install python3 python3-click # 安装编译器 sudo apt install gcc-aarch64-linux-gnu build-essential git # 安装 rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain none -y # installs rustup rustup install nightly-2025-05-30 # verified to work with the project rustup target add x86_64-unknown-uefi # to compile UEFI applications rustup target add aarch64-unknown-linux-gnu # to compile the fuzzer instrumentor rustup target add x86_64-unknown-linux-gnu # to compile documentation rustup default nightly-2025-05-30 # set the default toolchain to nightly ``` ## 开始使用 下载 [CustomProcessingUnit](https://github.com/pietroborrello/CustomProcessingUnit) 并将其 1. 放置在此文件夹的父目录中,或者 2. 将环境变量 `UASM` 设置为指向 CustomProcessingUnit 中的 `uasm.py` 文件。uFuzz 项目使用 `uasm.py` 脚本来编译微码更新。 然后对 `uasm.py` 应用以下 git 补丁:[uasm.py.patch](ucode_compiler_bridge/uasm.py.patch)。 要部署模糊测试控制器和模糊测试主控,您需要安装 `nix`(按照 安装包管理器)。 进入 [`nix`](nix/) 目录,根据您的需要更改公共 SSH 密钥、IP 等, 并运行以下命令以构建用于树莓派的 SD 卡镜像(`|& nom` 是可选的): ``` nix build .#images.master |& nom nix build .#images.node |& nom ``` 这会为模糊测试主控和模糊测试控制器构建 SD 卡镜像。初始设置完成后, 可以通过在 `nix` 目录中运行(deploy-rs)来部署进一步的更改(`|& nom` 是可选的): ``` nix run |& nom ``` 要构建并部署模糊测试设备的 UEFI 应用程序: ``` HOST_NODE="put IP of the instrumentor here" cargo xtask put-remote --remote-ip {address of fuzzer controller} --source-ip {address of agent} --netmask {network mask} --port {udp port} --startup {app name here} ``` 根据目标模糊测试场景,请使用 `spec_fuzz`(推测性微码模糊测试)或 `fuzzer_device`(x86 指令模糊测试)代替 `{app name here}`。 然后启动模糊测试主控。启动 `fuzzer_master` 应用程序。可以使用 CLI 中的 `--help` 显示设置。 ``` fuzzer_master --help # 主模糊测试应用程序。此应用程序管理并控制整个模糊测试过程,向 fuzzer agent 发出命令(例如在其 CPU 上执行模糊测试输入) # # 用法: fuzz_master [OPTIONS] # # 命令: # genetic 使用(糟糕的)遗传变异算法执行覆盖率模糊测试,您可能更希望执行 `afl` 命令。 == 要求在 agent 上运行 `fuzzer_device` app == # instruction-mutation 建设中 # init 将 fuzzer agent 启动至可用状态 # reboot 重启 fuzzer agent # cap 报告 fuzzer agent 的能力 # performance 从 fuzzer agent 提取性能值 # spec 执行推测性微码模糊测试 == 要求在 agent 上运行 `spec_fuzz` app == # spec-manual 手动执行给定的推测性模糊测试 payload == 要求在 agent 上运行 `spec_fuzz` app == # manual 手动执行单个模糊测试输入 == 要求在 agent 上运行 `fuzzer_device` app == # bulk-manual 执行模糊测试输入语料库;本质上是使用给定目录中的所有文件运行 manual 命令 == 要求在 agent 上运行 `fuzzer_device` app == # afl 使用 AFL 变异执行主模糊测试循环 == 要求在 agent 上运行 `fuzzer_device` app == # help 打印此消息或给定子命令的帮助 # # 选项: # -d, --database 用于保存模糊测试进度和结果的数据库文件;.gz 扩展名启用 gzip 压缩 # --compression 使用 gzip 压缩时的数据库压缩级别 (1-9) [默认: 6] # --dont-reset 不重置地址黑名单 # --instrumentor fuzzer instrumentor 的地址 [默认: http://10.83.3.198:8000] # --agent fuzzer agent 的地址 [默认: 10.83.3.6:4444] # -h, --help 打印帮助 # -V, --version 打印版本 ``` 每个提到的 `fuzz_master` 命令(实验)都包含内置帮助文档,允许您指定参数。例如: - 使用 AFL 变异运行模糊测试活动: ``` fuzz_master afl --help # 使用 AFL 变异执行主模糊测试循环 == 要求在 agent 上运行 `fuzzer_device` app == # # 用法: fuzz_master afl [OPTIONS] # # 选项: # -s, --solutions 将发现结果存储到此路径 # -c, --corpus 使用提供的语料库文件以生成初始模糊测试输入 # -a, --afl-corpus 将模糊测试语料库存储到该路径 # -t, --timeout-hours 在指定小时数后自动结束模糊测试,若未设置则模糊测试不会终止 # -d, --disable-feedback 禁用覆盖率模糊测试反馈;模糊测试反馈将变为随机化 # -p, --printable-input-generation 当不使用 `corpus` 参数时;初始模糊测试输入为随机字节序列;启用此标志后这些字节序列将在可打印的 ASCII 字符中选取 # -h, --help 打印帮助 ``` - 使用纯遗传变异运行模糊测试活动: ``` fuzz_master genetic --help # 使用(糟糕的)遗传变异算法执行覆盖率模糊测试,您可能更希望执行 `afl` 命令。 == 要求在 agent 上运行 `fuzzer_device` app == # # 用法: fuzz_master genetic [OPTIONS] # # 选项: # -c, --corpus 用于生成初始模糊测试输入的语料库文件 # -t, --timeout-hours 在多少小时后应终止模糊测试。如果未提供,则必须通过 CTRL+C 中断模糊测试 # -d, --disable-feedback 禁用反馈循环,模糊测试输入评级将变为随机化 # -h, --help 打印帮助 ``` - 使用推测性微码模糊测试运行模糊测试活动: ``` fuzz_master spec --help # 执行推测性微码模糊测试 == 要求在 agent 上运行 `spec_fuzz` app == # # 用法: fuzz_master spec [OPTIONS] # # 参数: # 数据库路径;将结果保存到此文件 # # 选项: # -a, --all 对从 MSROM 提取的所有指令执行模糊测试 # -s, --skip 跳过已经运行的指令;继续已停止的模糊测试执行 # -n, --no-crbus 跳过所有 CRBUS 相关指令 # -e, --exclude 排除指令列表,不使其通过 fuzzer 运行 # -f, --fuzzy-pmc 将所有 PMC 变体通过 fuzzer 运行;耗时较长 # -h, --help 打印帮助 ``` 模糊测试结果将存储到数据库文件中(可通过 `--database` 参数指定)(模糊测试主控), 并且可以通过运行以下命令进行查看(模糊测试主控): ``` fuzz_viewer database.json.gz ``` 为模糊测试主控提供了以下二进制文件: | 二进制文件 | 描述 | |---------------------|------------------------------------------------------------------------------------------------| | `fuzzer_master` | 主模糊测试控制器,主要模糊测试循环 + 手动执行,使用 `--help` 列出所有选项 | | `fuzz_viewer` | 用于查看和分析数据库中模糊测试结果的工具 | | `fuzz_compare` | 比较来自不同手动模糊测试输入执行的结果 | | `spec_compare` | 分析并比较来自推测执行模糊测试活动的结果 | | `spec_new_database` | 从模板创建新的推测执行数据库(复制排除项) | | `fuzz_combine` | 将多个模糊测试数据库合并为一个输出数据库 | | `afl_convert` | 将 AFL 模糊测试发现的结果转换为可配合手动执行模糊测试工具使用的输入 | ## 文档 使用以下命令生成 Rust 文档: ``` cargo xtask doc ``` 结果将放置在构建目录 `target/doc` 中 ## 实用工具 `cargo xtask` 命令包含一些实用工具,例如,使用 bochs 模拟器在模拟 CPU 上测试 hypervisor 环境;从而简化调试。 ``` cargo xtask emulate hypervisor bochs-intel ``` 使用以下命令列出所有可用的 xtask 命令: ``` cargo xtask --help # 构建与测试辅助程序 # # 用法: xtask # # 命令: # emulate 使用 BOCHS CPU emulator 模拟 UEFI 应用程序 # put-remote 将 UEFI 应用程序推送到远程机器 # control-remote 控制远程机器 # update-node 更新节点的软件、systemd 服务等 # doc 生成文档 # check 编译所有示例和子项目 # help 打印此消息或给定子命令的帮助 # # 选项: # -h, --help 打印帮助 ``` ### 引用我们 最新版本的源代码可以在以下地址找到: 我们的工作已作为[论文](https://arxiv.org/abs/2512.23438)发表在网络与分布式系统安全研讨会 2026 ([NDSS'26](https://www.ndss-symposium.org/ndss-paper/fuzzilicon-a-post-silicon-microcode-guided-x86-cpu-fuzzer/)) 上: ``` @inproceedings{DBLP:conf/ndss/LenzenRWS26, author = {Johannes Lenzen and Mohamadreza Rostami and Lichao Wu and Ahmad{-}Reza Sadeghi}, title = {Fuzzilicon: {A} Post-Silicon Microcode-Guided x86 {CPU} Fuzzer}, booktitle = {33rd Annual Network and Distributed System Security Symposium, {NDSS} 2026, San Diego, California, USA, February 23-27, 2026}, publisher = {The Internet Society}, year = {2026}, url = {https://www.ndss-symposium.org/ndss-paper/fuzzilicon-a-post-silicon-microcode-guided-x86-cpu-fuzzer/}, timestamp = {Tue, 05 May 2026 16:25:44 +0200}, biburl = {https://dblp.org/rec/conf/ndss/LenzenRWS26.bib}, bibsource = {dblp computer science bibliography, https://dblp.org} } ```
标签:CISA项目, CPU模糊测试, CPU漏洞, Fuzzer, Fuzzilicon, Web报告查看器, x86, x86指令集, 可视化界面, 后硅验证, 固件安全, 处理器模糊测试, 微架构安全, 微码更新, 微码覆盖率, 硬件安全, 硬件测试, 芯片安全, 覆盖率反馈, 逆向工具, 通知系统