VikasGothwal/cve-intel-agent
GitHub: VikasGothwal/cve-intel-agent
一个基于多 LLM 提供商和 NVD API 的多智能体系统,能将 CVE 或自由文本查询转化为符合 SOC 标准的结构化威胁情报简报。
Stars: 0 | Forks: 0
# 🛡️ CVE 情报智能体
**在线演示:** [cve-intel-agent.streamlit.app](https://cve-intel-agent.streamlit.app)
## 功能简介
安全团队需要针对新出现的漏洞获取快速、结构化的情报。该智能体接收 CVE ID(例如 `CVE-2024-21413`)或自由文本查询(例如 `oauth token theft`),并生成一份符合 SOC 标准的威胁简报,涵盖严重程度、受影响的产品、技术细节、检测指南和参考信息。
该简报基于 NIST 国家漏洞数据库的真实数据——而不仅仅是 LLM 的通用知识——并通过精心设计的 prompt 生成,旨在抑制幻觉并强制保持一致的结构。
Streamlit UI 允许用户选择模型(Gemini 2.5 Flash、Gemini 2.5 Flash-Lite,或通过 Groq 调用 Llama 3.3 70B),输入 CVE 或主题,并观察 pipeline 的运行过程。每次运行都会连同元数据一起持久化到磁盘,以便在不同的模型之间对比输出差异。
## 工作原理
```
flowchart TD
A[User Input
CVE ID or free text] --> B{Input Parser
regex match} B -->|matches CVE-YYYY-NNNN| C[fetch_cve] B -->|free text| D[search_cves
keyword search] C --> E[NVD API
tools/nvd.py] D --> E E --> F[Clean structured JSON
CVSS · CWEs · products · refs] F --> G[Research Agent
agents/research.py] G --> H[LLM call
via llm_client.py] H --> I[Markdown threat brief] I --> J[Streamlit UI
render + download] I --> K[runs/v1/*.md
saved with metadata] style G fill:#3b82f6,stroke:#1e40af,color:#fff style H fill:#8b5cf6,stroke:#6d28d9,color:#fff style I fill:#10b981,stroke:#047857,color:#fff ``` ## 组件 - `tools/nvd.py` — NIST NVD 2.0 API 的简洁封装。处理 CVSS 版本回退(v3.1 → v3.0 → v2)、CWE 提取、CPE 解析为可读的供应商/产品/版本信息以及参考标签。 - `llm_client.py` — 与提供商无关的 LLM 封装。支持 Gemini(原生 SDK)和 Groq/Anthropic/OpenAI(通过 [AISuite](https://github.com/andrewyng/aisuite))。这是切换提供商的单一节点;`list_available_models()` 辅助函数会隐藏任何未配置 API key 的模型。 - `prompts.py` — 系统 prompt,受版本控制且易于迭代。 - `agents/research.py` — 获取 NVD 数据,格式化 prompt,调用 LLM,并保存带有元数据的运行记录。 - `pipelines/v1.py` — 将研究智能体封装在统一的 `run(user_input, model_label)` 接口之后,以便 UI 可以路由到任何 pipeline 而无需了解其内部实现。 - `pipelines/__init__.py` — pipeline 注册中心。新的 pipeline 模块在此注册;UI 从这个唯一的事实来源中获取它们。 - `app.py` — Streamlit UI,包含 pipeline 版本下拉菜单、模型选择器、实时进度状态、分阶段展开面板和下载按钮。 每次运行都会保存到 `runs/v1/_.md`,其中元数据(输入、模型、使用的 CVE)以 HTML 注释的形式嵌入。精选的示例输出存放在 `runs/v1/examples/` 中。
## 技术栈
- **Python 3.12**
- **Streamlit** — UI 和部署
- **AISuite + Google GenAI SDK + Groq SDK** — 多提供商 LLM 访问
- **NIST NVD 2.0 API** — 权威的 CVE 数据
- **测试过的模型:** Gemini 2.5 Flash、Gemini 2.5 Flash-Lite、Llama 3.3 70B(通过 Groq)
## 本地运行
```
git clone https://github.com/YOUR_USERNAME/cve-intel-agent.git
cd cve-intel-agent
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# 编辑 .env 填入你的密钥:NVD_API_KEY, GOOGLE_API_KEY, GROQ_API_KEY
streamlit run app.py
```
三个提供商的免费 API key:
- NVD:
- Gemini:
- Groq:
## 值得一提的设计决策
**为什么工具层要与智能体分开。** `tools/nvd.py` 对 LLMs 一无所知;智能体对 NVD 的 JSON 结构也一无所知。这两层可以独立测试,也可以在不触碰另一层的情况下进行替换。
**为什么通过原生 SDK 路由 Gemini,而其他通过 AISuite 路由。** AISuite 的 Google 提供商需要 Vertex AI,这意味着需要设置 GCP 项目和计费。原生的 `google-generativeai` SDK 只需一个免费的 AI Studio key 即可工作。`chat()` 函数抽象了这种差异,因此代码库的其余部分不必关心采用了哪种路径。
**为什么需要 pipeline 注册中心。** UI 渲染来自每个 pipeline 返回的通用 `stages` 契约的结果。每个 pipeline 模块都暴露一个统一的 `run(user_input, model_label)` 并在 `pipelines/__init__.py` 中注册自己。当 pipeline 发生变化时,UI 无需更改。
**为什么将每次运行保存到磁盘。** 生成的输出是可对比的产物。只有在带有元数据持久化的情况下,比较不同模型或 prompt 处理相同 CVE 的方式才有意义。`runs/` 文件夹使这成为可能。
**为什么不让 LLM 决定输入是否为 CVE ID。** 正则表达式更快、更便宜且 100% 可靠。将 LLM 用作路由器是一种学习练习;将 LLM 用于普通代码就能胜任的任务是一种代价高昂的反模式。
**为什么模型下拉菜单只显示已配置 key 的模型。** 如果用户没有设置 `ANTHROPIC_API_KEY`,Anthropic 选项就不会出现。带着模糊的错误悄无声息地失败,比根本不提供该选项更糟糕。
## 关于
由 [Vikas Gothwal](https://vikasgothwal.com) 构建
*本项目仅用于教育目的。生成的简报由 LLM 辅助完成,不应作为安全决策的唯一依据。*
CVE ID or free text] --> B{Input Parser
regex match} B -->|matches CVE-YYYY-NNNN| C[fetch_cve] B -->|free text| D[search_cves
keyword search] C --> E[NVD API
tools/nvd.py] D --> E E --> F[Clean structured JSON
CVSS · CWEs · products · refs] F --> G[Research Agent
agents/research.py] G --> H[LLM call
via llm_client.py] H --> I[Markdown threat brief] I --> J[Streamlit UI
render + download] I --> K[runs/v1/*.md
saved with metadata] style G fill:#3b82f6,stroke:#1e40af,color:#fff style H fill:#8b5cf6,stroke:#6d28d9,color:#fff style I fill:#10b981,stroke:#047857,color:#fff ``` ## 组件 - `tools/nvd.py` — NIST NVD 2.0 API 的简洁封装。处理 CVSS 版本回退(v3.1 → v3.0 → v2)、CWE 提取、CPE 解析为可读的供应商/产品/版本信息以及参考标签。 - `llm_client.py` — 与提供商无关的 LLM 封装。支持 Gemini(原生 SDK)和 Groq/Anthropic/OpenAI(通过 [AISuite](https://github.com/andrewyng/aisuite))。这是切换提供商的单一节点;`list_available_models()` 辅助函数会隐藏任何未配置 API key 的模型。 - `prompts.py` — 系统 prompt,受版本控制且易于迭代。 - `agents/research.py` — 获取 NVD 数据,格式化 prompt,调用 LLM,并保存带有元数据的运行记录。 - `pipelines/v1.py` — 将研究智能体封装在统一的 `run(user_input, model_label)` 接口之后,以便 UI 可以路由到任何 pipeline 而无需了解其内部实现。 - `pipelines/__init__.py` — pipeline 注册中心。新的 pipeline 模块在此注册;UI 从这个唯一的事实来源中获取它们。 - `app.py` — Streamlit UI,包含 pipeline 版本下拉菜单、模型选择器、实时进度状态、分阶段展开面板和下载按钮。 每次运行都会保存到 `runs/v1/
标签:AI安全, Apex, API集成, Chat Copilot, CVE, DLL 劫持, Gemini, GPT, Kubernetes, Llama 3, NVD, PyRIT, Python, Streamlit, 人工智能, 可观测性, 多智能体系统, 大语言模型, 威胁情报, 威胁简报, 安全运营中心, 密码管理, 开发者工具, 数字签名, 数据展示, 无后门, 无线安全, 机器学习, 漏洞分析, 漏洞管理, 生成式AI, 用户模式Hook绕过, 索引, 红队, 网络安全, 网络映射, 自动化报告, 访问控制, 路径探测, 逆向工具, 隐私保护