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, 编译时插桩, 自动化攻击, 覆盖率引导