指向目标仓库与漏洞线索,自动跑出可复现的 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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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},
}预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
sgzeng/pbfuzz
指向目标仓库与漏洞线索,自动跑出可复现的 PoV 输入
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 415,267已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,414已汉化MCP
71.9
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 967已汉化DSH
71.6
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,756已汉化DSH
70.8
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 649已汉化DSH
70.7