An LLM-driven fuzzing pipeline powered by the GitHub Security Lab Taskflow Agent
An LLM-driven, OSS-Fuzz-style fuzzing pipeline for native C/C++ projects. AFL++ for execution, clang+lcov for coverage, an LLM agent for harness writing, coverage-feedback decisions, triage, and reporting.
This repository contains the fuzzing taskflow for the
GitHub Security Lab Taskflow Agent.
It depends on the
seclab-taskflows
companion repository for a few shared building blocks
(fetch_source_code taskflow, local_file_viewer / gh_file_viewer
toolboxes, and the default model_config) — those are installed
automatically as a Python dependency.
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
aptgh)pip install git+https://github.com/GitHubSecurityLab/seclab-taskflows-fuzzing
This pulls in seclab-taskflow-agent and seclab-taskflows (parent)
transitively, so every dotted reference of the form
seclab_taskflows.taskflows.audit.*,
seclab_taskflows.toolboxes.local_file_viewer,
seclab_taskflows.toolboxes.gh_file_viewer, and
seclab_taskflows.configs.model_config resolves out of the parent
distribution at runtime.
This taskflow is a fully autonomous fuzzing pipeline. Given a GitHub repo of a native C/C++ project, it will:
.afl binary, an AFL++ CMPLOG-instrumented .cmplog
binary and a clang coverage-instrumented .cov binary,The pipeline is OSS-Fuzz-style in spirit: it uses many of the same techniques (per-format mutators and dictionaries, structure-aware token splicing, coverage-driven harness improvements, machine-readable reports, deduped stack-hashed crashes) but it is much smaller and self-contained.
# Inside the codespace (or a host with python + git available):
./scripts/fuzzing/run_fuzzing.sh tukaani-project/xz
That's the whole interface. The script is autonomous; it will install AFL++
on first run, then drive the rest of the taskflow. Output files are written
to ~/.local/share/seclab-taskflow-agent/seclab-taskflows/.
The dashboard auto-starts in the background; in a Codespace, port 8765 is
auto-forwarded — open it in any browser to watch progress live.
For a quick smoke-test, use a small target:
./scripts/fuzzing/run_fuzzing.sh DaveGamble/cJSON
Three layers, top to bottom:
┌────────────────────────────────────────────────────────────────────┐
│ scripts/fuzzing/run_fuzzing.sh │
│ shell driver; chains the taskflow stages with `set +e` │
└────────────────────┬───────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────┐
│ src/seclab_taskflows/taskflows/fuzzing/*.yaml │
│ LLM agent prompts; one YAML per pipeline stage │
└────────────────────┬───────────────────────────────────────────────┘
│ (calls MCP tools)
▼
┌────────────────────────────────────────────────────────────────────┐
│ src/seclab_taskflows/mcp_servers/ │
│ ├ fuzz_context.py persistence (SQLite via SQLAlchemy) │
│ └ fuzz_runner.py subprocess wrappers (AFL, clang, lcov, ...) │
│ │
│ scripts/fuzzing/dashboard.py │
│ read-only HTML view of fuzz_context.db │
└────────────────────────────────────────────────────────────────────┘
Key design rules: