🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

定向模糊测试 sgzeng/pbfuzz

DeepSeek Harness
sgzeng31 天前有提交已提供中文文档扫描:含敏感能力

指向目标仓库与漏洞线索,自动跑出可复现的 PoV 输入

41.7/100
综合分
14
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add sgzeng/pbfuzz
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · security
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包pbfuzz-dsh(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 02:20:01

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 64 处,展示前 56 条)
  • 执行外部命令来自配置/变量
    dsh-tests/global-setup.ts:46
    const result = spawnSync(cmd, args, { encoding: 'utf8', ...options, env: { ...process.env, ...options.env } })
  • 读取本地文件
    dsh-tests/global-setup.ts:65
    return (JSON.parse(readFileSync(join(dir, 'node_modules/@deepseek-ai/dsh/package.json'), 'utf8')) as { version: string }).version
  • 删除本地文件递归
    dsh-tests/global-setup.ts:89
    rmSync(dshDir, { recursive: true, force: true })
  • 写入本地文件
    dsh-tests/global-setup.ts:90
    mkdirSync(dshDir, { recursive: true })
  • 写入本地文件
    dsh-tests/global-setup.ts:101
    mkdirSync(dist)
  • 读取本地文件
    dsh-tests/global-setup.ts:104
    const file = readdirSync(dist).find(name => name.startsWith(prefix))
  • 读取本地文件
    dsh-tests/global-setup.ts:119
    if (!existsSync(join(home, 'profiles', PROFILE, 'package.json'))) throw new Error('dsh plugin add did not create the profile')
  • 删除本地文件递归
    dsh-tests/global-setup.ts:122
    return () => { rmSync(scratch, { recursive: true, force: true }) }
  • 写入本地文件
    dsh-tests/harness.ts:44
    mkdirSync(userHome)
  • 删除本地文件递归
    dsh-tests/harness.ts:63
    rmSync(home, { recursive: true, force: true })
  • 写入本地文件
    dsh-tests/helpers.ts:58
    mkdirSync(join(campaignDir, 'state'), { recursive: true })
  • 写入本地文件
    dsh-tests/helpers.ts:59
    writeFileSync(join(root, 'target.py'), TARGET)
  • 写入本地文件
    dsh-tests/helpers.ts:61
    writeFileSync(campaignPath, [
  • 读取本地文件
    dsh-tests/pier.spec.ts:67
    const state = () => JSON.parse(readFileSync(join(campaignDir, 'state', 'state.json'), 'utf8')) as { phase: string; pier_round: number; poc?: unknown }
  • 读取本地文件
    dsh-tests/pier.spec.ts:86
    const metrics = JSON.parse(readFileSync(join(campaignDir, 'state', 'metrics.json'), 'utf8'))
  • 读取本地文件
    dsh-tests/settings.spec.ts:29
    const patch = readFileSync(join(dsh.profileDir, 'cordis.patch.yml'), 'utf8')
  • 写入本地文件
    packages/dsh-kanalyzer/src/index.ts:92
    await mkdir(expandHome(source().install.installDir, homedir()), { recursive: true }).catch(() => { })
  • 读取本地文件
    packages/dsh-kanalyzer/src/index.ts:132
    for (const dir of readdirSync(root)) {
  • 读取本地文件
    packages/dsh-kanalyzer/src/index.ts:134
    const parsed = parseSkillFile(readFileSync(path, 'utf8'))
  • 读取本地文件
    packages/dsh-pbfuzz/src/engine-bridge.ts:32
    const dir = candidates.find((d): d is string => d !== undefined && d !== '' && existsSync(join(d, 'pbfuzz_engine', 'rpc.py')))
  • 执行外部命令来自配置/变量
    packages/dsh-pbfuzz/src/engine-bridge.ts:53
    const run = spawnSync(command, ['-c', 'import sys; print(sys.version_info >= (3, 11))'], { encoding: 'utf8', timeout: 1_500 })
  • 执行外部命令来自配置/变量
    packages/dsh-pbfuzz/src/engine-bridge.ts:209
    const child = spawn(python, [...ENGINE_ARGV], {
  • 执行外部命令固定命令
    packages/dsh-pbfuzz/src/env-verify.ts:67
    const child = spawn('/bin/sh', ['-c', command], {
  • 读取本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:147
    if (!existsSync(path)) return undefined
  • 读取本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:148
    const st = statSync(path)
  • 写入本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:150
    chmodSync(path, st.mode | 0o111)
  • 读取本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:169
    return existsSync(path) ? path : undefined
  • 读取本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:185
    try { entries = readdirSync(dir, { withFileTypes: true }) } catch { return false }
  • 读取本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:192
    try { if (statSync(path).mtimeMs > mtimeMs) return true } catch { }
  • 读取本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:212
    const binMtime = statSync(bin).mtimeMs
  • 写入本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:269
    mkdirSync(scratchParent, { recursive: true })
  • 写入本地文件
    packages/dsh-pbfuzz/src/env-verify.ts:273
    writeFileSync(inputPath, Buffer.alloc(0))
  • 删除本地文件递归
    packages/dsh-pbfuzz/src/env-verify.ts:293
    rmSync(dir, { recursive: true, force: true })
  • 写入本地文件
    packages/dsh-pbfuzz/src/guards.ts:145
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    packages/dsh-pbfuzz/src/guards.ts:146
    appendFileSync(path, `${JSON.stringify(entry)}\n`)
  • 读取本地文件
    packages/dsh-pbfuzz/src/host.ts:90
    return JSON.parse(readFileSync(path, 'utf8')) as T
  • 写入本地文件
    packages/dsh-pbfuzz/src/host.ts:111
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    packages/dsh-pbfuzz/src/host.ts:113
    writeFileSync(tmp, content)
  • 写入本地文件
    packages/dsh-pbfuzz/src/host.ts:114
    renameSync(tmp, path)
  • 读取本地文件
    packages/dsh-pbfuzz/src/host.ts:194
    const currentMtime = existsSync(cached.path) ? statSync(cached.path).mtimeMs : undefined
  • 读取本地文件
    packages/dsh-pbfuzz/src/host.ts:194
    const currentMtime = existsSync(cached.path) ? statSync(cached.path).mtimeMs : undefined
  • 读取本地文件
    packages/dsh-pbfuzz/src/host.ts:205
    if (!existsSync(pointer)) return undefined
  • 读取本地文件
    packages/dsh-pbfuzz/src/host.ts:206
    const named = readFileSync(pointer, 'utf8').split('\n').map(l => l.trim()).find(l => l !== '') ?? ''
  • 读取本地文件
    packages/dsh-pbfuzz/src/host.ts:212
    const dir = isAbsolute(named) ? named : [join(cwd, root, named), resolve(cwd, named)].find(d => existsSync(d))
  • 读取本地文件
    packages/dsh-pbfuzz/src/skills.ts:110
    if (!existsSync(skillsDir)) return []
  • 读取本地文件
    packages/dsh-pbfuzz/src/skills.ts:112
    for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
  • 读取本地文件
    packages/dsh-pbfuzz/src/skills.ts:116
    if (!existsSync(file)) continue
  • 读取本地文件
    packages/dsh-pbfuzz/src/skills.ts:117
    const skill = parseSkill(readFileSync(file, 'utf8'), file)
  • 读取本地文件
    packages/dsh-pbfuzz/src/tools.ts:254
    entries = readdirSync(abs, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-pbfuzz/src/tools.ts:322
    size = statSync(e.abs).size
  • 读取本地文件
    packages/dsh-pbfuzz/src/tools.ts:330
    content = readFileSync(e.abs, 'utf8')
  • 读取本地文件
    packages/dsh-pbfuzz/src/tools.ts:361
    const fileCount = readdirSync(join(repo, rel), { withFileTypes: true }).filter(e => e.isFile()).length
  • 读取本地文件
    packages/dsh-pbfuzz/src/tools.ts:1123
    return readdirSync(dir, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-pbfuzz/src/tools.ts:1147
    if (!existsSync(path!) || !statSync(path!).isFile()) throw new Error(`pbfuzz_fuzz: generator_path ${path!} is not a file`)
  • 写入本地文件
    packages/dsh-pbfuzz/src/tools.ts:1159
    mkdirSync(target, { recursive: true })
  • 写入本地文件
    packages/dsh-pbfuzz/src/tools.ts:1161
    writeFileSync(path, content)
扫描于 2026/11/2(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 生成可复现PoV输入

面向 PoV 生成的智能体定向模糊测试

README

由 DeepSeek 最新模型翻译生成
pbfuzz-dsh PBFuzz(CCS'26 的智能体定向模糊测试器)以插件形式提供给 DeepSeek Harness (DSH)。 把智能体指向目标仓库和一个 bug(CVE、补丁、崩溃堆栈,或者只给 file:line),它就会跑定向模糊测试循环,直到产出一个经过验证的 Proof-of-Vulnerability 输入。 快速开始 Ubuntu 22.04/24.04 x86-64,Node.js ≥ 22,Python ≥ 3.11 1. 配置 DeepSeek Harness —— 参照官方文档安装 DSH,并配置你的 DeepSeek API key。使用这些插件验证过的 DSH 版本(见 HARNESS_COMMIT 里的 DSH_VERSION);npm 的 latest 可能超出它们的 peer 范围。 2. 从 npm 安装 pbfuzz npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add @pbfuzz/dsh-pbfuzz 就这些:包里自带 Python 引擎、它的 schema 和 PyYAML。 然后用 npx @deepseek-ai/dsh@0.2.0-rc.2 web 启动 DSH。
展开完整文档(README 剩余 1 节)
pbfuzz-dsh

PBFuzz(CCS'26 的智能体定向模糊测试器)以插件形式提供给 DeepSeek Harness (DSH)。
把智能体指向目标仓库和一个 bug(CVE、补丁、崩溃堆栈,或者只给 file:line),它就会跑定向模糊测试循环,直到产出一个经过验证的 Proof-of-Vulnerability 输入。

快速开始

Ubuntu 22.04/24.04 x86-64,Node.js ≥ 22,Python ≥ 3.11

1. 配置 DeepSeek Harness —— 参照官方文档安装 DSH,并配置你的 DeepSeek API key。使用这些插件验证过的 DSH 版本(见 HARNESS_COMMIT 里的 DSH_VERSION);npm 的 latest 可能超出它们的 peer 范围。

2. 从 npm 安装 pbfuzz

npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add @pbfuzz/dsh-pbfuzz

就这些:包里自带 Python 引擎、它的 schema 和 PyYAML。
然后用 npx @deepseek-ai/dsh@0.2.0-rc.2 web 启动 DSH。

可选的静态分析(C/C++ 可达性;需要 LLVM 14 工具链,见 packages/dsh-kanalyzer):

npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add @pbfuzz/dsh-kanalyzer

用同一个 plugin 命令管理安装(配置档不是 web 时加上 --profile NAME),之后重启 DSH:

npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web list # installed plugins and versions
npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add @pbfuzz/dsh-pbfuzz@0.1.14 # a specific release
npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web remove @pbfuzz/dsh-pbfuzz

要升级到更新的版本,按精确版本号 add 它;npm view @pbfuzz/dsh-pbfuzz version 会打印最新版本号。版本列表见 npmjs.com/package/@pbfuzz/dsh-pbfuzz。

从源码构建

git clone <this-repo-url> pbfuzz-dsh && cd pbfuzz-dsh
./install.sh

这会构建插件和 Python 引擎,并把本地构建加入 DSH。重启 npx @deepseek-ai/dsh@0.2.0-rc.2 web 就完成了。

| 脚本 | 作用 |
| ./install.sh | 构建 + 安装到 DSH(配置档 web;用 --profile NAME 更改) |
| ./install.sh --with-kanalyzer | 同时安装静态分析插件及其 LLVM 14 工具链(较慢,会用到 sudo) |
| ./build.sh | 只构建 —— 不改动你的 DSH 安装 |

使用

在目标仓库里打开一个会话,用大白话描述 bug —— pbfuzz 的技能会自动触发:

There's a bug in src/http/modules/ngx_http_rewrite_module.c:178 (nginx). Reproduce it as a
verified PoV.

智能体会探查仓库,提出一个测试活动方案(目标、构建命令、判定器),并给你一屏摘要,让你批准或修改。批准后它自行驱动 PLAN → IMPLEMENT → EXECUTE → REFLECT —— 写模糊测试计划、写生成器、运行它,并反思结果——直到它报告出触发问题的输入,或者放弃并解释原因。

会话内可用的命令:

| 命令 | 作用 |
| /pbfuzz [notes] | 启动新一轮 campaign,notes 作为 bug 报告 |
| /pbfuzz run <campaign.yaml> | 无头模式:加载手写、已确认的 campaign,直接启动 PIER,不弹任何提示 |
| /pbfuzz status | 打印当前 campaign 的阶段和指标 |
| /pbfuzz selfcheck | 立即运行环境自检(LLVM、tracer、Python) |

设置项(tracer、预算上限、oracle 默认值、开启哪些辅助分析)在 Web UI 的 Plugins → @pbfuzz/dsh-pbfuzz → Configure 下,或者在你配置档 cordis.patch.yml 里 pbfuzz 条目的 config: 下。三个预算——budget.maxPierRounds、budget.campaignWallTimeMin、budget.maxConsecutiveForcedContinues——是无人值守运行时唯一的刹车;触到任意一个,campaign 就真正停止(phase: STOPPED)。

C/C++、Python 和 Java 目标的完整示例在 examples/;Magma 基准 bug 的无头运行在 examples/magma/。

工作原理

- @pbfuzz/dsh-pbfuzz —— campaign 状态机(PLAN → IMPLEMENT → EXECUTE → REFLECT,即「PIER」),它的工具(pbfuzz_campaign、pbfuzz_plan、pbfuzz_fuzz、pbfuzz_reflect……),防止模型篡改引擎自有证据的状态守卫,以及设置/仪表盘 UI。它作为原生 Cordis 插件运行——没有 Claude-Code 风格的钩子,没有兼容层。
- @pbfuzz/dsh-kanalyzer (可选) —— 通用 LLVM 静态分析插件(可达性、调用图),开启静态分析时由 dsh-pbfuzz 调用。
- engine/ —— Python sidecar,真正运行目标:生成输入、执行输入、判定 oracle,并且是 metrics.json 的唯一写入者。它通过 stdio 讲 JSON-RPC,绝不在资源受限沙箱之外运行模型写的代码。

仓库结构

packages/dsh-pbfuzz/ the pbfuzz plugin: src/, skills/, canaries/, tests/
packages/dsh-kanalyzer/ the static-analysis plugin
engine/ the Python fuzzing sidecar (pbfuzz_engine/)
contracts/ JSON Schemas shared by both plugins and the engine (pnpm codegen)
examples/ worked targets: C/C++, Python (atheris), Java (Jazzer)
dsh-tests/ tests that boot the real DSH in-process (no mocks), always on npm's latest
docs/ DSH upgrade playbook, verification records

开发

pnpm -r typecheck
pnpm -r test # vitest, both packages
pnpm run test:engine # pytest, the Python engine
pnpm run test:dsh # the real DSH, newest from npm, booted in-process (needs the network; no API key)
pnpm run check:clients # settings-card ⇔ schema parity, client bundle self-checks
pnpm run codegen:check # contracts/ generated files are up to date
pnpm run codegen 会在 schema 变更后重新生成 contracts/ 下的 TypeScript/Python 类型;把生成的 diff 和 schema 一起提交。

DeepSeek Harness 兼容性

DSH 每个版本都会改插件 API,所以每次 push 和 PR 都会用 npm 上最新的 DSH 跑 dsh-tests/(启动真实的 DSH 进程内运行,没有任何 mock),另外还有一个每周工作流会再检查一遍 pbfuzz 的兼容性,一旦出问题就开 issue(如果设置了 ANTHROPIC_API_KEY,还会附上修复 PR)。
想手动复现或检查,用 scripts/compat-check.sh [version | --current];0.2 改了什么、下次出问题怎么修,都在 docs/dsh-upgrade.md 里。

License

PolyForm Noncommercial License 1.0.0

Citation

@misc{zeng2025pbfuzzagenticdirectedfuzzing,
title={PBFuzz: Agentic Directed Fuzzing for PoV Generation},
author={Haochen Zeng and Andrew Bao and Jiajun Cheng and Chengyu Song},
year={2025},
eprint={2512.04611},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2512.04611},
}
预览分享卡片长什么样 ↓sgzeng/pbfuzz
分享 · DeepSeek Harness Hub
sgzeng/pbfuzz

指向目标仓库与漏洞线索,自动跑出可复现的 PoV 输入

回到顶部