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/** ![截图](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f05a9c95c1002337.png) ## ✨ 差异化优势 本项目的核心**不是**一个“展示所有最新 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, 漏洞情报, 访问控制, 逆向工具, 销售支持