more-than-hacking/Dementor-SCA-Scanner
GitHub: more-than-hacking/Dementor-SCA-Scanner
Dementor 是一款开源的可达性感知 SCA 扫描器,通过确定性调用图分析和可选的 AI 可利用性判断,帮助开发者精准筛选出代码中真正能触达的 CVE 漏洞。
Stars: 0 | Forks: 0
# Dementor — SCA 扫描器
**真正能触达你代码的 CVE。**
**具备可达性感知的软件成分分析(SCA)。** 大多数 SCA 工具会把你淹没在那些你几乎没怎么用到的库的“严重”CVE 中。Dementor 只回答那个最关键的问题:
**漏洞代码在你的代码中是否真正可达 —— 并且能否被利用?**
它在**两种模式**下运行:
- **常规扫描** *(默认,无需 API key,免费)* — 使用 tree-sitter 调用图 + 符号分析进行确定性的可达性检测。告诉你一个已知的漏洞函数在你的代码中是否被真正**调用**(`latent` → `imported-unused` → `reachable`)。
- **AI 扫描** *(自带 LLM key)* — 包含常规扫描的所有功能,**外加**一层判断*可利用性*的 AI 分析:不可信的输入是否到达了调用点?是否已被缓解?是否是真实的主动漏洞利用?它将“64 个可怕的严重漏洞”转化为“6 个真正重要且有证据支撑的漏洞”。
完全开源。漏洞数据(OSV、EPSS、CISA KEV)**无需 key 且免费**。AI 层采用**自带 key** 模式 —— 在 Google Gemini 免费层上是免费的,规模化使用也只需几美分。
## 它是如何决策的(各个层级)
| 层级 | 需要 key? | 解决的问题 |
|---|---|---|
| **1. 检测** — 依赖解析 + 与 [OSV](https://osv.dev) 进行精确版本匹配,包括 **transitive** 依赖(lockfiles) | ❌ | *存在哪些易受攻击的库?* |
| **2. 优先级排序** — [EPSS](https://www.first.org/epss/) 漏洞利用概率 + [CISA KEV](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) | ❌ | *哪些 CVE 在现实中正被积极利用?* |
| **3. 可达性** — tree-sitter 调用图 + 易受攻击符号匹配 | ❌ | *漏洞函数是否在我的代码的实际调用路径上?* |
| **4. 可利用性** — 感知 CVE 的 LLM 分析,具备缓解感知能力 | ✅ (AI 扫描) | *可达**且**可利用 —— 带有证明链和缓解措施。* |
第 1–3 层是**确定性的事实**。第 4 层是 **AI 辅助的判断** —— 具有非确定性,旨在供人工审查。这种分离是刻意为之的:我们绝不会将猜测作为事实呈现。
## 快速开始 (Docker)
```
git clone dementor
cd dementor
cp .env.example .env # then edit .env
docker compose up --build
# 打开 http://localhost:5000
```
**常规扫描**(无 AI)所需的最低限度 `.env` 配置:
```
GITHUB_TOKEN=ghp_your_token_here # repo (private) or public_repo; read:org for whole-org scans
ORG_NAME=your-github-org
```
添加以下配置以解锁 **AI 扫描**(自带 key —— 支持 Gemini 免费层):
```
LLM_PROVIDER=gemini # gemini | openai | anthropic
LLM_API_KEY=your_key # https://aistudio.google.com/apikey
LLM_MODEL=gemini-2.5-flash
```
有关所有选项(rate-limit backoff、worker 数量、定价覆盖等),请参见 [`.env.example`](.env.example)。
### 不使用 Docker 运行
```
pip install -r requirements.txt
python server.py # http://localhost:5000 (PORT=5050 to change)
```
## 导入代码库 — GitHub *或* 本地上传
| 来源 | 方式 |
|---|---|
| **GitHub** | Config 标签页 → 保存 token + 组织 → **Fetch all from GitHub**,或通过 `owner/repo` / URL 进行扫描 |
| **本地上传** | Repositories 标签页 → **Upload repo(s)** → 选择一个或多个 **`.zip`** 文件(无需 GitHub,无需 token) |
上传的代码库会在本地解压(带有 zip-slip 保护),标记为 **local**,并像克隆的代码库一样进行扫描 —— 非常适合扫描你无法或不愿推送到 GitHub 的代码。
## 使用仪表盘
1. **Config** — token + 组织(可选),选择 **Scan mode**:*Normal*(默认)或 *AI scan*。
2. **Repositories** — 从 GitHub 获取或上传 `.zip` 文件;对每一个进行 **Scan** / **Re-scan**;固定 **Keep** 以保留克隆;**Clear findings**(保留克隆)或 **Delete repo**(移除克隆及扫描结果)。
3. **Scans** — 每个任务有实时流式日志;随时 **Stop** 正在运行的扫描;历史记录在重启后依然保留。
4. **Results** — 扫描结果根据可达性 + 威胁情报进行排名;支持逐行 **Delete**;点击某一行可查看证据:高亮的漏洞代码行、调用路径、缓解措施和 CVE 详情。
5. **Reachability** — 包含其数据流路径的可利用性扫描结果。
### 可达性判定结果的含义
| 判定 | 含义 |
|---|---|
| **Latent** | 在清单文件中声明,但未在代码中导入/使用 |
| **Imported-unused** | 使用了该库,但未调用*有漏洞的*函数 |
| **Reachable** | 漏洞函数实际上被调用了(确定性) |
| **Active exploit** *(仅限 AI 扫描)* | 可达**且**存在触发条件,无缓解措施 |
## 磁盘与留存
- **Git 克隆默认在每次扫描后释放**(扫描结果保留在报告中;重新扫描会再次克隆)。保持磁盘占用极小 —— 这在 Docker 中很重要。
- 在任何代码库上固定 **Keep** 即可保留其源码(用于数据流视图 + 快速重新扫描)。
- **上传的代码库始终会被保留** —— 它们的文件是唯一的副本。
## 支持的语言 / 生态系统
| 语言 | 清单文件 | 传递性解析 | 调用图 |
|---|---|---|---|
| Python | `requirements.txt`, `Pipfile.lock`, `poetry.lock`, `pyproject.toml` | ✅ lockfiles | ✅ |
| Node.js | `package.json`, `package-lock.json` (v1/v2/v3) | ✅ lockfiles | ✅ |
| Java (Maven) | `pom.xml` | ✅ `mvn dependency:tree` (可选开启) | ✅ |
| Go | `go.mod`, `go.sum` | ✅ `go list -m all` (可选开启) | ✅ |
基于工具的传递性解析(Maven/Go)可通过 `DEMENTOR_TOOL_RESOLVE=1` 选择开启。所有生态系统都会从 OSV 获取 CVE 数据。基础设施文件(Dockerfiles、shell、CI YAML)也会被扫描。
## 架构
```
dependency_parser → OSV match (+ transitive) → EPSS/KEV enrich
│
reachability_scan
┌────────────┴─────────────┐
Normal (no AI) AI scan (LLM)
tree-sitter call graph + exploitability / mitigation
+ symbol matching judgment on the reachable set
└────────────┬─────────────┘
reconciled verdict → dashboard
```
关键模块:[`server.py`](dementor_sca/server.py) (Flask API + SSE), [`scan_runner.py`](dementor_sca/scan_runner.py)
(后台编排器), [`reachability_scan.py`](dementor_sca/reachability_scan.py) (检测 + 确定性/AI 可达性分析),
[`callgraph.py`](dementor_sca/callgraph.py) (tree-sitter 调用图), [`pipeline_zero_fp.py`](dementor_sca/pipeline_zero_fp.py)
(OSV + 符号提取), [`threat_intel.py`](dementor_sca/threat_intel.py) (EPSS/KEV), [`transitive_resolver.py`](dementor_sca/transitive_resolver.py)。
## 测试
```
for t in tests/test_*.py; do python "$t"; done # 15 test suites
python benchmark/run_benchmark.py # reachability micro-benchmark
```
基准测试是一个针对*确定性*引擎(无 LLM)的**精选微型基准测试**:包含 14 个手写的 Python/JS/Java/Go 案例 —— 其中 8 个真正可达,6 个为 latent —— 它们会通过真实的 tree-sitter 调用图运行。在这个受控集合中,它能将 reachable 和 latent 完全区分开,没有任何假阳性/假阴性(相比之下,简单的“标记一切”基线准确率仅为 ~57%)。这是该引擎在构造案例上的演示,**并非**声称在任意的真实代码上具备完美的准确性;它还**记录了其已知遗漏的缺口**(变量/数据流别名),而不是将其隐藏。
## 客观的局限性
- **确定性可达性是由符号驱动的。** 当安全公告指明了漏洞函数时(大多数都会这么做),常规模式能精准定位它。当 OSV 列出*没有*函数名时,常规模式只能确认该库已被导入 —— **AI 扫描**会阅读 CVE 描述来填补这一空白。
- **AI 可利用性判定是非确定性的**,偶尔可能会夸大或低估风险。它旨在*为人类进行优先级排序*,而不是取代人工审查。底层事实(检测、版本匹配、调用路径)是确定性且可复现的。
- **尚无运行时/动态分析**(eBPF/IAST)—— 可达性目前是静态的。请参见 `ROADMAP.md`。
## 配置参考
| 环境变量 | 用途 | 默认值 |
|---|---|---|
| `GITHUB_TOKEN`, `ORG_NAME` | GitHub 访问权限 | — |
| `LLM_PROVIDER` / `LLM_API_KEY` / `LLM_MODEL` / `LLM_API_URL` | AI 扫描 (自带 key) | gemini / — / gemini-2.5-flash |
| `PORT` | 服务器端口 | 5000 |
| `REACHABILITY_WORKERS` | 并行可达性分析 worker 数 | 4 |
| `LLM_MAX_RETRIES` / `LLM_BACKOFF_BASE` / `LLM_BACKOFF_MAX` | Rate-limit backoff | 5 / 2 / 60 |
| `DEMENTOR_TOOL_RESOLVE` | 启用 Maven/Go 传递性解析 | off |
| `DEMENTOR_MAX_UPLOAD_MB` | 最大代码库上传大小 | 500 |
凭据也可以存放在 `config/org_config.yaml` 中(已在 gitignore 中忽略);环境变量优先级更高。
## License
**MIT** — 详见 [`LICENSE`](LICENSE)。© More Than Hacking (MTH) — Yaswanth Sivadanam。第三方
依赖许可证(全部与 MIT 兼容;无 GPL/AGPL)已记录在
[`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md) 中。漏洞数据 © 其各自来源
(OSV, FIRST/EPSS, CISA)。
标签:人工智能, 可达性分析, 漏洞优先级评估, 用户模式Hook绕过, 请求拦截, 逆向工具