返回资讯中心
外部精选
软件工程
#开发者实时流

开发者用1.3亿次变异测试Solana共识解析器,零崩溃

来源标题:Show HN: 130M mutations against Solana's consensus parsers, zero crashes

开发者发布ChainOfFuzz变异模糊测试器,对Solana共识相关解析器累计执行1.3亿次变异测试,未出现崩溃。该工具采用固定种子12648430、可复现计数,每次测试均记录迭代次数、接受与拒绝输入数及捕获的panic数。项目称所有目标均可按钉定的crate版本自行重跑验证。

Hacker News 最新latent-92026/11/11 · 今天8 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

健壮性不是靠什么能跑来证明的,而是靠所有试图破坏它却失败的东西来证明的。

ChainOfFuzz 是一个面向共识相邻解析器的变异模糊测试器。一个引擎,多个目标。每个目标都有自己的回执:运行的迭代次数、接受的输入数、拒绝的输入数、捕获的 panic 数。

理念很简单。守护共识的解析器必须能扛住一个永不疲倦的对手。覆盖率引导的模糊测试器很聪明,这个不聪明。它有耐心、可复现,而且留着回执。

回执只有你自己能重跑才算有效。所有 campaign 都使用下面固定的 crate 版本,同一个引擎,seed 12648430。

重跑:cargo run --release -- <target> <iterations>,默认 seed 12648430。同样的 seed,同样的引擎,同样的计数。

sbpf-elf 那一行是 2026-10-17 的 campaign;该目标运行所依赖的东西此后没有变化,所以它的计数仍然可复现。当时它被独立跑过两次,产生的计数逐位完全相同。另外三个目标在 2026-11-03 各自的种子语料被修复或扩充后重新跑过。

cargo run --release -- <target> <iterations>

examples

cargo run --release -- sbpf-elf 100000000 cargo run --release -- votor-wire 10000000

目标:sbpf-elf、block-component、votor-wire、shred-ingress。不带参数运行可列出全部目标。

发现的问题以触发 panic 的确切输入形式存放在 findings/ 下,按迭代次数命名。一个发现在被证明不是 bug 之前都算 bug。零发现也是一种结果,只要回执说明了你查得有多深。

sbpf-elf:solana-sbpf 的 ELF 解析与校验路径,也就是链上程序部署背后的解析器。种子是 seeds/sbpf-elf/ 中真实的 SPL 程序二进制,加上为每个 sbpf 版本构造的合成最小 ELF。

block-component:block marker 的 wincode 反序列化,这是 leader 与 replay 之间传递 block footer、header 和 update-parent marker 的线格式。种子是为每种变体构造的合成有效 marker,包括携带奖励证书的 footer。

votor-wire:共识投票和证书的手写 unsafe 反序列化,是所有进入 votor 的网络输入的第一道关卡。种子是用固定密钥对生成的合成签名投票消息,因此语料在多次运行之间字节完全相同。

shred-ingress:shred 反序列化,是每个 peer 在 block 存在之前从 turbine 收到的线格式。种子是携带有效 ShredVariant 字节(MerkleData/MerkleCode,proof size 6)的合成 merkle shred,线格式大小精确:data 为 1203 字节,coding 为 1228 字节。该解析器不校验 shred version 字段;turbine 会在下游过滤它。

限制 变异器将输入保持在 64 字节或更大,因此只在更短输入上触发的 panic 是这个引擎触及不到的。 oracle 捕获的是 Rust panic。栈耗尽以及来自 C 依赖的 abort 在这里不算发现。 footer 的种子带有奖励证书;finalization certificate 载荷(VotesAggregate)无法在 solana-entry 的 dev feature 之外构造,因此那条嵌套路径只能通过变异到达。

添加目标 实现 Target trait:一个名称、一个描述、一个种子语料和一个 run 函数。引擎、变异器和 oracle 是共享的。在 targets/mod.rs 中注册它,CLI 就会自动识别。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →