Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
에이전트 기반 목표 퍼징으로 PoV 생성
Agentic Directed Fuzzing for PoV Generation
플러그인TypeScript · PythonGitHub @sgzeng직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
설치형 프로젝트는 배포 도메인 없이도 확인할 수 있습니다. 개인 저장소는 GitHub 로그인으로, 조직 저장소는 위의 저장소 확인 파일로 직접 확인해 주세요.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
PBFuzz (the CCS'26 agentic directed fuzzer) as plugins for
DeepSeek Harness (DSH).
Point the agent at a target repo and a bug (a CVE, a patch, a crash trace, or just file:line);
it runs a directed-fuzzing loop until it produces a verified Proof-of-Vulnerability input.
Ubuntu 22.04/24.04 x86-64, Node.js ≥ 22, Python ≥ 3.11
1. Set up DeepSeek Harness — follow the
official docs to install DSH and configure
your DeepSeek API key. Use the DSH version these plugins are verified against (DSH_VERSION in
HARNESS_COMMIT); npm's latest can be outside their peer range.README 전문 보기 ↗PBFuzz (the CCS'26 agentic directed fuzzer) as plugins for
DeepSeek Harness (DSH).
Point the agent at a target repo and a bug (a CVE, a patch, a crash trace, or just file:line);
it runs a directed-fuzzing loop until it produces a verified Proof-of-Vulnerability input.
Ubuntu 22.04/24.04 x86-64, Node.js ≥ 22, Python ≥ 3.11
1. Set up DeepSeek Harness — follow the
official docs to install DSH and configure
your DeepSeek API key. Use the DSH version these plugins are verified against (DSH_VERSION in
HARNESS_COMMIT); npm's latest can be outside their peer range.
2. Install pbfuzz from npm
npx @deepseek-ai/[email protected] plugin --profile web add @pbfuzz/dsh-pbfuzz
That is all: the package ships the Python engine, its schemas and PyYAML.
Then start DSH with npx @deepseek-ai/[email protected] web.
Optional static analysis (C/C++ reachability; needs an LLVM 14 toolchain, see
packages/dsh-kanalyzer):
npx @deepseek-ai/[email protected] plugin --profile web add @pbfuzz/dsh-kanalyzer
Manage the install with the same plugin command (add --profile NAME for a profile other than
web), and restart DSH afterwards:
npx @deepseek-ai/[email protected] plugin --profile web list # installed plugins and versions
npx @deepseek-ai/[email protected] plugin --profile web add @pbfuzz/[email protected] # a specific release
npx @deepseek-ai/[email protected] plugin --profile web remove @pbfuzz/dsh-pbfuzz
To move to a newer release, add it by exact version; npm view @pbfuzz/dsh-pbfuzz version
prints the newest one. Releases are listed at
npmjs.com/package/@pbfuzz/dsh-pbfuzz.
git clone <this-repo-url> pbfuzz-dsh && cd pbfuzz-dsh
./install.sh
That builds the plugins and the Python engine and adds the local build to DSH. Restart
npx @deepseek-ai/[email protected] web and you're done.
| Script | Does |
|---|---|
./install.sh | build + install into DSH (profile web; --profile NAME to change) |
./install.sh --with-kanalyzer | also the static-analysis plugin and its LLVM 14 toolchain (slow, uses sudo) |
./build.sh | build only — no changes to your DSH install |
Open a session in the target repository and describe the bug in plain language — pbfuzz's skill triggers automatically:
There's a bug in
src/http/modules/ngx_http_rewrite_module.c:178(nginx). Reproduce it as a verified PoV.
The agent probes the repo, proposes a campaign (target, build command, oracle) and shows you a one-screen summary to Approve or Revise. Once approved it drives PLAN → IMPLEMENT → EXECUTE → REFLECT on its own — writing a fuzzing plan, a generator, running it, and reflecting on the result — until it reports a triggering input or gives up and explains why.
Useful commands inside a session:
| Command | Does |
|---|---|
/pbfuzz [notes] | start a new campaign, with notes as the bug report |
/pbfuzz run <campaign.yaml> | headless: load a hand-written, already-confirmed campaign and start PIER with no prompts |
/pbfuzz status | print the current campaign's phase and metrics |
/pbfuzz selfcheck | run the environment self-check (LLVM, tracers, Python) now |
Settings (tracer, budget caps, oracle defaults, which auxiliary analyses are on) live under
Plugins → @pbfuzz/dsh-pbfuzz → Configure in the web UI, or under the pbfuzz entry's config: in
your profile's cordis.patch.yml. Three budgets —
budget.maxPierRounds, budget.campaignWallTimeMin, budget.maxConsecutiveForcedContinues — are
the only brake on an unattended run; reaching one stops the campaign for real (phase: STOPPED).
Worked examples for C/C++, Python and Java targets are in examples/; headless runs
on Magma benchmark bugs are in examples/magma/.
@pbfuzz/dsh-pbfuzz — the campaign FSM (PLAN → IMPLEMENT → EXECUTE → REFLECT, "PIER"),
its tools (pbfuzz_campaign, pbfuzz_plan, pbfuzz_fuzz, pbfuzz_reflect, …), the state
guards that keep the model from tampering with engine-owned evidence, and the settings/dashboard
UI. It runs as a native Cordis plugin — no Claude-Code-style hooks, no compatibility layer.@pbfuzz/dsh-kanalyzer (optional) — a general-purpose LLVM static-analysis plugin
(reachability, call graphs) that dsh-pbfuzz consumes when static analysis is turned on.engine/ — the Python sidecar that actually runs the target: generates inputs, executes
them, judges the oracle, and is the sole writer of metrics.json. It speaks JSON-RPC over
stdio and never runs model-written code outside a resource-bounded sandbox.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 regenerates the TypeScript/Python types under contracts/ after any schema
change; commit the generated diff together with the schema.
DSH changes its plugin APIs between releases, so every push and PR runs dsh-tests/ against the
newest DSH on npm (the real DSH booted in-process; nothing mocked), and a
weekly workflow checks pbfuzz against it again and opens an issue (plus a fix PR,
if ANTHROPIC_API_KEY is set) when it breaks.
Reproduce or check by hand with scripts/compat-check.sh [version | --current]; what changed in 0.2 and how to
fix the next break is in docs/dsh-upgrade.md.
PolyForm Noncommercial License 1.0.0
@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},
}