jwedtan/PoCWatch
GitHub: jwedtan/PoCWatch
一个面向新发布 CVE 的实时分类仪表板,聚合 NVD 元数据、EPSS 利用概率评分和 GitHub 公开 PoC 仓库,帮助安全团队在漏洞爆发时快速识别哪些漏洞已经具备可利用代码。
Stars: 1 | Forks: 0
#
PoCWatch
一个用于新发布 CVE 的实时分类仪表板,整合了 EPSS 漏洞利用可能性评分、NVD 参考标签(补丁 / 漏洞利用 / 厂商建议等)、受影响的产品以及指向 GitHub 上公开的概念验证(PoC)代码库的链接。
旨在回答在漏洞爆发期间唯一重要的问题:**昨天的 CVE 中,哪些已经存在可用的漏洞利用代码?**
## 功能
- **最近 30 天的 NVD 数据** — 拉取最多 200 个最新发布的 CVE(过滤掉 `Awaiting Analysis` / `Unknown` 记录),确保信息流是有用信号而非噪音。
- **EPSS 评分** — 每个 CVE 都会标注 FIRST.org 的漏洞利用预测评分系统(EPSS)的概率和百分位数。
- **PoC 发现** — 在 GitHub 上搜索提及每个 CVE ID 的代码库,并展示 Star 数、最近推送日期和描述。
- **带有漏洞利用标签的参考** — 突出显示带有 `Exploit`、`Vendor Advisory`、`Patch`、`Mitigation` 等标签的 NVD 参考资料,以便您直接跳转到概念验证代码或修复方案。
- **受影响的产品** — 解析 NVD CPE 配置,并在 NVD 的数据完善进度落后于发布时间时回退到 CVE.org (MITRE) 记录,从而让新披露的软件(例如 mailcow)能立即显示出来。
- **按严重性优先级划分的标签页** — `Critical`、`High`、`With PoC / Exploit` 和 `All`,并配有自定义颜色的严重性徽章。
- **标签过滤** — 基于 NVD 参考标签、具有 AND 语义的多选过滤标签。
- **按需查询** — 通过精确 ID 搜索任何 CVE;如果它不在 30 天的时间窗口内,将从 NVD 实时获取并合并到当前视图中。
- **浅色 / 深色 / 跟随系统主题** — 使用符合您偏好的主题。
- **可折叠卡片** — 每个 CVE 默认显示为单行摘要,点击可展开至完整的详情视图。
## 技术栈
- Webpack 上的 [Next.js 16](https://nextjs.org/)(App Router,Server Components,Server Actions)
- [React 19](https://react.dev/) + [TypeScript 5](https://www.typescriptlang.org/)
- [Tailwind CSS 4](https://tailwindcss.com/) + [Shadcn UI](https://ui.shadcn.com/)
- [lucide-react](https://lucide.dev/) 图标
- [next-themes](https://github.com/pacocoursey/next-themes) 用于主题切换
- [Docker](https://www.docker.com/) 多阶段构建,使用 Next.js 的 `output: "standalone"` 模式
### 数据来源
| 来源 | 用途 |
| --- | --- |
| [NVD 2.0 API](https://nvd.nist.gov/developers/vulnerabilities) | CVE 元数据、CVSS、CWE、CPE、参考链接 |
| [CVE.org (MITRE) API](https://cveawg.mitre.org/api/) | 当 NVD CPE 数据缺失时,作为受影响产品的备用数据源 |
| [FIRST.org EPSS API](https://www.first.org/epss/api) | 漏洞利用预测概率 + 百分位数 |
| [GitHub Search API](https://docs.github.com/en/rest/search/search) | 发现公开的 PoC 代码库 |
## 前置条件
- **Docker**(推荐) — Windows/macOS 上的 [Docker Desktop](https://www.docker.com/products/docker-desktop/),或 Linux 上的 Docker Engine + Compose
- **或者** 如果您希望从源代码运行进行开发,则需要 Node.js 20+
- (可选)一个 GitHub 个人访问令牌,可将 PoC 搜索的速率限制从 10 次请求/分钟提升至 30 次请求/分钟
## 快速开始 (Docker)
运行 PoCWatch 最快的方式 — 无需 Node 工具链。
### 1. 克隆并配置
```
git clone https://github.com//pocwatch.git
cd pocwatch
cp .env.example .env
```
编辑 `.env` 并填入您拥有的任何令牌。这两个值都是可选的 — 没有它们应用程序也能正常运行,只是速度会变慢(受速率限制):
```
GITHUB_TOKEN=ghp_your_personal_access_token
NVD_API_KEY=
```
一个不带任何范围(或者只带 `public_repo`)的经典 GitHub PAT 就足够了。
### 2. 构建并启动
```
docker compose up -d
```
首次构建需要 2-4 分钟(npm install + `next build`)。随后的重启将是瞬间完成的。
### 3. 打开仪表板
浏览至 [http://localhost:3000](http://localhost:3000)。
### 日常命令
```
docker compose logs -f # tail logs
docker compose restart # restart after .env changes
docker compose up -d --build # rebuild after code changes
docker compose down # stop and remove the container
```
该容器以非 root 用户运行,在发生故障时自动重启(`restart: unless-stopped`),并对主页执行基于 `wget` 的健康检查,因此可以放心地将其置于 Caddy / Traefik / nginx 之后以提供 TLS 支持。
### 多架构构建
```
docker buildx build --platform linux/amd64,linux/arm64 -t pocwatch .
```
适用于 x86 服务器、Raspberry Pi 和 Apple Silicon 家庭实验室。
### 不使用 Compose
如果您不想使用 Compose:
```
docker build -t pocwatch .
docker run --rm -p 3000:3000 \
-e GITHUB_TOKEN=ghp_your_personal_access_token \
--name pocwatch \
pocwatch
```
## 本地开发
适合希望获得热重载和快速编辑循环的贡献者。需要 Node.js 20+。
```
npm install
cp .env.example .env.local
npm run dev
```
打开 [http://localhost:3000](http://localhost:3000)。保存文件将触发快速刷新。
### 其他脚本
```
npm run build # production build (Webpack — see note below)
npm run start # serve the build output
npm run lint # ESLint
```
## 项目布局
```
src/
app/
actions.ts # Server Actions (lookupCveById)
globals.css # Tailwind + theme tokens (teal / mist palette)
icon.svg # Favicon (binoculars on teal tile)
layout.tsx # Root layout, ThemeProvider, metadata
page.tsx # Server component, fetches dashboard data
components/
cve-dashboard.tsx # Main client UI (search, tabs, cards, filters)
theme-provider.tsx # next-themes wrapper
theme-toggle.tsx # Light/dark/system menu
ui/ # Shadcn primitives
lib/
cve.ts # All data fetching, parsing, and enrichment
utils.ts # cn() helper
Dockerfile # Multi-stage build → standalone Next.js runtime
docker-compose.yml # One-command deploy with healthcheck + restart policy
.dockerignore # Keeps node_modules / .next / .env out of the build context
.env.example # Template for .env (Docker) and .env.local (npm dev)
next.config.ts # output: "standalone", devIndicators disabled
```
## 数据丰富化是如何工作的
对于每次 `getDashboardData()` 调用:
1. 从 NVD 拉取过去 30 天的 CVE(最多 200 个),过滤掉仍在等待分析的记录。
2. 在单个请求中获取整个批次的 EPSS 分数。
3. 对于每个 CVE,并行执行(带有小型并发限制器以避免触发 429 错误):
- 在 GitHub 上搜索 `CVE-YYYY-NNNN` 代码库。
- 如果 NVD 未返回 `affected` 配置,则回退到 CVE.org 记录以恢复供应商 / 产品 / 版本范围信息。
4. 将所有内容合并为 `CveRecord` 并按发布日期排序。
按需查询(`lookupCveById`)会复用 `buildCveRecord`,因此显式搜索的 CVE 始终会显示完整的 PoC 和 EPSS 丰富化信息,即使其发布时间超过 30 天或仍处于 `Awaiting Analysis` 状态。
## 故障排除
### `连接期间发生错误:open //./pipe/dockerDesktopLinuxEngine`
Docker Desktop 未运行。请从“开始”菜单启动它,并等待系统托盘中的鲸鱼图标停止动画,然后重新运行 `docker compose up -d`。使用 `docker version` 进行验证 — 应该同时出现 `Client:` 和 `Server:` 块。
### 来自 `docker compose` 的 `Invalid interpolation format`
Compose 环境变量默认值使用 `${VAR:-default}`(值前面的短横线),而不是 `${VAR:default}`。有关正确的格式,请参见 `docker-compose.yml`。
### 仪表板显示“No CVEs match your filters”
您被 NVD 进行了速率限制(HTTP 429)。请等待 30 秒,或者申请一个 [NVD API key](https://nvd.nist.gov/developers/request-an-api-key) 并在 `.env` 中设置 `NVD_API_KEY`,然后执行 `docker compose restart`。
### GitHub PoC 链接缺失
原因相同 — 未经身份验证的 GitHub Search API 上限为 10 次请求/分钟。请将 `GITHUB_TOKEN` 添加到 `.env` 并执行 `docker compose restart`。
### 端口 3000 已被占用
停止冲突的进程,或者在 `docker-compose.yml` 中重新映射端口:
```
ports:
- "8080:3000" # host:container
```
然后浏览至 `http://localhost:8080`。
## 备注与限制
- **NVD 速率限制**对未经身份验证的客户端非常严格。应用程序会优雅地降级(返回空列表)而不是抛出异常。
- **未经身份验证的 GitHub** 上限为 10 次搜索请求/分钟。仪表板会为每个可见的 CVE 获取 PoC,因此强烈建议提供 `GITHUB_TOKEN`。
- **PoC 质量未经审查。** 提及 CVE ID 的代码库不一定是可用的漏洞利用程序 — 请将结果作为分类排查的起点,而非绝对事实。
- **内存缓存**会在容器重启时丢失。Next.js 的 fetch 缓存使用 1 小时的 `revalidate`,因此冷启动时将重新请求一次所有上游 API。
## 许可证
MIT — 仅供个人/研究使用。获取的数据属于其各自的来源(NIST、MITRE、FIRST.org、GitHub)。
## 功能
- **最近 30 天的 NVD 数据** — 拉取最多 200 个最新发布的 CVE(过滤掉 `Awaiting Analysis` / `Unknown` 记录),确保信息流是有用信号而非噪音。
- **EPSS 评分** — 每个 CVE 都会标注 FIRST.org 的漏洞利用预测评分系统(EPSS)的概率和百分位数。
- **PoC 发现** — 在 GitHub 上搜索提及每个 CVE ID 的代码库,并展示 Star 数、最近推送日期和描述。
- **带有漏洞利用标签的参考** — 突出显示带有 `Exploit`、`Vendor Advisory`、`Patch`、`Mitigation` 等标签的 NVD 参考资料,以便您直接跳转到概念验证代码或修复方案。
- **受影响的产品** — 解析 NVD CPE 配置,并在 NVD 的数据完善进度落后于发布时间时回退到 CVE.org (MITRE) 记录,从而让新披露的软件(例如 mailcow)能立即显示出来。
- **按严重性优先级划分的标签页** — `Critical`、`High`、`With PoC / Exploit` 和 `All`,并配有自定义颜色的严重性徽章。
- **标签过滤** — 基于 NVD 参考标签、具有 AND 语义的多选过滤标签。
- **按需查询** — 通过精确 ID 搜索任何 CVE;如果它不在 30 天的时间窗口内,将从 NVD 实时获取并合并到当前视图中。
- **浅色 / 深色 / 跟随系统主题** — 使用符合您偏好的主题。
- **可折叠卡片** — 每个 CVE 默认显示为单行摘要,点击可展开至完整的详情视图。
## 技术栈
- Webpack 上的 [Next.js 16](https://nextjs.org/)(App Router,Server Components,Server Actions)
- [React 19](https://react.dev/) + [TypeScript 5](https://www.typescriptlang.org/)
- [Tailwind CSS 4](https://tailwindcss.com/) + [Shadcn UI](https://ui.shadcn.com/)
- [lucide-react](https://lucide.dev/) 图标
- [next-themes](https://github.com/pacocoursey/next-themes) 用于主题切换
- [Docker](https://www.docker.com/) 多阶段构建,使用 Next.js 的 `output: "standalone"` 模式
### 数据来源
| 来源 | 用途 |
| --- | --- |
| [NVD 2.0 API](https://nvd.nist.gov/developers/vulnerabilities) | CVE 元数据、CVSS、CWE、CPE、参考链接 |
| [CVE.org (MITRE) API](https://cveawg.mitre.org/api/) | 当 NVD CPE 数据缺失时,作为受影响产品的备用数据源 |
| [FIRST.org EPSS API](https://www.first.org/epss/api) | 漏洞利用预测概率 + 百分位数 |
| [GitHub Search API](https://docs.github.com/en/rest/search/search) | 发现公开的 PoC 代码库 |
## 前置条件
- **Docker**(推荐) — Windows/macOS 上的 [Docker Desktop](https://www.docker.com/products/docker-desktop/),或 Linux 上的 Docker Engine + Compose
- **或者** 如果您希望从源代码运行进行开发,则需要 Node.js 20+
- (可选)一个 GitHub 个人访问令牌,可将 PoC 搜索的速率限制从 10 次请求/分钟提升至 30 次请求/分钟
## 快速开始 (Docker)
运行 PoCWatch 最快的方式 — 无需 Node 工具链。
### 1. 克隆并配置
```
git clone https://github.com/标签:CISA项目, CVE, EPSS评分, GitHub安全, GPT, NVD, PB级数据处理, PoC发现, SecOps, 云安全架构, 威胁情报, 安全仪表盘, 安全运维, 开发者工具, 数字签名, 漏洞优先级评估, 漏洞分诊, 漏洞管理, 网络安全, 自动化分诊, 自动化攻击, 误配置预防, 请求拦截, 隐私保护