mjkoo/vitiate
GitHub: mjkoo/vitiate
一款基于 LibAFL 与 SWC 的 JS/TS 覆盖率引导模糊测试工具,解决生态内快速发现崩溃与未定义行为问题。
Stars: 0 | Forks: 0
# Vitiate
JavaScript 和 TypeScript 的覆盖率引导模糊测试工具,作为 Vitest 插件构建。
Vitiate 使用 [SWC](https://swc.rs/) 进行编译时插桩,并使用 [LibAFL](https://github.com/AFLplusplus/LibAFL) 进行基于变异的模糊测试。
在 Vitest 中编写模糊测试,与单元测试一起使用,或使用独立的 CLI 工具进行 libFuzzer 兼容的工作流。
**[文档](https://vitiate.js.org)**
## 快速开始
安装软件包:
```
npm install --save-dev vitiate
```
这将安装 Vitest 插件、独立 CLI 工具以及所有必需的依赖项。
如果只需要 Vitest 插件而不需要 CLI 工具,可以安装 `@vitiate/core`。
配置 Vitest(`vitest.config.ts`):
```
import { defineConfig } from "vitest/config";
import { vitiatePlugin } from "@vitiate/core/plugin";
export default defineConfig({
plugins: [vitiatePlugin()],
test: {
projects: [
{ extends: true, test: { name: "unit", include: ["test/**/*.test.ts"] } },
{ extends: true, test: { name: "fuzz", include: ["test/**/*.fuzz.ts"] } },
],
},
});
```
编写模糊测试(`test/parser.fuzz.ts`):
```
import { fuzz } from "@vitiate/core";
import { parse, ParseError } from "../src/parser.js";
fuzz("parse does not crash", (data: Buffer) => {
try {
parse(data.toString("utf-8"));
} catch (error) {
if (!(error instanceof ParseError)) {
throw error; // re-throw unexpected errors
}
}
});
```
运行模糊器:
```
npx vitiate fuzz
```
或者直接通过 Vitest 运行:
```
VITIATE_FUZZ=1 npx vitest run
```
崩溃信息将保存到 `.vitiate/testdata//crashes/crash-`(其中 `` 是类似 `vxr4kpqyb12fza1gv81bjj8k3i64mlqn-parse_does_not_crash` 的 base32 编码名称)。
正常运行测试套件后,它们会自动作为回归测试进行重放。
将以下内容添加到 `.gitignore`:
```
# Vitiate 缓存语料库(由 fuzzer 再生)
.vitiate/corpus/
# SWC WASM 插件编译缓存(由 Vitiate 的插桩创建)
.swc/
```
## 依赖项模糊测试
要对第三方 npm 包内部的代码进行模糊测试,请使用 [`instrument.packages`](https://vitiate.js.org/reference/plugin-options/#instrumentpackages) 选项。该插件会自动处理所列包的模块内联和转换配置。
## 工作原理
1. **转换阶段**:Vite 的插件钩子在每次导入 JS/TS 模块时,都会通过 SWC 插件进行处理,插入边缘覆盖率计数器和比较跟踪调用。不需要单独的构建步骤。
2. **运行时**:共享的覆盖率映射(在 JS 和 Rust 之间零拷贝)跟踪哪些边缘被命中。
3. **模糊循环**:LibAFL 在每次执行后读取覆盖率映射,评估反馈,更新语料库,并使用 havoc 变异、CmpLog 引导的字节替换、Grimoire 结构感知变异和 Unicode 感知变异生成下一个输入。
4. **崩溃**:导致未捕获异常的输入会被保存为崩溃工件到 `.vitiate/testdata/` 目录下,并自动进行最小化处理。
## 平台支持
提供以下平台的预构建原生二进制文件:
- Linux:x86\_64(glibc、musl)、aarch64(glibc、musl)、armv7(gnueabihf)
- macOS:aarch64(Apple Silicon)
- Windows:x86\_64
需要 Node.js 18 或更高版本,Vite 6+,以及 Vitest 3.1+。
## 软件包
| 软件包 | 描述 |
|---|---|
| `vitiate` | 包含 `vitiate` CLI 二进制文件的包装软件包 |
| `@vitiate/core` | Vitest 插件、模糊 API 和语料库管理 |
| `@vitiate/engine` | 封装 LibAFL 的 Node.js 原生插件(预构建二进制文件) |
| `@vitiate/swc-plugin` | 用于覆盖率插桩的 SWC WASM 插件 |
| `@vitiate/fuzzed-data-provider` | 结构化模糊测试辅助工具(可选) |
标签:fuzz 测试, JavaScript 模糊, JavaScript 生态系统, LibAFL, libFuzzer 兼容, SEO: JavaScript 模糊, SEO: Vitest 插件, SEO: Vitiate 模糊测试, SOC工具, SWC, TypeScript 模糊, Vitest 插件, 代码健壮性测试, 前端安全测试, 单元测试集成, 变异驱动, 可视化界面, 开源模糊器, 数据可视化, 漏洞发现, 独立 CLI, 编译时插桩, 自动化攻击, 覆盖率引导