Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
dynast-bench — 의도적으로 취약점을 포함한 애플리케이션으로 구성된 DAST 벤치마크로, 스캐너 점수를 매기기 위한 정답 키를 제공합니다. | Kitploit
도구/GitHubGitHub/j3ssie/dynast-bench
Vulnerability ScannersWeb Vulnerability ScannersAPI Security TestingPenetration TestingLearning & EducationCurated ResourcesLabs & Practice
GitHubj3ssie/dynast-bench

dynast-bench

의도적으로 취약점을 포함한 애플리케이션으로 구성된 DAST 벤치마크로, 스캐너 점수를 매기기 위한 정답 키를 제공합니다.

저장소 보기
217일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

DynAST-Bench

의도적으로 취약하게 만든 앱과 스캐너 점수 산정용 정답 키(ground-truth)를 갖춘 DAST 벤치마크

⚠️ 이 저장소에는 의도적으로 안전하지 않은(INSECURE) 애플리케이션이 포함되어 있습니다. 이 앱들은 보안 도구(DAST 스캐너, SAST 엔진, LLM 보안 에이전트)를 벤치마킹하기 위해서만 존재합니다. 모든 앱은 127.0.0.1에 바인딩되고, 눈에 띄는 배너를 표시하며, 실제 데이터를 보관하지 않습니다. 이 중 어떤 것도 공용 네트워크에 배포하지 마십시오.

19개의 의도적으로 취약한 앱 모음으로, 스택별로 하나씩 있으며, 각각 문서화되고 기계로 검증 가능한 정답(ground truth) 을 갖추고 있습니다. 목적은 스캐너나 에이전트가 (a) 심어 둔 버그를 얼마나 잘 찾는지, (b) 바로 옆에 있는 안전한 근접 코드(near-miss)를 얼마나 잘 무시하는지, (c) 패치된 쌍둥이 앱에서 허위 탐지를 만들어내지 않는지를 측정하는 것입니다.

앱 한눈에 보기

19개 앱 · 549개의 심어진 취약점 · 146개의 근접 코드 · 546개의 실행 가능한 PoC · 594개의 분류된 엔드포인트. 모든 앱은 127.0.0.1:13311에서 부팅되며, vuln/+safe/ 쌍둥이 세트와 단일 이미지 --solo 빌드를 제공합니다. dynast-bench list는 이 표를 실시간으로 출력하고, dynast-bench surface <app>는 해당 앱의 엔드포인트 카탈로그를 출력합니다.

App스택데이터 저장소취약점근접 코드문서
aspnetC# / ASP.NET Core Razor PagesSQL Server2812plan
fastapiPython / FastAPI + Jinja2Postgres265plan
ginGo / GinPostgres127readme
golangGo / chiPostgres264plan
graphqlNode / GraphQL 16 API 전용Postgres316plan
jspJava / JSP + Servlets (Tomcat)Postgres286plan
laravelPHP 8.3 / Laravel 11 + BladeMySQL257plan

스택별 추가 사이드카(Mailpit, MinIO, Redis, Jenkins, Prometheus, Ollama 등)는 아래 The apps에 나열되어 있습니다.

스택별 설계 문서는 benchmark-plans/에 있습니다 - 각 앱의 전체 취약점 카탈로그는 여기서 시작하세요. 이 README는 운영 가이드입니다: 저장소가 어떻게 구성되어 있는지, 앱을 어떻게 실행하고 점수를 매기는지에 대한 내용입니다.

다루는 취약점 클래스

심어진 모든 버그에는 CWE와 OWASP 카테고리가 지정되어 있습니다. 클래스별로 집계하면(각 버그는 기본 CWE 아래에 한 번만 계산됨) 심어진 버그는 대략 다음과 같이 분류됩니다(롤업은 마지막으로 480개 버그에서 재생성됨; 위의 앱별 수치는 최신 기준):

클래스CWE버그앱
민감 데이터 노출(오류, 로그, 디버그 엔드포인트, 백업, 소스)200, 209, 489, 524, 532, 538, 540, 5483916
기본 / 하드코딩 / 유출된 자격 증명321, 522, 798, 1104, 13923818
누락 또는 손상된 권한 부여(BFLA, 수직 + 수평)269, 284, 285, 668, 862, 8633718
크로스 사이트 스크립팅(반사형 · 저장형 · DOM)792816
인증 우회 · 취약한 세션 · JWT 검증287, 288, 290, 306, 347, 384, 613, 614, 13852813
SQL 인젝션(2차, ORDER BY, NoSQL 포함)89, 9432717
프록시 / 파서 해석 충돌(경로 혼동, 헤더 신뢰)345, 348, 349, 436, 441, 693, 697, 706, 8072710
SSRF(블라인드, 리다이렉트 체인, 내부 전용 싱크 포함)9182017
IDOR / BOLA(사용자 제어 객체 키)6391917
경로 탐색 · LFI/RFI · zip slip22, 981916
대량 할당 / 과다 전송 · 프로토타입 오염915, 13211816
무차별 대입 · 누락된 속도 제한 · 리소스 고갈307, 400, 406, 674, 7701711
비즈니스 로직, 가격 및 할당량 남용625, 8401514
OS 명령 / 인자 인젝션781412
안전하지 않은 역직렬화(pickle · PHP · Java · YAML)470, 5021411
CORS 잘못된 구성9421414
경쟁 조건 / TOCTOU3621414
오픈 리다이렉트6011414

OWASP 카테고리별(웹 앱은 2021 Top 10, API 전용 앱은 API Top 10 2023):

OWASP버그OWASP API버그
A01 취약한 접근 제어118API8 보안 설정 오류21
A03 인젝션89API5 기능 수준 권한 부여 오류6
A05 보안 설정 오류72API1 객체 수준/속성 수준 권한 부여 오류4
A07 식별 및 인증 실패65API2 인증 오류4
A04 안전하지 않은 설계34API7 서버 측 요청 위조4
A08 소프트웨어 및 데이터 무결성 오류17API9 부적절한 인벤토리 관리3
A10 SSRF15API3 객체 속성 수준 권한 부여 오류2
A02 암호화 오류15API4 제한 없는 리소스 소비2
A09 로깅 및 모니터링 오류4API6 민감한 비즈니스 흐름에 대한 제한 없는 접근1
A06 취약하고 오래된 구성 요소3API10 안전하지 않은 API 소비1

이와 함께 두 개의 비웹 트랙이 있습니다: network 앱은 네트워크 스캐너를 위한 32개의 호스트/포트 및 서비스 수준 탐지를 심어 두었고, 두 개의 LLM 앱 (llmchat, llmagent)은 별도의 인젝션 채널 트랙에서 점수가 매겨지는 프롬프트 인젝션, 도구 남용 및 RAG 오염 버그를 심어 두었습니다.

각 버그에는 탐지 난이도(118 E, 68 E-M, 202 M, 61 M-H, 100 H), 오염 거리(351 in-file, 83 cross-file, 87 cross-service, 28 config) 및 도달 가능성(368 pre-auth, 181 user) 태그도 지정되어 있어, 재현율을 단일 숫자로 보고하는 대신 각 축을 따라 세분화할 수 있습니다. 앱별 카탈로그는 benchmark-plans/에 있습니다.

저장소 구조```

dynast-bench/ ├── README.md # you are here - overview, safety, run/score guide ├── examples/ # ready-to-score findings/v1 + endpoints/v1 files ├── Makefile # top-level runner: list / run / verify / validate / solo any app ├── benchmark-plans/ # per-stack design docs (the vulnerability catalogs) ├── dynast-bench/ # the dynast-bench CLI + scorer (Bun/TS) └── vulnerable-apps/ # the 19 apps - each a separated, self-contained folder ├── _template/ # skeleton; copy it to start a new app ├── fastapi/ golang/ nextjs/ nestjs/ springboot/ └── rails/ wordpress/ php/ jsp/ aspnet/ ...

root@kitploit:~
## 앱 실행 (`dynast-bench` CLI)

CLI는 스위트를 구동하는 가장 쉬운 방법입니다. 부팅 상태를 헬스 게이트로 확인하고, 공유 포트를 중재하며, `--json`을 지원하므로 스캐너 하네스가 이를 소비할 수 있습니다.
[Bun](https://bun.sh) 1.2+ 및 Docker가 필요합니다.```bash
make install                             # compile the CLI + link it into ~/.bun/bin
                                         # (BIN_DIR=/somewhere/else to pick the dir)

dynast-bench list                        # every app: vulns, PoCs, near-misses, what's up
dynast-bench vulns nextjs                # the planted bugs as a checklist, one title each
                                         # (--full · --near · --ids for a coverage diff)
dynast-bench start nextjs                # build + boot, wait for health, print the URL
dynast-bench verify nextjs               # run the ground-truth PoCs (expect all exploitable)
dynast-bench validate nextjs             # twin loop: vuln all-exploitable → safe all-fixed
dynast-bench status                      # variant, mode, target, health
dynast-bench stop --all                  # stop everything
dynast-bench clean --all --images --yes  # reclaim containers, volumes, networks, images

dynast-bench start nextjs --variant safe # the patched twin (false-positive run)
dynast-bench start --count 5 --parallel  # 5 apps at once, one port each + a summary table
dynast-bench start --all --solo --parallel   # whole fleet, one image + port each
dynast-bench run nextjs -- my-scanner --url '$TARGET'   # start → scan → stop

Full reference: dynast-bench/README.md.

포트

모든 것은 임시 범위의 조용한 구간에 위치하므로, 이 스위트는 일반적인 3000/8000/8080/5432 포트와 충돌하지 않습니다. 그리고 모든 앱은 고정 포트를 소유하므로, URL은 단독 실행이든 5개 배치든 항상 동일한 앱을 가리킵니다:

범위용도
13311–13339테스트 대상 앱 - 스캐너가 가리키는 URL, list 순서대로 앱당 1개 포트 (aspnet 13311, fastapi 13312, … nextjs 13322)
13340–13484해당 앱의 사이드카 (mailpit, phpMyAdmin, Jenkins, Prometheus, …), 앱당 5개
13500–13599재배치 풀

dynast-bench list가 지도 역할을 합니다. 앱이 소유한 포트에 이미 무언가가 리스닝 중이면, dynast-bench start는 그대로 두고 해당 서비스를 재배치 풀에서 대신 게시한 다음 실제 URL을 출력합니다(그리고 --json으로 보고). 어떤 것도 127.0.0.1을 넘어 바인딩되지 않습니다. dynast-bench doctor는 어떤 앱 포트가 비어 있는지 보여줍니다. make 타깃은 재배치하지 않고 compose 기본값(13311+)을 앱당 하나씩 게시하며, DYNAST_PORT=<n>을 존중합니다. --port N은 이를 고정합니다.

앱 실행 (최상위 Makefile)

Makefile은 저수준 계약으로 남아 있으며 독립적으로 작동합니다:```bash make list # show all apps (a [solo] tag = has a single-image build) make run APP=nextjs # start via compose (app + datastores) make verify APP=nextjs # run its ground-truth PoCs (expect all exploitable) make validate APP=nextjs # full twin loop: vuln all-pass -> safe all-fixed make down APP=nextjs # stop it make solo APP=nextjs # run as ONE self-contained image - no compose needed make solo-down APP=nextjs # stop the standalone image

shorthands: make run-nextjs make validate-nextjs

root@kitploit:~
입력:

모든 앱을 실행하는 두 가지 방법:
- **Compose** (`make run`) - ground truth가 대상으로 하는 표준 다중 서비스 토폴로지(앱 + Postgres/Redis 등을 별도 컨테이너로 포함).
- **Standalone** (`make solo`) - 앱당 하나의 자체 포함 이미지(`vuln/Dockerfile.standalone`)로, 데이터스토어와 내부 SSRF 싱크가 내장되어 있어 `docker build` + `docker run`만으로 compose 없이 동작합니다. 동작 방식과 PoC는 동일합니다(compose 서비스 이름은 `127.0.0.1`로 별칭 처리됨).

루트는 의도적으로 작게 유지됩니다: 이 README, 설계 가이드, 공유 도구, 그리고 앱들만 포함됩니다. 특정 앱에 대한 운영 관련 모든 것은 해당 앱의 자체 폴더 안에 있습니다.

## 앱별 구조

`vulnerable-apps/` 아래의 모든 앱은 동일한 형태를 가집니다:```
vulnerable-apps/<stack>/
├── README.md            # LOUD banner + run notes
├── Makefile             # up · reset · safe · verify · score · diff  (uniform interface)
├── vuln/                # the vulnerable variant - this is what you scan by default
│   ├── docker-compose.yml   # independent; binds 127.0.0.1 only
│   ├── app/                 # application source; the planted bugs live here
│   └── db/seed.sql          # seed incl. a cross-tenant user + a weak default cred
├── safe/                # the patched twin - same app, every planted bug fixed
│   ├── docker-compose.yml
│   ├── app/
│   └── db/seed.sql
└── ground-truth/        # the answer key - see "Ground truth" below
    ├── VULNERABILITIES.yaml  # every planted bug
    ├── SURFACE.yaml          # every endpoint the app exposes
    ├── verify/          # one runnable PoC per bug
    └── expected/        # optional golden normalized findings

취약/안전 쌍 (vuln/safe twin)

각 앱은 git 브랜치나 패치 파일 대신 두 개의 분리된 변형(variant) 폴더로 제공됩니다:

  • vuln/ - 심어진 모든 버그가 포함된 앱. 기본 대상이며, 스캐너가 겨냥하는 대상입니다.
  • safe/ - 심어진 모든 버그가 수정되고 그 외에는 아무것도 변경되지 않은 동일한 앱입니다(매개변수화된 쿼리, 이스케이프된 출력, 추가된 인가(authz), 안전한 역직렬화기 등).

diff -ru vulnerable-apps/<stack>/vuln vulnerable-apps/<stack>/safe가 정답(ground truth)입니다. 이 명령은 ground-truth/VULNERABILITIES.yaml에 명명된 줄만 정확히 건드려야 하며 그 외에는 아무것도 건드리지 않아야 합니다. safe/ 변형을 스캔하면 도구의 오탐(false-positive) 비율을 측정할 수 있습니다. 해당 변형은 구조적으로 깨끗하므로, 그곳에서 발견된 모든 항목은 오탐입니다.

각 변형의 Docker 빌드 컨텍스트는 자체 폴더(vuln/ 또는 safe/)이므로, 앱의 ground-truth/는 모든 빌드 컨텍스트 외부에 위치하며 이미지에 포함(bake)될 수 없습니다 - 즉, 정답 키가 구조적으로 실행 중인 앱으로 유출될 수 없습니다.

정답 (Ground truth, ground-truth/)

두 가지 질문이 있으므로 두 개의 정답 키가 있습니다. VULNERABILITIES.yaml은 앱에서 무엇이 잘못되었는지를 말하고, SURFACE.yaml은 무엇이 존재하는지를 말합니다.

VULNERABILITIES.yaml은 심어진 버그 하나당 하나의 항목을 기록합니다:```yaml

  • id: SQLI-001 variant_paths: # same relative path in both variants vuln: vuln/app/routes/search.py safe: safe/app/routes/search.py symbol: search_posts route: "GET /posts/search?q=" cwe: CWE-89 owasp: "A03:2021-Injection" severity: high # info | low | medium | high | critical difficulty: E # E | E-M | M | M-H | H (detection difficulty) taint: in-file # in-file | cross-file | cross-service reachability: pre-auth # pre-auth | user | admin near_miss: SAFE-SQLI-001 # id of the safe twin planted nearby match: # machine anchors for the scorer (generated) http: { method: GET, path: "/posts/search", params: [q] } file: { path: vuln/app/routes/search.py, symbol: search_posts, lines: [18, 24] } markers: [GLOBEX-CONFIDENTIAL-MARKER-7f3a] poc: ground-truth/verify/sqli_001.sh
root@kitploit:~
`SURFACE.yaml`는 앱이 노출하는 **각 작업(operation)별로 하나의 항목**을 기록하며, 취약한 작업과 정상적인 작업을 모두 포함합니다. 이는 [엔드포인트 커버리지](#endpoint-coverage)의 분모 역할을 합니다:```yaml
operations:
  - id: posts.search
    kind: http                 # http | graphql | ws | llm | net
    method: GET
    path: /api/posts/search
    params: [q]
    discovery: js-runtime      # same crawl tiers as the answer key
    reachability: user
    vulns: [SQLI-001]          # omit when the operation is benign

  - id: graphql.mutation.update-post
    kind: graphql              # the op BEHIND POST /graphql, which is its own entry
    op: updatePost
    graphql_kind: mutation
    via: graphql.transport
    discovery: static-html

Benign 작업은 의도적으로 포함되어 있습니다. 취약한 경로만 모아 놓은 카탈로그는 앱 자체의 커버리지가 아니라 정답 키에 대한 커버리지를 측정하게 되기 때문입니다.

verify/에는 버그당 실행 가능한 PoC 하나가 들어 있으며, vuln/에 대해서는 0으로 종료되고 safe/에 대해서는 0이 아닌 값으로 종료됩니다. 이것이 "버그가 실제로 존재한다(그리고 트윈에서 실제로 수정되었다)"는 실행 가능한 정의입니다.

공유 러너(dynast-bench/tools/poc-runner.sh)는 종료 코드만으로는 전달할 수 없는 세 번째 결과를 추가합니다: 하네스가 실행되지 못함. 아무것도 수신 대기하지 않는 포트에 스위트를 지정하면 모든 앱 PoC의 절반가량이 1로 종료되는데, 이는 실제 수정과 구별할 수 없습니다. 따라서 러너는 거부를 신뢰하기 전에 대상에 대한 상태 프로브를 수행하고, PoC별 데드라인을 적용하며, 타임아웃, 누락된 도구 또는 응답을 멈춘 대상이 발생하면 양쪽 모두 실패로 처리합니다. "스위트가 실행되지 못함"이 "취약점이 수정됨"으로 기록되는 일은 없습니다.

공유 도구 모음 (dynast-bench/, Bun/TypeScript)

모든 앱이 사용하는 단일 툴체인으로, 크로스 스택 결과를 비교 가능하게 만듭니다:

  • dynast-bench.ts - CLI: 시작/중지/리셋/정리, 상태 게이팅, 포트 중재, PoC 검증, 점수 산정, 하네스용 --json.
  • src/schema/ - 두 가지 보고서 형식(findings/v1, endpoints/v1)과 두 가지 정답 키(VULNERABILITIES.yaml, SURFACE.yaml)에 대한 타입 및 검증기, 부분 점수에 사용되는 CWE 계열 테이블, 그리고 비교 양쪽이 거치는 경로/라우트/작업 정규화기.
  • src/normalize/ - 원시 스캐너 출력(OWASP ZAP, Semgrep/CodeQL/Snyk의 SARIF, nuclei, Burp XML, nmap XML)을 해당 형식으로 변환하는 어댑터. 형식은 자동 감지되므로 score는 네이티브 출력을 직접 받습니다.
  • src/scorer/ - 발견 항목을 정답 키와 대조하여 정밀도 / 재현율 / F1을 산출하고, 난이도 / 심각도 / 도달 가능성 / taint / CWE별 재현율, 근접 오탐에 대한 판별력 점수, 중복(노이즈) 비율을 산출합니다. 이와 함께 엔드포인트 커버리지 트랙은 실행이 실제로 앱의 얼마나 많은 부분에 도달했는지를 평가하고, 모든 누락을 "엔드포인트를 찾지 못함"과 "찾았지만 버그를 놓침"으로 분류합니다.``` dynast-bench verify # run the app's ground-truth PoCs dynast-bench score findings.json # findings → P/R/F1 + per-dimension recall dynast-bench coverage endpoints.json # endpoint discovery → how much was reached dynast-bench surface # the operation checklist a crawl is graded on dynast-bench diff # the vuln↔safe delta vs the answer key dynast-bench check --all # CI gate: schema · anchors · diff scope · binds
root@kitploit:~
[`examples/`](https://github.com/j3ssie/dynast-bench/blob/HEAD/examples/)에는 즉시 점수를 매길 수 있는 파일이 들어 있습니다. 발견 실행 결과, 오탐(false-positive) 실행 결과, 세 개의 엔드포인트 추적 파일, 그리고 두 개의 빈 템플릿이 있으며, 각각 생성되는 숫자와 함께 문서화되어 있습니다.```bash
dynast-bench score    nextjs examples/findings.json --safe examples/findings-safe.json
dynast-bench coverage nextjs examples/endpoints.json --findings examples/findings.json

Full reference - the finding schema, the matching tiers, every metric: dynast-bench/README.md.

Uniform Makefile interface (identical in every app)```

make up # docker compose up the vuln/ variant (127.0.0.1 only), wait for health make reset # down -v && up → fresh, byte-identical state make safe # bring up the safe/ variant instead (for false-positive runs) make verify # run every ground-truth PoC; expect all PASS against vuln/ make score FINDINGS=f.json # grade a scanner's findings → P/R/F1 make diff # the vuln↔safe delta, cross-checked against the answer key make check # CI gate: schema · anchors · diff scope · PoCs · 127.0.0.1 binds

root@kitploit:~
## 앱 목록

| 앱          | 스택                            | DB         | 추가 서비스              | 설계 문서 |
|------------|--------------------------------|------------|----------------------|------------|
| fastapi    | Python / FastAPI + Jinja2      | Postgres   | MinIO, Mailpit       | [fastapi.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/fastapi.md) |
| golang     | Go / chi                       | Postgres   | Prometheus, Grafana  | [golang.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/golang.md) |
| gin        | Go / Gin                       | Postgres   | chromium, ImageMagick (이미지 내) | [README](https://github.com/j3ssie/dynast-bench/blob/HEAD/vulnerable-apps/gin/README.md) |
| nextjs     | Node / Next.js 15              | Postgres   | Redis, Mailpit       | [nextjs.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/nextjs.md) |
| nestjs     | Node / NestJS + Handlebars     | Postgres   | Redis, nginx         | [nestjs.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/nestjs.md) |
| springboot | Java / Spring Boot + Thymeleaf | Postgres   | Jenkins, Prometheus  | [springboot.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/springboot.md) |
| rails      | Ruby / Rails 7.2               | Postgres   | MinIO, nginx         | [rails.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/rails.md) |
| wordpress  | PHP / WordPress + plugin       | MySQL      | nginx, Mailpit       | [wordpress.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/wordpress.md) |
| php        | PHP / 절차적 LAMP              | MySQL      | phpMyAdmin, Mailpit  | [php.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/php.md) |
| jsp        | Java / JSP + Servlets (Tomcat) | Postgres   | Mailpit              | [jsp.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/jsp.md) |
| aspnet     | C# / ASP.NET Core Razor Pages  | SQL Server | Mailpit              | [aspnet.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/aspnet.md) |

여기에 **API 전용** 앱 3개(GraphQL, WebSocket, Swagger/OpenAPI), 호스트/포트 스캐너용 **네트워크 범위** 플릿, 그리고 **LLM** 앱 2개가 추가됩니다:

| 앱          | 스택                                       | DB                | 추가 서비스                       | 설계 문서 |
|------------|---------------------------------------------|-------------------|--------------------------------------|------------|
| llmchat    | Python / FastAPI + LangChain (RAG 챗봇)     | Postgres+pgvector | Redis, Ollama, 내부 서비스          | [llmchat.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/llmchat.md) |
| llmagent   | Node / Fastify + Vercel AI SDK + MCP (에이전트) | Postgres          | Redis, Ollama, partner-MCP, 내부 서비스 | [llmagent.md](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/llmagent.md) |

두 LLM 앱 모두 내부 전용 Ollama 컨테이너(`gemma3:1b`는 채팅용, `qwen2.5:1.5b`는 도구 호출용)를 통해 **로컬 모델**을 실행합니다. API 키가 필요 없고, 외부 송신이 없으며, 실행당 비용도 들지 않습니다. 또한 스크립트 기반 `LLM_BACKEND=stub` 백엔드를 제공하여 확률적 모델에서도 ground-truth PoC가 결정적으로 유지되도록 합니다.

공유 도메인 모델, OWASP Top 10 적용 범위 매트릭스, 벤치마크 설계 원칙(근접 실패, taint 거리, 로직 전용 버그)은 [`benchmark-plans/README.md`](https://github.com/j3ssie/dynast-bench/blob/HEAD/benchmark-plans/README.md)를 참조하세요.

## 시작하기```bash
make install                           # once: puts `dynast-bench` on your PATH
dynast-bench doctor                    # docker reachable? which ports are taken?

dynast-bench start fastapi             # boots the vuln/ variant, waits for health
dynast-bench verify fastapi            # sanity-check: every planted bug's PoC PASSes

# ...point your scanner/agent at $(dynast-bench target fastapi), collect findings.json...

dynast-bench start fastapi --variant safe   # patched twin → measures false positives
dynast-bench reset fastapi                  # restore fresh, re-seeded state
dynast-bench clean --all --yes              # give the disk back

Or one app directly with its Makefile:```bash cd vulnerable-apps/fastapi make up # vuln/ variant on 127.0.0.1 make verify # every planted bug's PoC PASSes make safe # the patched twin make reset # fresh state

root@kitploit:~
## 상태

- **19개 앱이 완전한 정답 키를 보유**: 앱당 549개의 심어진 취약점, 146개의
  근접 실패(near-miss), 546개의 PoC, 그리고 `Dockerfile.standalone`(`--solo`).
  `dynast-bench list`가 실시간 테이블을 출력합니다.
- **`nextjs`가 레퍼런스 구현체** - 엔드 투 엔드로 구축 및 검증 완료
  (취약점 35개 + 근접 실패 15개). `make validate APP=nextjs`는 모든 PoC가
  `vuln/`에서 악용 가능하고 `safe/`에서 수정되었음을 증명하며, `make solo APP=nextjs`는
  단일 이미지로 실행합니다. 해당 패턴을 복제하세요.
- **`dynast-bench` CLI - 구축 완료**: compose 또는 단일 이미지 모드에서 모든 앱을
  실행, 검증, 점수 산정, 정리하며, 하네스용 `--json`을 지원합니다.
- **스코어러 - 구축 완료** (`dynast-bench/src/`): 스캐너 출력 → 정규화된 발견 결과
  → 정밀도/재현율/F1, 난이도별 재현율, 근접 실패에 대한 판별 점수,
  그리고 별도의 탐지(네트워크) 및 주입 채널(LLM) 트랙.
- **엔드포인트 커버리지 - 구축 완료**: 앱별 `SURFACE.yaml`(전체 플릿에 걸쳐 약 600개
  작업)로 실행이 앱의 얼마나 많은 부분에 실제로 도달했는지 평가하고, 모든
  누락을 "엔드포인트를 찾지 못함"과 "엔드포인트는 찾았지만 버그를 놓침"으로
  분리합니다.
- 19개 정답 키와 서피스 카탈로그 전체에 걸친 앱별 불변 조건이
  `make test`에서 실행되며, `dynast-bench check --all`이 CI 게이트입니다.

## 도구 점수 산정```bash
dynast-bench start nextjs --json | jq -r .target        # boot, get the URL
zap-baseline.py -t http://127.0.0.1:13311 -J zap.json   # scan
dynast-bench score nextjs zap.json --full               # grade it

# measure false positives properly: scan the patched twin too
dynast-bench start nextjs --variant safe
my-scanner --url http://127.0.0.1:13311 --out safe.json
dynast-bench score nextjs zap.json --safe safe.json

score는 findings/v1 파일 또는 네이티브 ZAP / SARIF / nuclei / Burp / nmap 출력을 읽습니다. 형식은 자동 감지됩니다. 도구를 연결하는 경우 examples/에서 시작하세요. examples/template-findings.json은 모든 필드가 포함된 빈 스켈레톤이고, examples/findings.json은 지금 바로 점수를 매길 수 있는 작업 파일입니다.

엔드포인트 발견은 각 앱의 SURFACE.yaml을 기준으로 별도로 평가됩니다.```bash dynast-bench coverage nextjs endpoints.json --findings findings.json

root@kitploit:~
그것이 **탐색 누락**(엔드포인트에 도달하지 못함 - 크롤러 수정)과 **분석 누락**(도달했지만 보고하지 않음 - 스캐너 수정)을 구분하는 기준입니다.
스키마, 매칭 등급 및 모든 지표는 [`dynast-bench/README.md`](https://github.com/j3ssie/dynast-bench/blob/HEAD/dynast-bench/README.md#scoring)를 참조하세요.

### 보고서 읽기 (`Leg │ Precision │ Recall │ F1`)

**leg**는 하나의 대상 상태에 대한 한 번의 스캔 실행입니다:

| Leg | 의미 |
|---|---|
| `blackbox` | 자격 증명 없음 - 인증되지 않은 공격자 관점 |
| `credentialed` | 시드된 로그인이 주입된 동일 대상 - 인증된 표면(IDOR, 권한 상승)에 도달 가능 |
| `safe-twin` | 패치된 트윈(`--safe`), 오탐 기준선 - 이상적으로는 아무것도 찾지 못함 |

세 가지 모두 `0.0`–`1.0` 범위로 실행되며, 세 가지 모두 **높을수록 좋습니다**(`1.0`이 완벽):

| 지표 | 공식 | 방향 | 의미 |
|---|---|---|---|
| **Precision** | `TP / (TP + FP)` | ↑ 높을수록 | 보고된 것 중 실제로 진짜인 비율. `0.38` = 발견 항목의 약 38%가 진짜였고 나머지는 노이즈. 높음 = 오탐 적음. |
| **Recall** | `TP / (TP + FN)` | ↑ 높을수록 | 실제로 심어진 버그 중 발견된 비율. `0.73` = 11개 중 8개. 높음 = 누락 적음. |
| **F1** | `2 × P × R / (P + R)` | ↑ 높을수록 | 두 값의 조화 평균 - 핵심 "전체 품질" 수치. 둘 다 높을 때만 높으므로, 노이즈가 많거나 버그를 놓치는 경우 모두 불이익을 줍니다. |

한 가지 반전: **`safe-twin` leg에는 실제로 찾을 것이 없으므로**, 그곳의 모든 발견은 오탐입니다 - 적을수록 좋으며, 빈 보고서가 완벽한 점수입니다.

## 엔드포인트 커버리지

Recall은 도구가 찾은 버그의 수를 알려줍니다. 나머지를 놓친 **이유**는 알려주지 못합니다 - 그리고 두 가지 이유는 반대되는 수정이 필요합니다:

| 누락 | 의미 | 수정 대상 |
|---|---|---|
| **탐색 누락** | 버그가 있는 엔드포인트에 도달하지 못함 | 크롤러 |
| **분석 누락** | 엔드포인트에 도달했지만 버그를 보고하지 않음 | 분석 |

이 둘을 구분하려면 두 번째 입력이 필요합니다: 도구가 발견했다고 보고한 엔드포인트입니다.
그것이 `endpoints/v1`이며, 각 앱의 `SURFACE.yaml`에 대해 점수가 매겨집니다.```bash
dynast-bench surface  nextjs                       # the checklist a crawl is graded on
dynast-bench coverage nextjs endpoints.json        # how much did it reach?
dynast-bench coverage nextjs endpoints.json --findings findings.json   # ...and why not the rest
dynast-bench score    nextjs findings.json --endpoints endpoints.json  # both in one report

HTML과 JS를 읽는 크롤러지만 다단계 흐름을 완료하지 못하는 경우:``` operations 62.5% 25 of 40 detection 25.0% of the bugs on operations it reached misses: 11 never reached the operation · 18 reached it and did not report

static-html 6/6 100.0% js-static 5/5 100.0% js-runtime 11/19 57.9% interaction 3/5 60.0% flow 0/5 0.0%

root@kitploit:~
계층 구분이 유용한 부분입니다. `static-html`에서 100%, `flow`에서 0%라면 이는 스캐너 문제가 아니라 탐지 문제이며, 단일 회수율 숫자에서는 둘 다 동일하게 읽힙니다.

두 가지 규칙이 숫자의 정직성을 유지합니다:

- **전송은 작동이 아님.** 하나의 `POST /graphql`은 그 뒤에 있는 25개의 GraphQL 작업을 실행하지 않으며, 하나의 WebSocket 핸드셰이크는 그 이벤트를 실행하지 않고, 하나의 `POST /api/runs`는 에이전트의 도구를 실행하지 않습니다. URL에 도달하는 것과 그곳에 존재하는 것을 실행하는 것은 별도로 점수가 매겨집니다.
- **누락된 텔레메트리는 전혀 트랙을 생성하지 않으며**, 절대 `0%`가 아닙니다. "우리는 이것을 측정하지 않았다"와 "그것은 아무것에도 도달하지 못했다"는 도구에 대한 상반된 주장입니다.

보고된 엔드포인트가 일치하지 않으면 정밀도에 비용이 들지만 적용 범위는 절대 줄어들지 않으므로, 워드리스트를 뿌리는 것은 더 높은 점수를 얻는 방법이 아닙니다. 전체 모델:
[`dynast-bench/README.md#endpoint-coverage`](https://github.com/j3ssie/dynast-bench/blob/HEAD/dynast-bench/README.md#endpoint-coverage).

## 라이선스

`dynast-bench`는 **Vigolium**과 **Gimora**(자율 공격 보안 에이전트)를 벤치마킹하기 위해 [@j3ssie](https://github.com/j3ssie)가 ♥로 만들었으며,
[MIT 라이선스](https://github.com/j3ssie/dynast-bench/blob/HEAD/LICENSE)에 따라 배포됩니다.
도구 다운로드
llmagentNode / Fastify + AI SDK + MCPPostgres298plan
llmchatPython / FastAPI + LangChain RAGPostgres+pgvector309plan
nestjsNode / NestJS + HandlebarsPostgres236plan
network시뮬레이션된 멀티 호스트 네트워크 범위혼합 플릿325plan
nextjsNode / Next.js 15 (참조 구현)Postgres3515plan
phpPHP / 절차적 LAMPMySQL215plan
railsRuby / Rails 7.2Postgres266plan
springbootJava / Spring Boot + ThymeleafPostgres304plan
swaggerOpenAPI / Swagger UI + 스펙 로딩Postgres195plan
websocketNode 22 / ws + Socket.IO 실시간Postgres286plan
weirdproxy단일 오리진 위의 nginx + Apache + Traefik없음164plan
wordpressPHP / WordPress + 커스텀 플러그인MySQL286plan
사용자 및 리소스 열거(관찰 가능한 응답 차이)204, 5981312
코드 인젝션 · SSTI · 표현식 언어94, 917, 1059, 13361110
취약한 암호화 및 난수 · 평문 전송295, 319, 327, 330, 338116
비밀번호 재설정 + 계정 복구 결함184, 64099
제한 없는 / 안전하지 않은 파일 업로드43499
CSRF(크로스 사이트 WebSocket 하이재킹 포함)35288
프롬프트 인젝션 및 LLM 도구 남용(직접 · 간접 · RAG)142772
XXE / XML 외부 엔티티61155
공급망 및 무결성(서명되지 않은 업데이트, 취약한 의존성)494, 103522
안전하지 않은 네트워크 노출(바인딩, 서비스 잘못된 구성)132721
불충분한 로깅 / 로그 인젝션11711