计并实现防御型安全情报检索问答系统,接入 NVD CVE API、CISA KEV 与安全新闻 RSS,支持漏洞数据、已知被利用漏洞和安全资讯的自动采集、清洗、去重与结构化存储。 基于 PostgreSQL 和 pgvector 构建关键词检索与语义检索能力,支持 CVE ID 查询、严重等级筛选、KEV 过滤、时间范围查询和自然语言安全问答。 基于 FastAPI 封装漏洞检索、新闻检索和 RAG 问答接口,前端展示最新漏洞、高危漏洞、已被利用漏洞和安全新闻摘要。 在问答模块中加入防御型安全边界,限制漏洞利用代码、攻击载荷和绕过检测方法输出,仅提供漏洞影响分析、风险优先级判断和修复建议。
cp .env.example .env
docker compose up --build访问:
- 前端:
http://localhost:5173 - 局域网 IP 访问:
http://<服务器IP>:5173 - 后端 API 文档:
http://localhost:8000/docs - 后端 IP 访问:
http://<服务器IP>:8000/docs - 健康检查:
http://localhost:8000/api/health
默认启用 OFFLINE_FALLBACK=true,没有外网或 API key 时会自动写入少量样例 CVE、KEV 和新闻数据,保证 Dashboard、检索和问答页面可以直接演示。需要真实同步时可在 .env 中配置 NVD_API_KEY,并通过前端同步按钮或 /api/sync/* 接口触发采集。
问答接口默认可离线生成防御型摘要;如果要调用 DeepSeek API,在 .env 中填入:
DEEPSEEK_API_KEY=你的 DeepSeek API Key
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-chat用 IP 访问前端时,浏览器会请求同源 /api,由 Vite/Docker 代理转发到后端,避免把 API 地址固定为 localhost 导致外部设备无法访问。
默认 Docker 数据库镜像使用 postgres:15-alpine,这是当前环境已有镜像,可避免部分网络环境拉取 pgvector/pgvector:pg16 或 postgres:16 超时。database/init.sql 会自动检测 pgvector:镜像内有 vector 扩展时使用 VECTOR(1536),没有时退化为 DOUBLE PRECISION[],不影响当前关键词检索和离线演示。网络可用并需要真实 pgvector 时,可在 .env 中改为:
POSTGRES_IMAGE=pgvector/pgvector:pg16安全信息分散在 CVE、NVD、CISA、厂商公告、安全媒体、攻击组织报告、Exploit 数据库中,安全人员需要一个系统把最新信息收集起来、结构化、关联、检索,并支持自然语言查询。
- 自动采集最新安全资讯、漏洞公告、CVE、KEV、GitHub Advisory、CISA Advisory
- 对安全内容进行清洗、去重、结构化和标签化
- 建立漏洞、产品、厂商、攻击组织、攻击技术、恶意软件之间的关联
- 支持关键词检索、语义检索、CVE 检索、时间线查询
- 支持自然语言问答和每日安全简报生成
- 对危险查询做安全限制,只输出防御视角内容
-
漏洞数据采集
- 从 NVD 拉取最近 CVE
- 从 CISA KEV 拉取已知被利用漏洞
- 合并 CVE 和 KEV 信息
-
安全资讯采集
- 从 CISA Advisory 或 BleepingComputer RSS 拉取安全新闻
- 抽取标题、发布时间、链接、摘要
-
检索查询
- 支持 CVE ID 查询
- 支持关键词搜索
- 支持时间范围过滤
- 支持高危 / 严重 / 已被利用筛选
-
RAG 问答
- 用户输入自然语言问题
- 系统检索相关 CVE / 新闻
- 大模型基于检索结果生成回答
- 回答附带来源链接
-
简单前端展示
- 最新漏洞列表
- 已被利用漏洞列表
- 安全新闻列表
- CVE 详情页
- 问答页面
后端:FastAPI 模块:技术 后端:FastAPI 数据库:PostgreSQL 向量检索:pgvector 任务调度:APScheduler 数据采集:requests + feedparser 文本处理:BeautifulSoup RAG 框架:LangChain 前端:React 部署:Docker Compose
. ├── backend ├── database │ └── init.sql ├── docker-compose.yml ├── docs ├── frontend └── README.md
采用前后端分离架构
- CVE 表
CREATE TABLE cve_records (
id SERIAL PRIMARY KEY,
cve_id VARCHAR(32) UNIQUE NOT NULL,
source VARCHAR(64),
published_at TIMESTAMP,
last_modified_at TIMESTAMP,
description TEXT,
cvss_score FLOAT,
cvss_severity VARCHAR(32),
cwe_ids TEXT[],
references_json JSONB,
raw_json JSONB,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);- CISA KEV 表
CREATE TABLE kev_records (
id SERIAL PRIMARY KEY,
cve_id VARCHAR(32) UNIQUE NOT NULL,
vendor_project VARCHAR(255),
product VARCHAR(255),
vulnerability_name TEXT,
date_added DATE,
short_description TEXT,
required_action TEXT,
due_date DATE,
known_ransomware_campaign_use VARCHAR(64),
notes TEXT,
raw_json JSONB,
created_at TIMESTAMP DEFAULT NOW()
);- 安全新闻表
CREATE TABLE security_news (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
url TEXT UNIQUE NOT NULL,
source VARCHAR(128),
published_at TIMESTAMP,
summary TEXT,
content TEXT,
related_cves TEXT[],
tags TEXT[],
created_at TIMESTAMP DEFAULT NOW()
);
- 文档向量表
用 pgvector:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE document_chunks (
id SERIAL PRIMARY KEY,
doc_type VARCHAR(32),
doc_id INTEGER,
title TEXT,
content TEXT,
embedding VECTOR(1536),
source_url TEXT,
created_at TIMESTAMP DEFAULT NOW()
);其中:
doc_type = cve / news / kev doc_id = 对应 cve_records、security_news 或 kev_records 的 id 5. 采集日志表
CREATE TABLE sync_jobs (
id SERIAL PRIMARY KEY,
job_name VARCHAR(128),
source VARCHAR(128),
status VARCHAR(32),
started_at TIMESTAMP,
finished_at TIMESTAMP,
fetched_count INTEGER,
inserted_count INTEGER,
updated_count INTEGER,
error_message TEXT
);- 接口前缀:
/api - 请求与响应格式:
application/json - 时间格式:ISO 8601,例如
2026-07-03T10:30:00Z - 分页参数:列表接口统一支持
page和page_sizepage默认1page_size默认20,最大100
- 排序参数:统一使用
sort,降序字段前加-- 例如
sort=-published_at、sort=-cvss_score
- 例如
- 布尔参数:使用
true/false - 错误响应:
{
"detail": {
"code": "VALIDATION_ERROR",
"message": "page_size must be between 1 and 100"
}
}分页响应结构:
{
"items": [],
"page": 1,
"page_size": 20,
"total": 0
}GET /api/health
用于服务探活和部署检查。
响应示例:
{
"status": "ok",
"database": "ok",
"vector_store": "ok",
"timestamp": "2026-07-03T10:30:00Z"
}GET /api/dashboard/summary
返回前端 Dashboard 所需的统计指标。
响应示例:
{
"today_new_cves": 12,
"today_high_or_critical_cves": 4,
"kev_total": 1280,
"kev_added_last_7_days": 8,
"news_last_24h": 15,
"last_sync_at": "2026-07-03T09:10:00Z"
}GET /api/cves
查询 CVE 列表,支持关键词、严重等级、CVSS、发布时间和 KEV 过滤。
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
q |
string | 否 | 关键词,匹配 CVE ID、描述、CWE、厂商或产品 |
severity |
string | 否 | 严重等级:LOW、MEDIUM、HIGH、CRITICAL |
min_cvss |
number | 否 | 最低 CVSS 分数 |
kev_only |
boolean | 否 | 是否只返回 CISA KEV 已收录漏洞 |
cwe_id |
string | 否 | CWE 编号,例如 CWE-79 |
published_from |
string | 否 | 发布时间起点 |
published_to |
string | 否 | 发布时间终点 |
sort |
string | 否 | 默认 -published_at,可选 -cvss_score、cvss_score、published_at |
page |
integer | 否 | 页码 |
page_size |
integer | 否 | 每页数量 |
响应示例:
{
"items": [
{
"id": 1,
"cve_id": "CVE-2024-3094",
"description": "Backdoor discovered in XZ Utils...",
"cvss_score": 10.0,
"cvss_severity": "CRITICAL",
"published_at": "2024-03-29T00:00:00Z",
"last_modified_at": "2024-04-01T00:00:00Z",
"cwe_ids": ["CWE-506"],
"is_kev": true,
"kev": {
"vendor_project": "XZ Utils",
"product": "XZ Utils",
"date_added": "2024-04-01"
}
}
],
"page": 1,
"page_size": 20,
"total": 1
}GET /api/cves/{cve_id}
查询单个 CVE 详情,并返回 KEV 信息、参考链接和关联新闻。
路径参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
cve_id |
string | 是 | CVE 编号,例如 CVE-2024-3094 |
响应示例:
{
"id": 1,
"cve_id": "CVE-2024-3094",
"source": "NVD",
"description": "Backdoor discovered in XZ Utils...",
"cvss_score": 10.0,
"cvss_severity": "CRITICAL",
"cwe_ids": ["CWE-506"],
"published_at": "2024-03-29T00:00:00Z",
"last_modified_at": "2024-04-01T00:00:00Z",
"references": [
{
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-3094",
"source": "NVD"
}
],
"kev": {
"vendor_project": "XZ Utils",
"product": "XZ Utils",
"vulnerability_name": "XZ Utils Backdoor Vulnerability",
"date_added": "2024-04-01",
"required_action": "Apply mitigations per vendor instructions.",
"due_date": "2024-04-22",
"known_ransomware_campaign_use": "Unknown"
},
"related_news": [
{
"id": 10,
"title": "XZ Utils backdoor impacts Linux distributions",
"url": "https://example.com/news/xz-utils",
"published_at": "2024-03-30T08:00:00Z"
}
]
}GET /api/kev
查询 CISA Known Exploited Vulnerabilities 已知被利用漏洞列表。
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
q |
string | 否 | 关键词,匹配 CVE ID、厂商、产品或漏洞名称 |
vendor |
string | 否 | 厂商或项目 |
product |
string | 否 | 产品名称 |
date_from |
string | 否 | KEV 收录日期起点 |
date_to |
string | 否 | KEV 收录日期终点 |
ransomware_only |
boolean | 否 | 是否只返回已知勒索软件利用记录 |
sort |
string | 否 | 默认 -date_added |
page |
integer | 否 | 页码 |
page_size |
integer | 否 | 每页数量 |
响应示例:
{
"items": [
{
"id": 100,
"cve_id": "CVE-2024-3094",
"vendor_project": "XZ Utils",
"product": "XZ Utils",
"vulnerability_name": "XZ Utils Backdoor Vulnerability",
"date_added": "2024-04-01",
"short_description": "Malicious code was discovered in XZ Utils.",
"required_action": "Apply mitigations per vendor instructions.",
"due_date": "2024-04-22",
"known_ransomware_campaign_use": "Unknown",
"notes": "https://www.cisa.gov/known-exploited-vulnerabilities-catalog"
}
],
"page": 1,
"page_size": 20,
"total": 1
}GET /api/news
查询安全新闻、厂商公告或安全媒体 RSS 内容。
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
q |
string | 否 | 关键词,匹配标题、摘要或正文 |
source |
string | 否 | 新闻来源,例如 CISA、BleepingComputer |
cve_id |
string | 否 | 只返回关联某个 CVE 的新闻 |
tag |
string | 否 | 标签过滤 |
published_from |
string | 否 | 发布时间起点 |
published_to |
string | 否 | 发布时间终点 |
sort |
string | 否 | 默认 -published_at |
page |
integer | 否 | 页码 |
page_size |
integer | 否 | 每页数量 |
响应示例:
{
"items": [
{
"id": 10,
"title": "Critical vulnerability added to CISA KEV catalog",
"url": "https://example.com/news/critical-vulnerability",
"source": "CISA",
"published_at": "2026-07-03T08:00:00Z",
"summary": "CISA added a newly exploited vulnerability to its catalog.",
"related_cves": ["CVE-2026-0001"],
"tags": ["kev", "critical"]
}
],
"page": 1,
"page_size": 20,
"total": 1
}GET /api/news/{news_id}
查询单条新闻详情。
响应字段包含 title、url、source、published_at、summary、content、related_cves 和 tags。
GET /api/search
统一检索 CVE、KEV 和安全新闻。关键词检索走 PostgreSQL 文本检索;语义检索走 pgvector;混合检索综合两者排序。
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
q |
string | 是 | 检索问题或关键词 |
types |
string | 否 | 检索类型,逗号分隔:cve,kev,news |
mode |
string | 否 | keyword、semantic、hybrid,默认 hybrid |
severity |
string | 否 | CVE 严重等级过滤 |
kev_only |
boolean | 否 | 是否只返回 KEV 相关结果 |
published_from |
string | 否 | 发布时间起点 |
published_to |
string | 否 | 发布时间终点 |
limit |
integer | 否 | 返回数量,默认 10,最大 50 |
响应示例:
{
"query": "最近被利用的 Chrome 高危漏洞",
"mode": "hybrid",
"results": [
{
"type": "cve",
"id": 25,
"title": "CVE-2026-0001",
"snippet": "A high severity vulnerability affecting Google Chrome...",
"score": 0.92,
"source_url": "https://nvd.nist.gov/vuln/detail/CVE-2026-0001",
"published_at": "2026-06-30T00:00:00Z",
"cve_id": "CVE-2026-0001"
}
]
}POST /api/ask
基于检索结果生成防御型安全问答回答。该接口需要启用安全边界:不输出漏洞利用代码、攻击载荷、绕过检测方法、持久化控制步骤等攻击性细节;危险问题应转为风险说明、缓解措施、检测建议和修复优先级。
请求体:
{
"question": "最近一周有哪些严重漏洞值得关注?",
"filters": {
"severity": ["HIGH", "CRITICAL"],
"kev_only": false,
"published_from": "2026-06-26T00:00:00Z",
"published_to": "2026-07-03T23:59:59Z"
},
"top_k": 8,
"include_sources": true
}响应示例:
{
"answer": "最近一周建议优先关注以下严重漏洞:...",
"safety": {
"allowed": true,
"policy": "defensive_only",
"reason": null
},
"sources": [
{
"type": "cve",
"id": 25,
"title": "CVE-2026-0001",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-0001",
"score": 0.91
}
],
"retrieved_count": 8,
"created_at": "2026-07-03T10:30:00Z"
}危险查询响应示例:
{
"answer": "我不能提供漏洞利用代码或攻击载荷。但可以帮助你理解该漏洞影响范围、检测思路、修复步骤和临时缓解措施。",
"safety": {
"allowed": false,
"policy": "defensive_only",
"reason": "Exploit instructions are not allowed"
},
"sources": [],
"retrieved_count": 0,
"created_at": "2026-07-03T10:30:00Z"
}同步接口用于手动触发采集任务。接口建议返回 202 Accepted,实际任务在后台执行,并写入 sync_jobs 表。
POST /api/sync/nvd
手动触发 NVD CVE 同步。
请求体:
{
"start_date": "2026-07-01",
"end_date": "2026-07-03",
"force": false
}POST /api/sync/kev
手动触发 CISA KEV 同步。
请求体:
{
"force": false
}POST /api/sync/news
手动触发安全新闻同步。
请求体:
{
"sources": ["CISA", "BleepingComputer"],
"force": false
}同步接口响应示例:
{
"job_id": 42,
"job_name": "sync_nvd",
"source": "NVD",
"status": "queued",
"started_at": null
}GET /api/sync/jobs
查询同步任务列表。
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
source |
string | 否 | 数据源:NVD、CISA_KEV、NEWS |
status |
string | 否 | 任务状态:queued、running、success、failed |
page |
integer | 否 | 页码 |
page_size |
integer | 否 | 每页数量 |
GET /api/sync/jobs/{job_id}
查询单个同步任务详情。
响应示例:
{
"id": 42,
"job_name": "sync_nvd",
"source": "NVD",
"status": "success",
"started_at": "2026-07-03T10:00:00Z",
"finished_at": "2026-07-03T10:02:30Z",
"fetched_count": 120,
"inserted_count": 30,
"updated_count": 90,
"error_message": null
}| 状态码 | 场景 |
|---|---|
200 OK |
查询成功或问答成功 |
202 Accepted |
同步任务已提交 |
400 Bad Request |
参数格式错误或业务参数非法 |
404 Not Found |
CVE、新闻或任务不存在 |
422 Unprocessable Entity |
请求体字段校验失败 |
429 Too Many Requests |
外部 API 限流或本服务限流 |
500 Internal Server Error |
服务内部异常 |
502 Bad Gateway |
NVD、CISA、RSS 或大模型服务异常 |
- 首页 Dashboard
展示:
- 今日新增 CVE 数量
- 今日新增高危漏洞数量
- CISA KEV 总数
- 最近 7 天新增 KEV
- 最近安全新闻
- CVE 检索页
功能:
- 按 CVE ID 搜索
- 按关键词搜索
- 按严重等级筛选
- 只看 CISA KEV
- 按发布时间排序
页面字段:
- CVE ID
- 描述
- CVSS 分数
- 严重等级
- 是否 KEV
- 发布时间
- 详情按钮
- CVE 详情页
展示:
- CVE ID
- 漏洞描述
- CVSS 分数
- 严重等级
- CWE
- 参考链接
- 是否已被 CISA KEV 收录
- 影响厂商 / 产品
- 修复建议
- 关联新闻
- 安全新闻页
展示:
- 标题
- 来源
- 发布时间
- 摘要
- 关联 CVE
- 原文链接
- 安全问答页
示例问题:
- 最近有哪些被利用的 Chrome 漏洞?
- CVE-2024-3094 是什么问题?
- 最近一周有哪些严重漏洞值得关注?
- Apache 相关漏洞中哪些已经被利用?