运行时感知的 SCA —— 证明哪些 CVE 实际可达,而不仅仅是已安装。
VulnReach 现已成为官方 OWASP 项目。 🎉




语言支持: Python 已完全达到生产就绪(污点分析、AST、路由、运行时)。Java 和 JavaScript 具备可用的调用图分析,处于实验阶段。Go、C# 和 PHP 在路线图中。详情见 ROADMAP.md。
VulnReach 在标准 SCA 输出之上构建,通过添加可达性上下文——借助静态分析、污点追踪和实时运行时覆盖,证明检测到的 CVE 中哪些实际可在你的应用程序中到达。
POST /scan/{id}/cancel 停止进行中的扫描GET /scan/{id} 上的 summary + 分类桶VULNREACH_ALLOW_DOCKER_DAEMON=true 显式选择启用docker-socket-proxyPOST /findings/{id}/next-steps 为确定性发现结果生成面向分析师的修复指导(即时操作、验证探针、升级路径、监控)。惰性/按需:扫描从不调用 LLM,LLM 失败时优雅降级。确定性判定为只读。见 docs/api.md。scan.runtime.ebpf 追踪模式(面向 Linux,需显式选择启用)参见:
每个 CVE 通过五层证据链进行分类:
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/污点分析证明 —— 高优先级 |
UNCERTAIN | 仅有弱信号 —— 需调查 |
NOT_REACHABLE | 无证据 —— 从告警队列中抑制 |
安全提示 —— 启动前,将
.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 在确认的关键发现上使构建失败;通过 curl 触发和门禁 —— 见 docs/ci-cd-gating.mdAuthorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none;支持 Ollama 用于离线使用扫描目标:multi-tier-dvpa —— 一个故意存在漏洞的 Python/Django 应用程序,11 个包中共有 72 个原始 CVE。
| 层级 | 结果 |
|---|---|
| 原始 CVE(Trivy) | 72 |
| 分类发现(VulnReach) | 90 |
| DYNAMICALLY_REACHABLE —— 立即修复 | 49 |
| STATICALLY_REACHABLE —— 本冲刺修复 | 23 |
| UNCERTAIN —— 需调查 | 18 |
| NOT_REACHABLE —— 抑制 | 0 |
| CI 流水线门禁 | BLOCKED |
46% 的发现从无差别的“全部修复”队列中移出,进入优先级行动列表。在典型的生产服务中(许多传递依赖从未被调用),这一数字上升到 70–90%。
完整方法论、证据链细节和包级细分:docs/benchmark.md
pip install / Docker 服务器安装和生命周期(start/stop/reload);扫描通过 UI 或 curl 进行,而非 CLIcurl 从 CI 流水线触发和门禁扫描scan.yml 配置参考