
런타임 인식 SCA — 설치된 것뿐만 아니라 실제로 도달 가능한 CVE를 증명합니다.
런타임 인식 SCA — 설치된 것뿐만 아니라 실제로 도달 가능한 CVE를 입증합니다.
VulnReach는 이제 공식 OWASP 프로젝트입니다. 🎉




언어 지원: Python은 완전히 프로덕션 준비가 완료되었습니다(taint, AST, route, runtime). Java와 JavaScript는 함수 호출 그래프 분석을 지원하며 실험 단계입니다. Go, C#, PHP는 로드맵에 있습니다. 자세한 내용은 ROADMAP.md를 참조하세요.
VulnReach는 표준 SCA 출력을 기반으로 도달 가능성 컨텍스트를 추가하여, 정적 분석, taint 추적, 실시간 런타임 커버리지를 통해 감지된 CVE 중 실제로 애플리케이션에서 도달할 수 있는 항목을 입증합니다.
POST /scan/{id}/cancel로 진행 중인 스캔 중지GET /scan/{id}에서 summary + 분류된 버킷VULNREACH_ALLOW_DOCKER_DAEMON=true를 통한 명시적 옵트인 필요docker-socket-proxy 사용POST /findings/{id}/next-steps는 결정적 결과에 대해 분석가를 위한 수정 지침(즉시 조치, 검증 프로브, 업그레이드 경로, 모니터링)을 생성합니다. 지연/온디맨드 방식: 스캔은 LLM을 호출하지 않으며, LLM 실패는 정상적으로 저하됩니다. 결정적 판정은 읽기 전용입니다. docs/api.md 참조.scan.runtime.ebpf 추적 모드(Linux 중심, 명시적 옵트인)참조:
각 CVE는 5계층 증거 체인을 통해 분류됩니다.
1. SCA (Trivy) → is the package installed and vulnerable?
2. Taint analysis (tainter) → does user input flow to the vulnerable sink?
3. AST analysis → is the vulnerable function in your call graph?
4. Route exposure → is the call path reachable from an HTTP endpoint?
5. Runtime coverage → was the vulnerable code actually executed?
결과는 네 가지 등급으로 구성된 우선순위 탐지 결과 목록입니다.
| 등급 | 의미 |
|---|---|
DYNAMICALLY_REACHABLE | 런타임 커버리지가 실행을 확인함 — 즉시 수정 |
STATICALLY_REACHABLE | AST/taint를 통해 코드 경로가 입증됨 — 높은 우선순위 |
보안 공지 — 시작하기 전에
.env.example을.env.local로 복사하고
모든CHANGE_ME값을 강력한 무작위 비밀로 교체하세요.
실제 자격 증명을 설정하고CORS_ORIGINS를 구성하지 않은 채 VulnReach를 공용 네트워크에 노출하지 마십시오.
git clone https://github.com/ihrishikesh0896/vulnreach.git
cd vulnreach
# 1. Create your local config
cp .env.example .env.local
# 2. Fill in every CHANGE_ME — generate secrets with: openssl rand -hex 32
$EDITOR .env.local
# 3. Start the stack
docker compose up --build
# Optional: enable dynamic runtime scans (Docker daemon access via restricted socket proxy)
# docker compose -f docker-compose.yml -f docker-compose.runtime.yml up --build
인증 옵션:
POST /loginSettings -> API Keys에서 생성한 후 Authorization: Bearer <API_KEY>로 사용# Get a token (replace with the credentials you set in .env.local)
TOKEN=$(curl -s -X POST http://localhost:8000/login \
-H "Content-Type: application/json" \
-d '{"username":"<your-admin-user>","password":"<your-admin-password>"}' | jq -r .access_token)
# Start scan from a GitHub repo
curl -X POST http://localhost:8000/scan \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"repo_url":"https://github.com/yourorg/yourapp"}'
# Poll for results
curl http://localhost:8000/scan/<scan_id> \
-H "Authorization: Bearer $TOKEN" | jq .summary
coverage.py를 통한 Docker 기반 커버리지 수집policy.block_if는 확인된 심각한 결과에서 빌드를 실패시킴Authorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none이며, 오프라인 사용을 위해 Ollama를 지원스캔 대상: multi-tier-dvpa — 11개 패키지에 걸쳐 72개의 원시 CVE가 있는 의도적으로 취약하게 만든 Python/Django 애플리케이션.
탐지 결과의 46%가 차별화되지 않은 "모두 수정" 대기열에서 우선순위 조치 목록으로 이동되었습니다. 일반적인 프로덕션 서비스(많은 전이 종속성이 호출되지 않는 경우)에서는 이 수치가 70~90%로 상승합니다.
전체 방법론, 증거 체인 세부 정보, 패키지 수준 분석: docs/benchmark.md
scan.yml 구성 참조trivy (설치)jq (빠른 시작 예제에서 사용 — 설치)선택 사항(없으면 모두 정상적으로 건너뜀):
semgrep — pip install semgreptainter — pip install tainter (taint 흐름 분석; 개발 가이드 참조)Apache 2.0 — LICENSE 참조.
UNCERTAIN |
| 약한 신호만 있음 — 조사 필요 |
NOT_REACHABLE | 증거 없음 — 알림 대기열에서 제외 |
| 계층 | 결과 |
|---|
| 원시 CVE(Trivy) | 72 |
| 분류된 탐지 결과(VulnReach) | 90 |
| DYNAMICALLY_REACHABLE — 지금 수정 | 49 |
| STATICALLY_REACHABLE — 이번 스프린트에 수정 | 23 |
| UNCERTAIN — 조사 | 18 |
| NOT_REACHABLE — 제외 | 0 |
| CI 파이프라인 게이트 | 차단됨 |