yeodh10/cve-radar
GitHub: yeodh10/cve-radar
一个基于 Streamlit 的 CVE 威胁雷达仪表板,从 NVD 采集漏洞数据并按客户产品关注列表过滤,利用 Claude 生成面向销售的中文漏洞简报。
Stars: 0 | Forks: 0
# 🛰️ CVE 威胁雷达 — 销售导向的漏洞简报
基于 NVD(美国国家漏洞数据库)的真实数据,让销售在客户会议前能直接说:
“贵公司使用的 OO 设备本周刚刚出现了一个致命(9.8分)漏洞。”
**🔗 实时演示: https://yeodh10-cve-radar.streamlit.app/**

## ✨ 差异化优势
本项目的核心**不是**一个“展示所有最新 CVE 的仪表板”。
那种东西很常见。真正的差异化在于**销售工作流本身**:
| 常见的 CVE Feed | CVE 威胁雷达 |
|---|---|
| 按时间顺序列出最新的 CVE | 仅筛选出**影响客户产品的内容** |
| 直接展示英文技术说明 | 转化为**面向决策者的中文简报**(是什么/为什么/怎么处理) |
| 分析全靠人工 | 自动生成**销售在会议上一句话就能用的开场白** |
## 🧩 功能
- **采集** — 从 NVD CVE API 2.0 采集最近 N 天的漏洞,按严重程度(Critical/High 等)分类。处理了速率限制(Rate limit)与重试机制。
- **关注列表过滤** — 通过防火墙/VPN/WAS/DB/网络设备等产品线关键词进行匹配。使用**单词边界匹配**防止部分误报(例如:排除 `linux` ⊂ `linuxfoundation`),并**排除 `vulnerable:false` 的平台 CPE** 以防产品分类错误。(产品*识别*仅处于关键词级别,因此 `apache` 会把 HTTP、CXF、Struts 捆绑在一起 — 存在过度匹配的可能。)
- **版本匹配** — 捕获 NVD 的易受攻击版本范围(`versionStart/End*`)(见 `versions.py`),在卡片上显示“影响版本: ≥10.6.1, <10.6.26”,并在侧边栏输入*我的版本*后,判定每个 CVE **是否受到影响** — 将关键词级别的过度警报缩小到版本级别。
- **LLM 简报** — 严重程度、分数和受影响产品完全*直接*从 NVD 获取,LLM 仅专注于 ① 通俗易懂的中文说明 ② 销售沟通要点。为了节省成本,采用了批量调用 + CVE ID 缓存。
- **双模式** — ① 已提交的**快照**(无需密钥即可立即渲染;部署演示使用*固定的单日样本 + 手写的简报示例*) ② **实时模式**(NVD 实时采集 + LLM 简报;需要密钥,目前未实测)。
- **仪表板** — 严重程度/产品线/搜索过滤,按风险排序,显示匹配依据,提供 NVD 详情链接。
## 🏗️ 结构
```
nvd.py NVD API 2.0 수집 + 정규화(버전 범위 affected_ranges 포함)
severity.py CVSS 점수 → 등급/색/정렬 (순수 함수)
watchlist.py 고객사 제품 워치리스트 + 단어경계 매칭
versions.py 버전 비교 + '이 CVE가 내 버전에 영향?' 판정 (과알림 감소)
brief.py LLM 브리핑 생성 (배치 + 캐시, JSON 출력)
pipeline.py 수집 → 필터 → 정렬 → 브리핑 + 스냅샷 입출력
build_snapshot.py 배포용 스냅샷 생성 CLI
refresh_sample.py 샘플 CVE를 NVD에서 재수집(버전 범위 갱신, 브리핑 보존)
app.py Streamlit 대시보드
tests/ pytest 29건 (버전·파싱·매칭·심각도·LLM mock)
data/sample_cves.json 실제 CVE 11건(NVD) + 손으로 쓴 데모 브리핑 — 고정 스냅샷, 키 없이 렌더
```
## 🚀 运行
```
# 1) 依赖
python -m venv venv
venv\Scripts\activate # (Windows) / source venv/bin/activate (mac·linux)
pip install -r requirements.txt
# 2) API Key 设置(可选) — 即使没有,Snapshot Demo 也能运行
copy .env.example .env # 그리고 ANTHROPIC_API_KEY 등을 채움
# 3) 运行
streamlit run app.py
```
即使没有密钥,也可以通过 `data/sample_cves.json`(真实 CVE + *手写的*演示简报)**立即渲染**(但为固定快照)。
要查看实时简报,请在 `.env` 中填入 `ANTHROPIC_API_KEY`,并在侧边栏点击
**🔄 实时刷新**。
### 更新快照(替换部署演示数据)
```
# 真实数据收集 + 简报生成 → 保存为 Demo 文件(需要 Key)
python build_snapshot.py --days 14 --max 40 --out data/sample_cves.json
# 仅收集(免费,省略简报)
python build_snapshot.py --days 14 --no-brief
```
## ☁️ 部署 (Streamlit Community Cloud)
1. 将此存储库推送到 GitHub(`.env` 已通过 `.gitignore` 排除 — 不会泄露密钥)。
2. [share.streamlit.io](https://share.streamlit.io) → 关联存储库 → 指定 `app.py`。
3. 在 **Settings → Secrets** 中输入密钥(使用 Secrets 而非文件):
ANTHROPIC_API_KEY = "sk-ant-..."
NVD_API_KEY = ""
4. 得益于已提交的 `data/sample_cves.json`,访客无需调用密钥即可立即查看界面。
## 🔐 安全
- API 密钥仅通过 `.env`(本地)或 Streamlit **Secrets**(部署)进行管理,绝不提交到代码库中。
- 仪表板上输出的所有外部文本(如 CVE 说明等)均经过 HTML 转义处理。
## ⚠️ 局限性 (坦诚说明)
这是一个用于销售演示的 Demo。以下是不应将其误解为“可直接商用的威胁管理产品”的几点说明:
- **产品*识别*仍处于关键词级别。** 尽管增加了版本范围比对,但在确定具体是哪款产品时,仍采用类似 `grep` 的方式,将 `apache` 视为 HTTP、CXF、Struts 的集合 → 如果采用基于 CPE 的识别会更准确。
- **版本匹配的局限性。** 对于 NVD 未提供版本范围的 CVE(如分析前等),会判定为“无法判定”,版本比较也是针对点分版本号进行的实用比对(并非完全符合 SemVer/PEP440 标准)。
- **部署样本 = 固定快照。** 实时链接固定为 2026-06-17 的 11 条数据,简报是由*我亲自手写的示例*。实时采集与 LLM 自动简报必须配置密钥才能启用(LLM 路径已通过 Mock 单元测试验证逻辑,并可在具备密钥时通过 `smoke_llm.py` 进行实测)。样本中的版本范围将在 NVD 修复后通过 `refresh_sample.py` 填充。
- **仅支持 NVD(美国)及英语。** 未接入 KISA、KrCERT(韩国国内第一手情报源)。
- **实时模式无速率限制与身份验证。** 仅有缓存 `ttl`,如果在带有密钥的公开应用上疯狂点击刷新,可能会导致 API 费用流失。
### 若用于生产环境
- **CPE(vendor:product:version) 精准匹配** + 结合客户资产清单进行版本比对 — 解决过度报警的关键
- 结合 KISA、KrCERT Feed,增加 KEV(已知被利用)和 EPSS(被利用概率)权重
- 实时接口身份验证与速率限制、按客户划分的关注列表配置、新 CVE 提醒(Slack/邮件)
## 🧪 测试
```
pip install pytest
pytest -q # 29건: 버전비교·영향판정·NVD 파싱·워치리스트·심각도·LLM(mock)
python smoke_llm.py # 키 있을 때 라이브 수집 + LLM 브리핑 실측
python refresh_sample.py # NVD에서 샘플 CVE 재수집(버전 범위 갱신)
```
## 🛠️ 技术栈
Python · Streamlit · NVD CVE API 2.0 · Anthropic Claude (`claude-sonnet-4-6`)
标签:Kubernetes, NVD, Streamlit, XSS, 漏洞情报, 访问控制, 逆向工具, 销售支持