yuvika-s/VulnIQ
GitHub: yuvika-s/VulnIQ
VulnIQ 是一个将跨工具安全发现关联为多层攻击链并据此进行漏洞优先级排序的 AI 驱动平台,帮助安全团队从海量告警中识别最关键的入侵路径并优先修复。
Stars: 0 | Forks: 0
# VulnIQ — 统一的多层攻击链关联与优先级排序引擎
每个安全工具都在孤立地发出警报。SAST 发现了一个 SQL injection。DAST 发现了一个暴露的 admin endpoint。基础设施扫描器发现了一个未打补丁的库。IAM 扫描器发现了一个权限过高的 service account。如今,四位不同的工程师将它们作为四个互不相关的“中危”发现进行评估——而且没有一个被紧急修补。
**将它们链接在一起,这就是一条严重的入侵路径。**
VulnIQ 摄取来自每个 OSI 层和每个工具的发现,构建一个 **attack graph**,找到将低严重性发现连接成高影响入侵路径的 **chains**,并对能 *解锁最危险 chains* 的发现进行优先级排序。
## AI 架构 — 一个模型,四种 agentic 角色
**模型:`claude-opus-4-7`** (Anthropic)。用于四种不同的 agentic 角色,每种角色都有其自己的 system prompt、范围和确定性 fallback。
| # | 角色 | 文件 | 功能 | Agentic 模式 |
|---|---|---|---|---|
| 1 | **提取与规范化 Agent** *(最关键)* | `backend/app/ingestion/extraction_agent.py` | 深入读取以 **任何格式** (JSON, XML, CSV, XLSX, PDF) 和 **任何文档风格** 上传的发现,并将每个发现映射到统一 schema 中。推断 OSI 层、发现类型以及每个发现授予攻击者的 **capabilities** — 这是所有链接的基础。通过推理填补缺失字段,分配提取置信度,并标记低置信度项目供人工审查。 | 深度阅读提取 + schema 映射 + 置信度评分 |
| 2 | **Edge 推断 Agent** | `backend/app/graph/edge_agent.py` | 对于每对候选发现,判断 A 授予的 capability 是否合理地 **ENABLES(促成)** 了 B 的利用。返回置信度 + 依据。构建 attack graph 的语义层。 | 批量处理(12 对/调用)的带依据语义分类 |
| 3 | **Chain 叙述 Agent** | `backend/app/agent/chain_narrator.py` | 为每个排名的 attack chain 编写 2-3 句从攻击者视角出发的入侵故事,展示在每个 chain 卡片下。 | 结构化 prompt → 自然语言 |
| 4 | **Dashboard Copilot Agent** | `backend/app/agent/dashboard_agent.py` | 真正的 ReAct 风格 tool-calling agent,支持“Ask VulnIQ”。拥有六个工具、有界循环,可运行反事实模拟 (`simulate_patch`)。 | 真正的 tool-calling agent |
**为什么只用一个模型而不是多模型?** 单凭 Claude 已经足以胜任这四项工作。多模型架构会增加集成成本、密钥管理、延迟和故障面,而这些任务在质量上却没有可衡量的提升。正确的答案是使用一个强大的模型,扮演四个定义明确的 agentic 角色,每个角色都有确定性的 fallback,这样即使离线,pipeline 也能进行端到端运行。
## 文件摄取 — 关键的进门处
团队以不同的格式和风格提交发现。流程如下:
```
upload (JSON/XML/CSV/XLSX/PDF)
→ extractors.py format → LLM-readable records
→ Extraction Agent (Role 1) records → normalized Findings + confidence + review queue
→ engine.ingest_uploads() merge + recompute graph/chains/priorities
→ new findings chain immediately alongside everything else
```
模棱两可/杂乱的输入(例如手写的、没有 CVE 或严重性的观察结果)**不会**被拒绝 — agent 会推断缺失的字段,降低置信度分数,并将该项添加到仪表板中显示的 **人工审查队列** 中。通过 **Upload Findings** 标签页 (`POST /api/upload`) 上传。
有关如何获取 Anthropic 密钥并运行整个程序的信息,请参见 **`docs/SETUP.md`**。
## 此原型中有效的内容
- **统一发现 schema**,规范了跨 7 个 OSI 层、来自 11 个模拟工具 (Semgrep, Checkmarx, OWASP ZAP, Burp, Qualys, Nessus, Wiz, Trivy, Snyk, Prowler, ScoutSuite) 的输出
- **两步 attack graph**
- 第一步 — 确定性 edges:`EXPLOITS`,`EXPOSES`,`CORRELATES` (相同根本原因),`REACHES` (资产依赖)
- 第二步 — LLM 推断的 `ENABLES` edges(语义 capability 交接),带有确定性启发式 fallback,以便演示在离线状态下也能运行
- **ChainRisk 评分** = EntryExposure × ExploitLikelihood × PathFeasibility × CrownJewelValue × ControlGap
- **基于中心性的发现优先级** — 一个发现的等级反映了它所处的高风险 chains 的数量,而不是原始的 CVSS
- **实时威胁情报** — NVD,FIRST.org EPSS,CISA KEV(为数据集中的真实 CVE 提供缓存的离线 fallback)
- **嵌入式对话 agent** — 带有 6 个工具(读取 + 操作)的 Claude,包括 `simulate_patch` 这个决定性工具
- **高管简报生成器** 映射到 SEBI CSCRF,ISO 27001 A.8.8,RBI 网络弹性
- **交互式仪表板**,具有优先级列表、attack-chain 叙述、力导向图可视化、态势统计和嵌入式 agent
## 在合成数据集上验证的结果
| 指标 | 结果 |
|---|---|
| 摄取的发现总数 | **153** |
| 跨越 OSI 层 | **7** |
| 来自工具 | **11** |
| 发现的跨层 attack chains | **11** |
| 正确作为噪音推迟处理的发现 | **144 (94.1%)** |
| 首要中断 chain 关键发现 (F-00003) | **位于 11 个 chains 中的 7 个上** |
| 修补那一个发现 | **瓦解 7 个 chains,将组织风险降低 74.8%** |
| 最高 chain 风险 | **78.0** (Spring Actuator → Spring4Shell → hardcoded creds → ledger write) |
## 仓库布局
```
vulniq/
├── README.md ← this file
├── backend/
│ ├── requirements.txt
│ ├── data/
│ │ ├── assets.json
│ │ ├── synthetic_findings.json ← 153 findings with 4 planted golden chains
│ │ └── generate_data.py
│ └── app/
│ ├── main.py ← FastAPI server (10 endpoints)
│ ├── models.py ← Finding / Asset / AttackChain / enums
│ ├── engine.py ← orchestrator (build pipeline + state)
│ ├── ingestion/
│ │ └── loader.py
│ ├── context/intel/
│ │ └── threat_intel.py ← NVD / EPSS / KEV with cache + fallback
│ ├── graph/
│ │ ├── builder.py ← deterministic edges + candidate ENABLES
│ │ ├── cwe_capability_map.py ← CWE / finding-type → capability table
│ │ ├── edge_agent.py ← LLM semantic edge inference (Pass 2)
│ │ └── chains.py ← path-finding, ChainRisk, prioritization
│ ├── agent/
│ │ └── dashboard_agent.py ← Claude agent + 6 tools + offline router
│ └── reports/
│ └── brief.py ← executive brief w/ control mapping
├── frontend/
│ ├── dashboard.html ← standalone, runs in a browser
│ ├── dashboard_shell.html ← HTML + CSS scaffold
│ ├── app.js ← dashboard logic, graph viz, agent
│ ├── data.js ← embedded data bundle
│ ├── bundle.json ← compact data
│ └── snapshot.json ← full engine snapshot
└── docs/
├── PROPOSAL.md
├── ARCHITECTURE.md
├── ROADMAP.md
└── DEMO_SCRIPT.md
```
## 运行原型
### 前端(零设置 — 用于演示)
只需在任何现代浏览器中打开 `frontend/dashboard.html`。它是完全自包含的:数据已嵌入,agent 和 patch 模拟器在 JS 中本地运行。演示无需后端。
### 后端(用于实时真实数据模式)
```
cd backend
pip install -r requirements.txt # fastapi, networkx, anthropic, httpx
export ANTHROPIC_API_KEY=... # optional — enables LLM edge inference + agent
uvicorn app.main:app --reload --port 8000
```
Endpoints:
- `GET /api/health` · `GET /api/stats` · `GET /api/findings[?priority=&layer=]`
- `GET /api/findings/{id}` · `GET /api/chains[?limit=]` · `GET /api/chains/{id}`
- `GET /api/graph[?top_chains=]` — 可视化 payload
- `POST /api/agent` `{message, history}` — 嵌入式对话 agent
- `POST /api/simulate-patch` `{finding_ids: []}` — 决定性操作
- `GET /api/brief` — 高管简报
引擎在启动时构建。如果没有 API 密钥,它会使用确定性启发式方法处理语义 edges — 整个 pipeline 仍然会运行,只是 edge 置信度较为简单。
## 为什么这具有差异化
1. **这是唯一能看到跨工具 chains 的方法。** 每个现有的扫描器都在自己的孤岛内进行排名。CVSS、EPSS、KEV — 它们都不知道你的其他发现或你的 asset graph。VulnIQ 是工具之间缺失的一层。
2. **该图是真实的,而不是 LLM 想象的。** 确定性 edges(来自透明 CWE 表的 capability 交接,来自 CMDB 风格数据的资产可达性)构成了骨架。LLM 仅在确定性步骤已经认为“合理可连接”的地方细化语义 edges。每个 chain 都是完全可审计的 — 没有黑盒。
3. **它产生行动,而不仅仅是排名。** 嵌入式 agent 可以模拟 patch,并告诉 CISO“修复 F-00003 — 瓦解 7 个 chains,−74.8% 组织风险”。这是一种在几秒钟内交付的董事会级别的洞察。
4. **合规性已融入其中。** 每个优先级排序决策都映射到 SEBI CSCRF,ISO 27001 A.8.8,RBI 网络弹性控制。该简报默认即可供监管机构使用。
标签:AI安全运营, AST工具集成, DLL 劫持, GPT, Web报告查看器, XXE攻击, 多智能体, 大语言模型, 攻击图分析, 漏洞管理, 特权检测, 逆向工具, 风险优先级评估