Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CyberSec RAG:面向漏洞与威胁情报的安全信息检索问答系统

计并实现防御型安全情报检索问答系统,接入 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:pg16postgres:16 超时。database/init.sql 会自动检测 pgvector:镜像内有 vector 扩展时使用 VECTOR(1536),没有时退化为 DOUBLE PRECISION[],不影响当前关键词检索和离线演示。网络可用并需要真实 pgvector 时,可在 .env 中改为:

POSTGRES_IMAGE=pgvector/pgvector:pg16

主要问题:

安全信息分散在 CVE、NVD、CISA、厂商公告、安全媒体、攻击组织报告、Exploit 数据库中,安全人员需要一个系统把最新信息收集起来、结构化、关联、检索,并支持自然语言查询。

核心目标

  1. 自动采集最新安全资讯、漏洞公告、CVE、KEV、GitHub Advisory、CISA Advisory
  2. 对安全内容进行清洗、去重、结构化和标签化
  3. 建立漏洞、产品、厂商、攻击组织、攻击技术、恶意软件之间的关联
  4. 支持关键词检索、语义检索、CVE 检索、时间线查询
  5. 支持自然语言问答和每日安全简报生成
  6. 对危险查询做安全限制,只输出防御视角内容

功能边界

  1. 漏洞数据采集

    • 从 NVD 拉取最近 CVE
    • 从 CISA KEV 拉取已知被利用漏洞
    • 合并 CVE 和 KEV 信息
  2. 安全资讯采集

    • 从 CISA Advisory 或 BleepingComputer RSS 拉取安全新闻
    • 抽取标题、发布时间、链接、摘要
  3. 检索查询

    • 支持 CVE ID 查询
    • 支持关键词搜索
    • 支持时间范围过滤
    • 支持高危 / 严重 / 已被利用筛选
  4. RAG 问答

    • 用户输入自然语言问题
    • 系统检索相关 CVE / 新闻
    • 大模型基于检索结果生成回答
    • 回答附带来源链接
  5. 简单前端展示

    • 最新漏洞列表
    • 已被利用漏洞列表
    • 安全新闻列表
    • 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

设计方案

项目架构

采用前后端分离架构

数据库表

  1. 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()
);
  1. 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()
);
  1. 安全新闻表
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()
);
  1. 文档向量表

用 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 设计

通用约定

  • 接口前缀:/api
  • 请求与响应格式:application/json
  • 时间格式:ISO 8601,例如 2026-07-03T10:30:00Z
  • 分页参数:列表接口统一支持 pagepage_size
    • page 默认 1
    • page_size 默认 20,最大 100
  • 排序参数:统一使用 sort,降序字段前加 -
    • 例如 sort=-published_atsort=-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"
}

CVE 接口

GET /api/cves

查询 CVE 列表,支持关键词、严重等级、CVSS、发布时间和 KEV 过滤。

查询参数:

参数 类型 必填 说明
q string 关键词,匹配 CVE ID、描述、CWE、厂商或产品
severity string 严重等级:LOWMEDIUMHIGHCRITICAL
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_scorecvss_scorepublished_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"
    }
  ]
}

CISA KEV 接口

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 新闻来源,例如 CISABleepingComputer
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}

查询单条新闻详情。

响应字段包含 titleurlsourcepublished_atsummarycontentrelated_cvestags

统一检索接口

GET /api/search

统一检索 CVE、KEV 和安全新闻。关键词检索走 PostgreSQL 文本检索;语义检索走 pgvector;混合检索综合两者排序。

查询参数:

参数 类型 必填 说明
q string 检索问题或关键词
types string 检索类型,逗号分隔:cve,kev,news
mode string keywordsemantichybrid,默认 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"
    }
  ]
}

RAG 问答接口

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 数据源:NVDCISA_KEVNEWS
status string 任务状态:queuedrunningsuccessfailed
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 或大模型服务异常

前端页面设计

  1. 首页 Dashboard

展示:

  • 今日新增 CVE 数量
  • 今日新增高危漏洞数量
  • CISA KEV 总数
  • 最近 7 天新增 KEV
  • 最近安全新闻
  1. CVE 检索页

功能:

  • 按 CVE ID 搜索
  • 按关键词搜索
  • 按严重等级筛选
  • 只看 CISA KEV
  • 按发布时间排序

页面字段:

  • CVE ID
  • 描述
  • CVSS 分数
  • 严重等级
  • 是否 KEV
  • 发布时间
  • 详情按钮
  1. CVE 详情页

展示:

  • CVE ID
  • 漏洞描述
  • CVSS 分数
  • 严重等级
  • CWE
  • 参考链接
  • 是否已被 CISA KEV 收录
  • 影响厂商 / 产品
  • 修复建议
  • 关联新闻
  1. 安全新闻页

展示:

  • 标题
  • 来源
  • 发布时间
  • 摘要
  • 关联 CVE
  • 原文链接
  1. 安全问答页

示例问题:

  • 最近有哪些被利用的 Chrome 漏洞?
  • CVE-2024-3094 是什么问题?
  • 最近一周有哪些严重漏洞值得关注?
  • Apache 相关漏洞中哪些已经被利用?

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages