NotThatRob/Cyber-Threat-Intelligence-Center
GitHub: NotThatRob/Cyber-Threat-Intelligence-Center
自动聚合多源威胁情报并为 CVE 生成综合风险评分的轻量级 Web 应用。
Stars: 0 | Forks: 0
# 网络威胁情报中心
**一个能够发现新闻中值得关注的 CVE 并自动对其进行分析的 Web 应用程序。**
大多数 CVE 工具只告诉你存在什么。CTI-Center 告诉你当前什么重要以及为什么重要。它聚合来自 CVE 源、安全新闻来源和漏洞利用目录的数据,然后通过自定义风险评分引擎对其进行标准化、丰富化,并为分析师突出显示最相关的漏洞。
## 功能特性
- **自定义风险评分** — 一个 0-100 的风险评分,融合了 CVSS 基础分 (35%)、通过 CISA KEV 衡量的漏洞利用成熟度 (30%)、新闻热度 (15%)、时效性 (10%) 和联邦修复紧迫性 (10%)。每个评分都包含易于理解的解释,说明其为何与原始 CVSS 不同。被拒绝的 CVE 自动评分为 0。
- **CVE 高亮显示** — 符合关键分析师相关条件的 CVE 会用琥珀色指示器和一句“为何重要”的简短说明进行视觉标记。当 CVE 具有高 CVSS 且伴随网络攻击向量 (AV:N)、被列入 CISA KEV、或被 2 个以上新闻来源报道时,会被高亮显示。简短说明综合了严重性、信号和建议措施(例如,*“严重漏洞可远程利用,已在勒索软件活动中被积极利用 —— 立即修补”*)。
- **仪表板过滤与排序** — 可点击的严重性标签(Critical, High, Medium, Low)、KEV 切换、In News 切换和 Highlighted 切换支持多选过滤。Risk, Severity, 和 Published 列支持排序(降序/升序/默认)。所有过滤器结合文本搜索,并在标签页切换和分页之间保持状态。
- **多源摄取** — 从 NVD API、CISA Known Exploited Vulnerabilities 目录、GitHub Advisory Database、MITRE CVE Services 以及主要安全媒体的 RSS 源拉取数据。
- **新闻感知分析** — 将 CVE 与安全新闻文章关联,并将报道量作为风险信号。在多个来源中被讨论的 CVE 排名更高。新闻页面支持按是否关联 CVE 的文章进行过滤。
- **漏洞利用优先排序** — 优先展示在野外被积极利用、用于勒索软件活动或临近联邦修复截止日期的 CVE,而非高 CVSS 的理论风险。
- **差异检测** — 标记 CVSS 与现实世界风险不一致的情况(例如,“高 CVSS 但未观察到现实世界利用”或“低 CVSS 但被积极利用”)。
- **CVE 详情页** — 每个 CVE 都有专门的页面,显示 CVSS 向量、CWE 弱点 ID、风险因素分解、KEV 修复详情和关联的新闻文章。
- **数据新鲜度** — 随着更多来源报告数据,过时的 CVE 记录会逐步丰富。当有更好的数据时,CVSS 评分、描述、受影响产品和 CVSS 向量会被更新。
- **定时获取** — 每个数据源按其保守的计划运行,并带有随机抖动。HTTP 条件请求避免重新下载未更改的数据。
- **用户偏好** — 可切换的日期格式(US: Feb 21, 2026 / EU: 21 Feb 2026)通过 cookie 持久化。页眉中的“最后更新”时间戳显示数据最后一次获取的时间。
## 技术栈
- **FastAPI** — Web 框架
- **SQLite** — 数据库 (via SQLAlchemy 2.0)
- **Jinja2** — HTML 模板
## 快速开始
### 前置条件
- Python 3.12+
### 安装
```
git clone https://github.com/NotThatRob/Cyber-Threat-Intelligence-Center.git
cd Cyber-Threat-Intelligence-Center
python3 -m venv .venv
# Linux / macOS
source .venv/bin/activate
# Windows (PowerShell — 如果脚本被禁用,运行一次:
# Set-ExecutionPolicy -Scope CurrentUser RemoteSigned)
.\.venv\Scripts\Activate.ps1
# Windows (PowerShell)
.venv\Scripts\Activate.ps1
# Windows (命令提示符)
.venv\Scripts\activate.bat
pip install -e ".[dev]"
```
### 运行
```
uvicorn cti_center.app:app --reload
```
打开 [http://127.0.0.1:8000](http://127.0.0.1:8000)。数据库会在首次启动时自动创建并填充示例数据。实时 CVE 会立即从所有数据源获取,然后按计划重新获取(参见 [获取计划](#fetch-schedule))。
## 页面
### 仪表板 (`/`)
包含三个标签的主视图:
- **Trending** — 最近 30 天内添加到 CISA KEV 的 CVE,或最近 7 天内发布的 Critical/High 严重性 CVE(上限 50 个)。默认按风险评分排序。
- **Recent** — 最近 7 天内发布的所有 CVE,按发布日期排序。
- **All** — 完整的 CVE 数据库,每页 100 条。
**过滤:** 可点击的严重性标签支持多选。KEV, In News, 和 Highlighted 标签可切换开/关。每个标签显示当前视图中匹配的 CVE 实时计数。当任何过滤器处于活动状态时,会出现“Clear filters”链接。所有过滤器结合文本搜索使用 AND 逻辑。
**排序:** 点击 Risk, Severity, 或 Published 列标题可循环切换降序、升序和默认排序顺序。当前排序列用箭头指示符高亮显示。
**搜索:** 在 CVE ID、受影响产品和描述中进行自由文本搜索。切换标签页或浏览页面时,过滤器、排序顺序和搜索都会保留。
### CVE 详情 (`/cve/{id}`)
显示单个 CVE 的完整记录:描述、带有 CVSS 评分的严重性、CVSS 向量字符串、CWE 弱点 ID、受影响产品和发布日期。高亮显示的 CVE 会展示一个“Why this matters”横幅,附带以行动为导向的摘要。风险评分分解显示每个组件(CVSS Base, Exploit Maturity, News Velocity, Recency, KEV Urgency)获得的分数,并附带可读的因素解释。
对于列入 KEV 的 CVE,高亮部分显示 CISA 强制要求的修复行动、添加日期、联邦截止日期和勒索软件活动状态。关联的新闻文章列出来源和发布日期。
### 新闻 (`/news`)
列出来自 RSS 源的安全新闻文章,包含三个过滤标签:All, With CVEs(提到至少一个 CVE ID 的文章), 和 Without CVEs。每篇文章行显示关联的 CVE ID 作为指向其详情页的可点击链接。
## 数据来源
### NVD API
CVE 在服务器启动时自动从 [NVD API 2.0](https://nvd.nist.gov/developers/vulnerabilities) 获取,也可以手动获取:
```
python -m cti_center.fetch
```
可选择设置 `NVD_API_KEY` 以获得更快的速率限制(请求间隔 0.6s vs 6s):
```
export NVD_API_KEY=your-api-key
```
在 [https://nvd.nist.gov/developers/request-an-api-key](https://nvd.nist.gov/developers/request-an-api-key) 申请免费密钥。
### CISA KEV
[CISA Known Exploited Vulnerabilities](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) 目录在启动时自动获取。KEV 目录中的 CVE 在仪表板上被标记为“Actively Exploited”,并包含联邦修复截止日期和勒索软件活动指标。
### GitHub Advisory Database
经审核的安全建议在启动时和通过 `python -m cti_center.fetch` 从 [GitHub Advisory Database](https://github.com/advisories) 获取。涵盖 npm, pip, Maven, Go, Rust 和其他生态系统的建议。
可选择设置 `GITHUB_TOKEN` 以获得更高的速率限制(5,000 请求/小时 vs 60 请求/小时):
```
export GITHUB_TOKEN=your-token
```
### 安全新闻 (RSS)
安全新闻文章在启动时和通过 `python -m cti_center.fetch` 自动从 RSS 源获取。目前收录:
- BleepingComputer
- The Hacker News
- Dark Reading
- Krebs on Security
提及 CVE ID 的文章会链接到数据库中的 CVE,并显示在 `/news` 页面上。有新闻报道的 CVE 在仪表板上显示徽章。CVE ID 分三个阶段提取:首先从 RSS 标题和摘要,然后是 `content:encoded`(如果可用),最后作为手段进行全页获取(受速率限制,并遵守 robots.txt)。
### MITRE CVE 丰富
缺少 CVSS 评分的 CVE(例如,仅 KEV 记录)在启动时使用 [MITRE CVE Services API](https://www.cve.org/AllResources/CveServices) 自动丰富。这会填充 CVSS 评分、严重性评级、描述和受影响产品信息。
## 获取计划
数据源在启动时立即获取一次,然后按交错计划重新获取。每个作业包含随机抖动,使请求不会落在可预测的间隔。
| Source | Interval | Jitter | Notes |
|--------|----------|--------|-------|
| NVD API | 4 hours | ±10 min | Date-range queries for last 7 days |
| CISA KEV | 12 hours | ±30 min | HTTP conditional request (ETag/If-Modified-Since) — skips download if unchanged |
| GitHub Advisories | 6 hours | ±15 min | Date-range queries for last 7 days |
| RSS News | 2 hours | ±10 min | Per-feed conditional requests — skips unchanged feeds |
| MITRE Enrichment | 6 hours | ±15 min | Only queries CVEs with missing CVSS scores |
条件请求状态(ETag 和 Last-Modified 头)持久化到 `data/fetch_state.json`,以便在服务器重启后保留。
手动获取仍可随时通过 `python -m cti_center.fetch` 触发。
## 风险评分
CTI-Center 为每个 CVE 计算一个自定义的 0-100 风险评分,旨在揭示真正重要的内容,而不仅仅是具有高 CVSS 数值的内容。
| Component | Default Weight | Description |
|-----------|---------------|-------------|
| `cvss` | 35 | Raw CVSS v3 score mapped proportionally |
| `exploit` | 30 | CISA KEV listing + ransomware indicator |
| `news` | 15 | Number of news sources covering the CVE (capped at 5) |
| `recency` | 10 | How recently the CVE was published (last 7 days = full weight) |
| `urgency` | 10 | Proximity to federal remediation deadline |
分数被归类为风险标签:Critical (75-100), High (50-74), Medium (25-49), 和 Low (0-24)。被拒绝的 CVE 自动获得 0 分。每个分数包含解释评级的因素字符串,可通过仪表板上的工具提示查看。示例:
- *"Actively exploited in the wild (CISA KEV)"*
- *"Remotely exploitable over the network (AV:N)"*
- *"High CVSS but no real-world exploitation observed"*
- *"Low CVSS but actively exploited — real-world risk exceeds base score"*
- *"Federal remediation deadline overdue"*
### 自定义权重
权重可以通过编辑 `cti_center/scoring.py` 中的 `RISK_WEIGHTS` 字典来配置。每个值是该组件可以贡献的最大分数。权重总和必须为 100。
```
# cti_center/scoring.py
RISK_WEIGHTS = {
"cvss": 35, # Raw CVSS v3 score mapped proportionally
"exploit": 30, # CISA KEV listing + ransomware indicator
"news": 15, # Number of news sources covering the CVE
"recency": 10, # How recently the CVE was published
"urgency": 10, # Proximity to federal remediation deadline
}
```
例如,一个优先考虑漏洞利用状态而非 CVSS 的组织可以将权重从 `cvss` 转移到 `exploit`:
```
RISK_WEIGHTS = {
"cvss": 20,
"exploit": 45,
"news": 15,
"recency": 10,
"urgency": 10,
}
```
权重也可以通过可选的 `weights` 参数以编程方式传递给 `compute_risk_score()` 和 `score_cves()`,这将覆盖该调用的 `RISK_WEIGHTS`,而不改变全局默认值。
## 配置
所有 API 密钥都是可选的,从环境变量或项目根目录下的 `api.env` 文件加载:
```
# api.env (可选 — 不覆盖现有环境变量)
NVD_API_KEY=your-nvd-key
GITHUB_TOKEN=your-github-token
```
## 部署
默认的 `uvicorn ... --reload` 命令用于本地开发。要在服务器上托管 CTI-Center,请遵循以下指南。
### 生产服务器
运行 uvicorn 时不带 `--reload`,绑定到所有接口,并使用多个 worker:
```
uvicorn cti_center.app:app --host 0.0.0.0 --port 8000 --workers 4
```
### 反向代理
在生产环境中,在 uvicorn 前放置一个反向代理,用于 TLS 终止、静态文件服务和速率限制。
**Nginx** — 最小配置:
```
server {
listen 443 ssl;
server_name cti.example.com;
ssl_certificate /etc/letsencrypt/live/cti.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cti.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
**Caddy** 是一个更简单的替代方案,具有自动 HTTPS 功能 — 一个两行的 `Caddyfile`:
```
cti.example.com
reverse_proxy localhost:8000
```
### Docker
示例 `Dockerfile`(不包含在仓库中 —— 如需要请创建一个):
```
FROM python:3.12-slim
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir -e .
EXPOSE 8000
CMD ["uvicorn", "cti_center.app:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
```
运行它:
```
docker build -t cti-center .
docker run -d -p 8000:8000 \
-v cti-data:/app \
-e NVD_API_KEY=your-key \
-e GITHUB_TOKEN=your-token \
cti-center
```
或使用 `docker-compose.yml`:
```
services:
cti-center:
build: .
ports:
- "8000:8000"
volumes:
- cti-data:/app
environment:
- NVD_API_KEY=${NVD_API_KEY}
- GITHUB_TOKEN=${GITHUB_TOKEN}
volumes:
cti-data:
```
### 环境变量
| Variable | Required | Description |
|----------|----------|-------------|
| `NVD_API_KEY` | No | NVD API key for faster rate limits (0.6s vs 6s between requests) |
| `GITHUB_TOKEN` | No | GitHub token for higher GHSA rate limits (5,000 req/hr vs 60 req/hr) |
两者也可以设置在项目根目录下的 `api.env` 文件中(参见 [配置](#configuration))。
### 部署注意事项
- **SQLite 持久化** — 数据库是一个本地文件 (`cti_center.db`)。在 Docker 中,挂载一个卷以便数据在容器重启后保留。
- **无内置认证** — CTI-Center 不包含用户认证。如果暴露在互联网上,请将其放在带有认证的反向代理、VPN 后,或通过 IP 限制访问。
- **定时获取** — 每个 worker 进程启动自己的 APScheduler 实例,因此如果有多个 worker,你会得到重复的获取。对于多 worker 部署,考虑通过单独的 cron 作业 (`python -m cti_center.fetch`) 运行获取。
## 日志
所有模块记录到 `logs/cti_center.log`(滚动,最大 5 MB,3 个备份)和控制台。logs/` 目录在启动时自动创建。日志级别在文件中为 DEBUG,在控制台上为 INFO。
## 开发
```
# Lint
ruff check cti_center/
# 重新填充数据库
python -m cti_center.seed
# 手动获取数据
python -m cti_center.fetch
```
## 致谢
本项目在 [Claude Code](https://claude.ai/claude-code)(Anthropic 的 AI 编码助手)的协助下开发。Claude Code 帮助进行了代码审查、安全加固、错误修复和文档编写,但核心功能和架构由人类设计和指导。
## 许可证
详情见 [LICENSE](LICENSE)。
标签:CISA KEV, CVE分析, CVSS, GPT, NVD, 威胁情报, 安全仪表盘, 安全运营, 开发者工具, 扫描框架, 新闻聚合, 漏洞优先级, 漏洞管理, 网络安全, 自动化分析, 跨站脚本, 逆向工具, 防御监控, 隐私保护, 风险评分