GitHub Security Lab Taskflow Agent로 구동되는 LLM 기반 퍼징 파이프라인
네이티브 C/C++ 프로젝트를 위한 LLM 기반의 OSS-Fuzz 스타일 퍼징 파이프라인. 실행에는 AFL++, 커버리지에는 clang+lcov, 하네스 작성, 커버리지 피드백 결정, 트리아지, 리포팅에는 LLM 에이전트를 사용합니다.
이 저장소는
GitHub Security Lab Taskflow Agent의 퍼징 태스크플로우를 포함합니다.
몇 가지 공유 빌딩 블록
(fetch_source_code 태스크플로우, local_file_viewer / gh_file_viewer
툴박스, 기본 model_config)을 위해
seclab-taskflows
동반 저장소에 의존합니다 — 이들은 Python 의존성으로
자동 설치됩니다.
기여를 환영합니다! 가이드라인은 CONTRIBUTING.md를 참조하세요.
apt에 접근할 수 있는 Linux 환경(또는 Codespace)gh)pip install git+https://github.com/GitHubSecurityLab/seclab-taskflows-fuzzing
이것은 seclab-taskflow-agent와 seclab-taskflows(상위)를
전이적으로 가져오므로, 다음과 같은 형태의 모든 점 표기 참조
seclab_taskflows.taskflows.audit.*,
seclab_taskflows.toolboxes.local_file_viewer,
seclab_taskflows.toolboxes.gh_file_viewer, 그리고
seclab_taskflows.configs.model_config는 런타임에 상위
배포판에서 해석됩니다.
이 태스크플로우는 완전 자율 퍼징 파이프라인입니다. 네이티브 C/C++ 프로젝트의 GitHub 저장소가 주어지면 다음을 수행합니다:
.afl
바이너리, AFL++ CMPLOG 계측된 .cmplog 바이너리, clang 커버리지 계측된
.cov 바이너리로 빌드하고,이 파이프라인은 정신적으로 OSS-Fuzz 스타일입니다: 동일한 기법(형식별 뮤테이터 및 사전, 구조 인식 토큰 스플라이싱, 커버리지 기반 하네스 개선, 기계 판독 가능 보고서, 중복 제거된 스택 해시 크래시)을 많이 사용하지만 훨씬 작고 자체 포함적입니다.
# Inside the codespace (or a host with python + git available):
./scripts/fuzzing/run_fuzzing.sh tukaani-project/xz
이것이 전체 인터페이스입니다. 스크립트는 자율적으로 동작하며, 첫 실행 시 AFL++을 설치한 다음 나머지 작업 흐름을 진행합니다. 출력 파일은 ~/.local/share/seclab-taskflow-agent/seclab-taskflows/에 기록됩니다.
대시보드는 백그라운드에서 자동으로 시작됩니다. Codespace에서는 포트 8765가 자동으로 포워딩되며, 아무 브라우저에서나 열어 진행 상황을 실시간으로 확인할 수 있습니다.
빠른 스모크 테스트를 위해서는 작은 타깃을 사용하세요:
./scripts/fuzzing/run_fuzzing.sh DaveGamble/cJSON
세 개의 계층, 위에서 아래로:
┌────────────────────────────────────────────────────────────────────┐
│ 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 │
└────────────────────────────────────────────────────────────────────┘
핵심 설계 규칙:
fuzz_context.db에 저장된다.run_afl_for, compile_harness, store_crash 등을
노출할 뿐이다.afl-clang-lto++ -fsanitize=address,undefined(즉 .afl 바이너리)와
clang++ -fprofile-instr-generate -fcoverage-mapping(즉 .cov
바이너리)으로 빌드된다. .afl 바이너리는 퍼징을 수행하고, .cov
바이너리는 AFL 큐를 재생하여 실제 소스 라인/함수/분기 커버리지를
생성한다. 세 번째로, 새니타이저가 없는 .cmplog 바이너리
(AFL_LLVM_CMPLOG=1을 사용하는 afl-clang-lto++)가 afl-fuzz -c에
전달되어 AFL++의 CMPLOG/RedQueen 단계가 매직 값과 체크섬을 해결할 수
있게 한다. 세 가지 빌드 모두 필수이다. CMPLOG 빌드가 실패하면 하네스
빌드가 실패하고, run_afl_for는 .cmplog 바이너리 없이는 실행을
거부한다. afl-clang-lto++가 설치되어 있지 않으면 AFL++ 빌드는 대신
afl-clang-fast++를 사용하고 compile_harness는 경고를 반환한다.
C++ 드라이버는 C++ 표준 라이브러리를 링크하므로 C 및 C++ 하네스와
라이브러리 모두 작동한다. .c 파일은 여전히 C로 컴파일된다(-x c).| # | 단계 | Taskflow YAML |
|---|---|---|
| 1 | AFL++ + 도구 설치 | scripts/fuzzing/install_afl.sh |
| 2 | 소스 가져오기 | seclab_taskflows.taskflows.audit.fetch_source_code |
| 3 | 퍼즈 대상 식별 | seclab_taskflows_fuzzing.taskflows.fuzzing.identify_fuzz_targets |
| 4 | 빌드 시스템 분석 | seclab_taskflows_fuzzing.taskflows.fuzzing.analyze_build_system |
| 5a | 초기 하네스 작성 (요청 시 ×N 후보) | seclab_taskflows_fuzzing.taskflows.fuzzing.write_initial_harnesses |
| 5b | 하네스 빌드 (AFL++ 엣지 + AFL++ CMPLOG + clang 커버리지) | seclab_taskflows_fuzzing.taskflows.fuzzing.build_harnesses |
| 5c | 후보 검증 (HARNESS_CANDIDATES > 1일 때) | seclab_taskflows_fuzzing.taskflows.fuzzing.qualify_harnesses |
| 6 | 퍼징/커버리지/개선 루프 (×N 반복) | seclab_taskflows_fuzzing.taskflows.fuzzing.fuzz_iteration |
| 7 | 크래시 분류 | seclab_taskflows_fuzzing.taskflows.fuzzing.triage_crashes |
| 8 | 이전에 알려진 크래시가 여전히 재현되는지 확인 | seclab_taskflows_fuzzing.taskflows.fuzzing.confirm_fixed_crashes |
| 9 | 호출 그래프 + 미접촉 API 보고서 작성 | seclab_taskflows_fuzzing.taskflows.fuzzing.analyze_call_graph |
| 10 | 크래시별 취약점 보고서 작성 | seclab_taskflows_fuzzing.taskflows.fuzzing.write_vuln_reports |
| 11 | 캠페인 보고서 작성 | seclab_taskflows_fuzzing.taskflows.fuzzing.write_report |
각 단계는 에이전트가 처음부터 끝까지 실행하는 자체 완결형 taskflow
YAML이다. 단계들은 fuzz_context.db의 SQLite 데이터베이스를 통해서만
통신한다 — 인메모리 핸드오프는 없다.
이것이 파이프라인의 핵심이다. 시간 예산은 매 반복마다 두 배가 된다:
30s → 60s → 120s → 240s → 480s → 960s (≈ 32 min/target)
반복마다, 하네스마다 에이전트는 다음을 수행합니다: