Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
silifuzz — 通过从软件代理生成测试输入来模糊测试 CPU 实现,然后在真实硬件上执行这些测试,以检测微架构缺陷和勘误。 | Kitploit
工具/GitHubGitHub/google/silifuzz
漏洞分析模糊测试硬件安全二进制分析
GitHubgoogle/silifuzz

silifuzz

通过从软件代理生成测试输入来模糊测试 CPU 实现,然后在真实硬件上执行这些测试,以检测微架构缺陷和勘误。

查看仓库
416382天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SiliFuzz - 通过代理对 CPU 进行模糊测试

什么是 SiliFuzz

SiliFuzz 是一种通过模糊测试软件代理(如 CPU 模拟器或反汇编器)来发现 CPU 缺陷的系统,然后大规模地在真实 CPU 上执行累积的测试输入(称为 corpus)。SiliFuzz 仍在开发中,详情请参阅论文。

术语

软件模糊测试与覆盖率

模糊测试是一种使用大量即时生成的测试输入来测试目标(应用程序或 API)的技术。其目标是让这些输入尽可能有趣且多样化,以触发极端情况。换句话说,模糊测试旨在最大化组合代码覆盖率。代码覆盖率可能有不同的含义,例如执行了哪些基本块,或者程序采用了哪些路径。

代理(Proxy)

就 SiliFuzz 而言,代理是任何在目标 CPU 的某些方面表现相似的软件或硬件系统。例如 CPU 模拟器或反汇编器。当我们无法直接从目标收集覆盖率信息时,就需要代理。

通过将模糊测试技术应用于代理,我们可以生成一系列在代理中产生有趣行为的测试输入(corpus)。我们的基本假设是,这些输入会在目标中产生类似的有趣行为。更多信息请参阅文档。

语料库(Corpus)/ 语料分片(Corpus shard)

用于测试目标的输入集合称为 corpus。

一个相当规模的 corpus 包含数百万个输入,通常被分割成多个互不重叠的块,称为 shards。

快照(Snapshot)

SiliFuzz 快照描述了一小段 CPU 指令序列,以及 CPU 寄存器和内存的初始状态,以便确定性执行该序列。一个典型快照包含不到 100 字节的代码,运行时间为微秒级,但也可以任意大。快照以 silifuzz.proto.Snapshot 协议缓冲区形式存储。

快照通常由模糊引擎生成的输入创建。用于 CPU 测试时,这些输入会被过滤,以消除所有非确定性的快照。更多信息请参阅文档。

预期结束状态(Expected end state)

结束状态描述了快照执行结束时预期存在的寄存器和内存内容。如果快照在不同 CPU 微架构上的执行结果不同,则它会有多个预期结束状态。

Snap

Snap 是 Snapshot 的内存表示形式,可被 Runner 轻松加载和执行。Snap 通常由读取运行器从磁盘加载。Snap 的磁盘格式与内存格式基本相同,只是将原生指针替换为偏移量。详情请参阅此头文件。这种格式通常称为 relocatable(可重定位)。每个 Snap 恰好包含一个预期结束状态,即 Snap 是微架构特定的。更多信息请参阅文档。

Runner

Runner 是用于测试单个 CPU 核心的二进制程序。runner 消费一个 corpus 分片,反复执行其中的随机 Snap,并检查是否达到预期结束状态。Runner 是单线程进程。

编排器(Orchestrator)

编排器是一个驱动多个 runner 的进程。在典型场景中,编排器会持续为每个逻辑 CPU 核心执行一个 runner,并汇总和报告各个 runner 进程产生的任何失败。

支持的平台和微架构

支持的微架构列表请参阅此文件。

SiliFuzz 运行在 x86_64 和 aarch64 Linux 系统上。它已在 Linux 内核 5.x 和 6.x 版本上测试过。不保证与较旧内核版本兼容。必须关闭旧版 vsyscall ABI,以避免误报。

战果(Trophies)

SiliFuzz 发现的错误(bugs)和缺陷(defects)的非详尽列表。

错误(Bugs)

逻辑错误是特定 CPU 微架构或步进(stepping)固有的无效 CPU 行为。SiliFuzz 已识别出以下错误:

  • CVE-2021-26339
  • Erratum #1386
  • Erratum #1468
  • 针对 ARM Neoverse V2 的 Erratum #3442699
  • 针对 ARM Cortex-X3 的 Erratum #3213672

缺陷(Defects)

(电气)缺陷是指只发生在一个或几个芯片上的无效 CPU 行为。SiliFuzz 发现了我们在论文中描述的以下缺陷:

  • F2XM1 缺陷。 论文 / 附录 A
  • 非法指令过冲。 论文 / 附录 B
  • FCOS 计算错误。 论文 / 附录 C
  • 缺少 x87 数据指针更新。 论文 / 附录 D

相关项目

  • Centipede 是 Google 开发的模糊测试引擎,用于对大型且运行缓慢的目标(如 CPU 模拟器)进行模糊测试。

准备工作

准备工作(适用于 Bazel)

root@kitploit:~
git clone https://github.com/google/silifuzz.git && cd silifuzz
SILIFUZZ_SRC_DIR=`pwd`
./install_build_dependencies.sh  # Currently, works for the latest Ubuntu only.
bazel build -c opt @silifuzz//tools:{snap_corpus_tool,fuzz_filter_tool,snap_tool,silifuzz_platform_id,simple_fix_tool_main} \
     @silifuzz//runner:reading_runner_main_nolibc \
     @silifuzz//orchestrator:silifuzz_orchestrator_main
SILIFUZZ_BIN_DIR=`pwd`/bazel-bin
cd "${SILIFUZZ_BIN_DIR}"

注意:您可以使用 Docker 容器来避免污染宿主系统:docker run -it --tty --security-opt seccomp=unconfined --mount type=bind,source=${SILIFUZZ_SRC_DIR},target=/app ubuntu:noble /bin/bash -c "cd /app && ./install_build_dependencies.sh && bazel build ... && bazel test ..."

准备工作(模糊测试 Unicorn 目标)

对于 Bazel,请使用以下命令。

root@kitploit:~
cd "${SILIFUZZ_SRC_DIR}"
COV_FLAGS_FILE="$(bazel info output_base)/external/fuzztest+/centipede/clang-flags.txt"
bazel build -c opt --copt=-UNDEBUG --dynamic_mode=off \
  --per_file_copt=unicorn/.*@$(xargs < "${COV_FLAGS_FILE}" |sed -e 's/,/\\,/g' -e 's/ /,/g') @//proxies:unicorn_x86_64
bazel build -c opt @fuzztest//centipede:centipede
mkdir -p /tmp/wd

# Fuzz the Unicorn proxy under Centipede 1000 times with parallelism of 30.
"${SILIFUZZ_BIN_DIR}/external/fuzztest+/centipede/centipede" \
  --binary="${SILIFUZZ_BIN_DIR}/proxies/unicorn_x86_64" \
  --workdir=/tmp/wd \
  -j=30 --num_runs=1000

注意:请参阅 Centipede 文档,了解如何高效运行模糊测试引擎。

工具

silifuzz_platform_id

该辅助工具用于检查您正在运行的计算机是否受支持。

root@kitploit:~
$ ${SILIFUZZ_BIN_DIR}/tools/silifuzz_platform_id --short
root@kitploit:~
intel-skylake

注意:SiliFuzz 的 CPU 检测逻辑未考虑某些受支持 CPU 的桌面变体。在这种情况下,该工具会报告“Unsupported platform”。

fuzz_filter_tool

fuzz_filter_tool 将原始指令转换为 Snap 兼容的 Snapshot。当转换可行时返回 0,否则返回 1。该接口与 Centipede 的 input_filter 兼容。

root@kitploit:~
fuzz_filter_tool raw_input_sequence

raw_input_sequence 文件包含原始指令,将使用 InstructionsToSnapshot 转换为 Snapshot 格式。

示例用法:

root@kitploit:~
# INC EAX
echo -en '\xFF\xC0' > /tmp/inc_eax && ./tools/fuzz_filter_tool /tmp/inc_eax
echo $?
0

snap_tool

snap_tool 用于检查和操作二进制 Snapshot 协议缓冲区。它可以选择加载原始指令并将其转换为 Snapshot。

root@kitploit:~
echo -en '\xFF\xC0' > /tmp/inc_eax
./tools/snap_tool --raw print /tmp/inc_eax
root@kitploit:~
Metadata:
  Id: inc_eax
  Architecture: x86_64 Linux
  Completeness: complete
Registers:
  gregs (non-0 only)
    rax = 0x20000000
    ....

simple_fix_tool

simple fix 工具接收来自 Centipede 的模糊测试结果,将原始指令转换为没有结束状态的快照,为快照添加结束状态,最后将快照打包成包含分片的可重定位 snap 语料库。

目前它作为不可重启的进程在单台主机上运行,所有内容都放入内存,因此可处理的语料库大小受主机可用内存限制。由于结束状态是在主机上生成的,生成的语料库是单架构的。

hashtest_generator

实验性功能:哈希测试是随机化的结构化测试,将熵推入随机生成的指令中,并尽可能高效地捕获生成的输出。这种方法基于一个观察:相当比例的缺陷可以通过以正确的输入调用正确的指令来检测。哈希测试有针对性地攻击这一类简单缺陷,为 SiliFuzz 提供实验性的比较点。目前仅支持 x86_64。

例如,如果您想在 /tmp/hashtest 目录中生成包含 Skylake 处理器支持的指令的 30k 个哈希测试快照,可以运行以下命令。

root@kitploit:~
mkdir -p /tmp/hashtest && bazel run -c opt @silifuzz//fuzzer/hashtest:hashtest_generator -- --platform=intel-skylake -n 30000 --outdir /tmp/hashtest

常见问题

本文档的其余部分以 “How-to” 方式组织,每个问题描述一个典型用例。问题的顺序代表了所尝试任务复杂度的递增。每一步通常需要理解上一步获得的产物(有时两者都需要)。

注意:本文档假设 x86_64 主机/目标 CPU。确切的输出可能因 CPU 厂商/步进/等以及环境(如 Docker/KVM)而异。

警告:下面的许多指令将以运行用户的权限执行任意二进制代码。该工具会尽力使用 seccomp(2) 对代码进行沙箱隔离。请自行承担使用风险。

如何创建一个简单的快照

root@kitploit:~
# INC EAX
$ echo -en '\xFF\xC0' > /tmp/inc_eax
$ ./tools/snap_tool --raw  --out=/tmp/inc_eax.pb make /tmp/inc_eax
root@kitploit:~
# CPUID
$ echo -en '\x0F\xA2' > /tmp/cpuid
$ ./tools/snap_tool --raw --out=/tmp/cpuid.pb make /tmp/cpuid
root@kitploit:~
<error log omitted>
Could not load snapshot: INTERNAL: Tracing failed: Banned instruction: CPUID

注意:为避免非确定性结果,SiliFuzz 的多个部分会排除某些类别的指令,例如上面的 CPUID。

如何检查快照

root@kitploit:~
$ ./tools/snap_tool print /tmp/inc_eax.pb
root@kitploit:~
Metadata:
  Id: inc_eax
  Architecture: x86_64 Linux
  Completeness: complete
Registers:
  gregs (non-0 only):
    rax = 0x20000000
    rip = 0xeb85c12b000
    <omitted>
End states (1):
  Endpoint:
    Instruction address: 0xeb85c12b002
  Platforms:
    intel-skylake
  Registers (diff vs snapshot's initial values):
    gregs (modified only):
      rax = 0x20000001
      rip = 0xeb85c12b002
      <omitted>

注意 RAX 寄存器的结束状态值是 0x20000001(0x20000000+1,正好是 INC EAX 所做的)。还要注意 RIP 值是最初的 +2,即 INC EAX 指令的大小。

如何从 proto 运行快照

root@kitploit:~
$ ./tools/snap_tool play /tmp/inc_eax.pb
root@kitploit:~
Snapshot played successfully.

如何将单个快照转换为(可重定位的)语料库

注意:您需要指定目标平台才能生成语料库。在本示例中,生成的语料库面向其生成时所在的平台。

root@kitploit:~
$ cd "${SILIFUZZ_BIN_DIR}"
$ PLATFORM_ID=$(./tools/silifuzz_platform_id --short)

$ ./tools/snap_tool generate_corpus /tmp/inc_eax.pb \
--target_platform="${PLATFORM_ID}" > /tmp/inc_eax.corpus

# Will play the same "INC EAX" snapshot 1M times
$ ./runner/reading_runner_main_nolibc /tmp/inc_eax.corpus

您可以使用 gdb 检查该进程:

root@kitploit:~
$ gdb ./runner/reading_runner_main_nolibc
root@kitploit:~
(gdb) b RestoreUContextNoSyscalls
(gdb) run /tmp/inc_eax.corpus
Starting program: .../reading_runner_main_nolibc /tmp/inc_eax.corpus

Breakpoint 1, 0x0000456700010598 in RestoreUContextNoSyscalls ()
(gdb) x/i 0xeb85c12b000 # same as the rip value produced by snap_tool print above
   0xeb85c12b000:       inc    %eax

如何从模拟器创建语料库

注意:此步骤依赖于前面描述的“模糊测试 Unicorn 目标”步骤。

将模糊测试结果 corpus.* 转换为当前架构的 10 分片可运行语料库。

root@kitploit:~
cd "${SILIFUZZ_BIN_DIR}"

"${SILIFUZZ_BIN_DIR}/tools/simple_fix_tool_main" \
  --num_output_shards=10 \
  --output_path_prefix=/tmp/wd/runnable-corpus \
  --runner="${SILIFUZZ_BIN_DIR}/runner/reading_runner_main_nolibc" \
  /tmp/wd/corpus.*

语料库分片将位于 /tmp/wd/runnable-corpus.*

如何检查语料库文件

root@kitploit:~
$ ./tools/snap_corpus_tool list_snaps /tmp/inc_eax.corpus
...
I0000 00:00:1661887744.019079 4074672 snap_corpus_tool.cc:155] inc_eax

注意:这是目前一个非常基础的工具,仅提供几个命令。

如何调用 runner 扫描单个 CPU 核心

root@kitploit:~
# Will play the same "INC EAX" snapshot on CPU#1 10k times.
$ ./runner/reading_runner_main_nolibc \
    --cpu=1 --num_iterations=10000 /tmp/inc_eax.corpus

如何扫描 CPU 的所有核心

编排器将循环遍历 --shard_list_file 参数指定的文件中列出的所有分片。

root@kitploit:~
$ ls -1 /tmp/wd/runnable-corpus.* > /tmp/wd/shard_list
$ echo 'version: "local_corpus"' > /tmp/wd/corpus_metadata
# Will repeatedly run the corpus on all available CPU cores for 30s using
# /tmp/wd/runnable-corpus.* selected randomly.
$ ${SILIFUZZ_BIN_DIR}/orchestrator/silifuzz_orchestrator_main --duration=30s \
     --runner=${SILIFUZZ_BIN_DIR}/runner/reading_runner_main_nolibc \
     --shard_list_file=/tmp/wd/shard_list \
     --corpus_metadata_file=/tmp/wd/corpus_metadata

注意:编排器还可以加载以 .xz 结尾的 XZ 压缩语料库分片。

下载工具