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, 威胁情报, 安全仪表盘, 安全运营, 开发者工具, 扫描框架, 新闻聚合, 漏洞优先级, 漏洞管理, 网络安全, 自动化分析, 跨站脚本, 逆向工具, 防御监控, 隐私保护, 风险评分