架构图、RAG 数据流、信任边界与威胁模型见
docs/Architecture-and-Threat-Model.md。
LLM-VulnHub 是一个面向大语言模型应用安全的漏洞情报平台,用于把公开来源中的原始安全文本转化为可采集、可分析、可复核、可入库、可检索和可问答的 AI / LLM 漏洞资产。
当前平台覆盖的主流程:
真实数据源采集 -> LLM 专项初筛 -> 多阶段 AI 分析 -> 情报池人工复核 -> 标准化入库 -> 漏洞库 / 看板 / RAG 问答
- 动态采集:支持 GitHub Advisory、RSS、厂商公告、框架 Release Atom 等来源。
- LLM 漏洞初筛:过滤普通软件新闻、普通依赖 CVE、教程和无关发布公告,优先保留 LLM / RAG / Agent / 工具调用相关风险。
- AI 结构化抽取:抽取标题、漏洞类型、等级、评分、影响组件、攻击方式、影响、修复建议、标签和来源证据。
- 多阶段分析:保留 triage、extract、merge、risk、asset impact、review 等阶段的执行轨迹。
- 情报池复核:支持待人工复核、确认入库、驳回、合并候选处理和批量操作。
- 漏洞库管理:支持搜索、筛选、分页、详情查看、手动新增和编辑。
- RAG 智能问答:基于漏洞库资产进行多语言语义检索,返回带参考记录的可复核回答。
- 安全设计:在前端展示系统架构、信任边界、STRIDE 风险清单、RAG 专项控制与上线基线,数据由后端安全模型 API 统一提供。
- 输入防护:对间接提示注入、数据投毒、SSRF、恶意 HTML 和超长输入设置服务端控制,并在关键前端表单同步限制。
- 身份与检索授权:使用 Redis 随机会话、HttpOnly Cookie、CSRF 校验和服务端 RBAC;访客无需密码但仅能读取 public 漏洞的裁剪摘要,账号用户按角色访问完整功能,RAG 在召回前完成记录级过滤。
- 运营监控:展示队列、调度器、数据源健康、任务状态、通知和 LLM 调用指标。
- 页面草稿保存:部分表单和 RAG 页面会自动保存临时草稿,切换页面后不会立即丢失输入。
- 前端:Next.js 15、React、TypeScript、Tailwind CSS、lucide-react
- 后端:FastAPI、Pydantic、SQLAlchemy 2.0、Alembic
- 数据库:SQLite 本地开发,PostgreSQL + pgvector 用于 Docker 部署
- 异步任务:Celery + Redis
- AI 工作流:LangGraph 风格多阶段工作流
- 模型接口:统一
LLMClient,支持 DeepSeek、OpenAI、mock - 语义检索:FastEmbed +
paraphrase-multilingual-MiniLM-L12-v2(中英文、384 维) - 部署:Docker Compose
.
├── backend/ # FastAPI、Celery、AI workflow、RAG 服务
│ ├── app/
│ │ ├── api/ # API 路由
│ │ ├── core/ # 配置
│ │ ├── db/ # SQLAlchemy 模型和会话
│ │ ├── schemas/ # Pydantic schema
│ │ ├── services/ # 采集、LLM、情报、漏洞、RAG、运维服务
│ │ └── workflows/ # 多阶段 AI 分析流程
│ └── alembic/ # 数据库迁移
├── frontend/ # Next.js 前端
├── scripts/ # 本地启动/停止脚本
├── data/ # 示例数据和种子资源
├── docs/ # 设计和说明文档
└── docker-compose.yml
推荐在 Windows 本地开发时使用脚本启动。Docker Compose 适合完整部署演示。
前置要求:
- Python 3.12
- Node.js 20+
- Docker Desktop,用于启动 Redis
- 已配置根目录
.env或backend/.env
首次启动:
cd D:\2025-2026-3
.\scripts\start-dev.ps1依赖已经安装后,可以跳过安装:
.\scripts\start-dev.ps1 -SkipInstall默认访问地址:
停止所有后台进程:
.\scripts\stop-dev.ps1常见日志位置:
backend/backend-dev.log
backend/celery-ingestion.log
backend/celery-analysis-1.log
backend/celery-analysis-2.log
backend/celery-review-notification.log
backend/celery-beat.log
frontend/frontend-dev.log
说明:
- Windows 下 Celery 使用
solopool。脚本会启动多个 worker 进程来模拟并发。 - 如果你已经手动启动 Redis,可以使用
.\scripts\start-dev.ps1 -SkipRedis。 http://127.0.0.1:8000/返回 404 是正常的,后端根路径没有页面,请访问/docs。
复制环境变量:
copy .env.example .env启动:
docker compose up --build.env.example 默认让 Docker 自动分配空闲的主机端口。启动后查询实际地址:
Docker 会随机分配可用的宿主机端口。启动后执行以下命令查看实际端口:
docker compose port frontend 3000
docker compose port backend 8000
docker compose port postgres 5432
docker compose port redis 6379例如输出 0.0.0.0:49152 时,前端访问地址为 http://127.0.0.1:49152;后端对应端口的 API 文档地址为 http://127.0.0.1:端口/docs。
首次构建会下载约 220 MB 的多语言 Embedding 模型。如果 Docker 无法直连 Hugging Face,可在 .env 中填写 Clash 的宿主机地址,例如:
MODEL_DOWNLOAD_PROXY=http://host.docker.internal:7897其中 7897 应替换为 Clash 实际的 HTTP/Mixed 监听端口,并确保 Clash 已开启局域网访问。该变量仅用于镜像构建下载,不会作为应用运行代理。
升级 Embedding 模型或导入旧数据库后,重建全部 RAG 向量:
docker compose exec backend python -m app.reindex_embeddings停止:
docker compose down清空容器数据卷:
docker compose down -v如果端口冲突,可以在 .env 中调整:
FRONTEND_PORT=0
BACKEND_PORT=0
POSTGRES_PORT=0
REDIS_PORT=0
NEXT_PUBLIC_API_BASE=/api/v1
INTERNAL_API_BASE=http://backend:8000/api/v10 表示由 Docker 自动分配空闲主机端口;INTERNAL_API_BASE 始终使用容器网络中的 backend:8000。
cd D:\2025-2026-3\backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000cd D:\2025-2026-3\frontend
npm install
npm run dev -- -p 3000如果页面显示成浏览器默认样式,通常是旧 Next.js 进程或 CSS 静态资源缓存异常。停止旧 Node 进程后重新启动前端,并在浏览器中按 Ctrl + F5 强制刷新。
cd D:\2025-2026-3
docker compose up -d rediscd D:\2025-2026-3\backend
# 采集队列
.\.venv\Scripts\celery.exe -A app.worker.celery_app worker -Q ingestion --pool=solo --loglevel=info
# 分析队列,可启动多个窗口提升吞吐
.\.venv\Scripts\celery.exe -A app.worker.celery_app worker -Q analysis --pool=solo --loglevel=info
# 复核与通知队列
.\.venv\Scripts\celery.exe -A app.worker.celery_app worker -Q review,notification --pool=solo --loglevel=info
# 定时调度
.\.venv\Scripts\celery.exe -A app.worker.celery_app beat --loglevel=info本地开发更推荐使用:
.\scripts\start-dev.ps1 -SkipInstall先将 .env.example 复制为根目录 .env。根目录配置供 Docker Compose 使用;直接运行后端时,也可将同样的配置放到 backend/.env。
# LLM:DeepSeek 与 OpenAI 二选一
LLM_PROVIDER=deepseek
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
DEEPSEEK_MODEL=deepseek-chat
LLM_TIMEOUT_SECONDS=45
LLM_MAX_RETRIES=2
LLM_TEMPERATURE=0.1
LLM_FALLBACK_TO_MOCK=false
GITHUB_TOKEN=
DATABASE_URL=sqlite:///./llm_vulnhub.db
REDIS_URL=redis://localhost:6379/0
NEXT_PUBLIC_API_BASE=http://localhost:8000/api/v1
INTERNAL_API_BASE=http://backend:8000/api/v1
EMBEDDING_MODEL=sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
EMBEDDING_CACHE_DIR=./.cache/fastembed
MODEL_DOWNLOAD_PROXY=说明:
LLM_PROVIDER支持deepseek、openai、mock。GITHUB_TOKEN建议配置,否则 GitHub Advisory 匿名请求可能被限流。LLM_FALLBACK_TO_MOCK=true时,模型不可用会退回 mock 文本,适合演示流程。EMBEDDING_MODEL用于 RAG 语义检索,默认模型支持中英文。MODEL_DOWNLOAD_PROXY可用于 Docker 构建阶段下载 embedding 模型,例如http://host.docker.internal:7897。
RAG 模块使用两层召回策略:
- 多语言 embedding 语义向量召回。
- 关键词、标题、影响组件等字段加权排序。
回答生成时会遵循:
- 只基于召回到的漏洞库记录回答。
- 关键结论需要标注
[1]、[2]等参考编号。 - 证据不足时明确说明不能从当前记录确认。
- 防护/缓解类问题按“主要风险、可执行措施、排查重点”组织。
首次切换 embedding 模型、导入旧数据库或发现 RAG 召回异常时,需要重建向量:
cd D:\2025-2026-3\backend
.\.venv\Scripts\python.exe -m app.reindex_embeddingsDocker 环境中:
docker compose exec backend python -m app.reindex_embeddings示例问题:
RAG 数据泄露通常有哪些缓解措施?Prompt Injection 漏洞应该如何防护?哪些漏洞会影响 Agent 或工具调用链路?
- 打开“动态采集”页面。
- 查看待处理队列、最近采集结果和数据源健康状态。
- 触发采集任务后,在任务中心观察 crawl、analysis、review 等阶段。
- 对待处理文档执行“确认入库”或“去复核”。
- 打开“情报池”。
- 查看待审核队列和右侧详情。
- 根据 AI 判断、来源可信度、血缘链路和原始文本做复核。
- 执行确认入库、驳回或合并候选处理。
- 打开“漏洞库”。
- 使用搜索、筛选和分页浏览标准化漏洞记录。
- 查看详情页中的来源、复核、分析记录和血缘信息。
- 确认漏洞库已有数据。
- 打开“RAG 问答”。
- 输入安全问题并调整召回数量。
- 查看 AI 回答和右侧参考漏洞。
“运行运营”页面用于查看:
- 队列中、运行中、成功任务、异常信号。
- 调度器任务和数据源调度状态。
- 数据源总数、启用数、停用数和失败通知数。
- 分析任务总数、平均风险评分、模型调用次数和平均延迟。
- 风险等级分布和 Token 用量。
当前布局已把数据源调度状态放到页面下方,核心指标和分析统计放在上方,便于快速扫描。
如果要重新演示完整采集链路,可以清理业务数据但保留数据源配置。通常不要删除 data_sources。
可清理的业务表包括:
agent_executions
analysis_jobs
merge_candidates
vulnerability_occurrences
intelligence_items
collected_documents
analysis_records
document_chunks
vulnerabilities
tags
review_actions
tasks
vulnerability_tags
- 后端入口:
backend/app/main.py - 配置:
backend/app/core/config.py - Celery:
backend/app/worker.py - 动态采集:
backend/app/services/collector_service.py - 情报池:
backend/app/services/intel_service.py - 漏洞库:
backend/app/services/vulnerability_service.py - RAG 服务:
backend/app/services/rag_service.py - 安全模型服务:
backend/app/services/security_model_service.py - 安全模型 API:
backend/app/api/security_model.py - Embedding 服务:
backend/app/services/embedding_service.py - 向量重建:
backend/app/reindex_embeddings.py - LLM 封装:
backend/app/services/llm_service.py - AI 工作流:
backend/app/workflows/vuln_analysis_graph.py - RAG 前端:
frontend/app/rag-chat/page.tsx - 安全设计前端:
frontend/app/security-model/page.tsx - 情报池前端:
frontend/components/intel-pool-client.tsx - 草稿保存 hook:
frontend/lib/use-session-draft.ts
通常是旧 Next.js 进程还在运行,或者 CSS 静态资源 404。
处理方式:
- 停止旧的 Node / Next.js 进程。
- 重新运行
npm run dev -- -p 3000。 - 浏览器按
Ctrl + F5强制刷新。
先重建 embedding:
cd D:\2025-2026-3\backend
.\.venv\Scripts\python.exe -m app.reindex_embeddings如果仍然异常,检查:
- 漏洞库是否已有足够相关记录。
EMBEDDING_MODEL是否一致。- 旧数据库中的
document_chunks是否已更新。
通常是本地调度缓存损坏,删除后重启即可:
Remove-Item backend\celerybeat-schedule.* -Force优先查看动态采集页的数据源健康指标:
- 请求成功率低:数据源或网络问题。
- 初筛通过率低:来源与 LLM 安全主题不够相关。
- LLM 命中率低:候选文本不是大模型漏洞。
- 入库转化率低:可能重复、字段不完整或需要人工复核。
- 在 GitHub 创建 fine-grained personal access token。公开 Advisory 读取场景不需要授予仓库权限。
- 在项目根目录
.env中配置GITHUB_TOKEN=你的令牌,不要添加引号,也不要提交.env。 - Docker Compose 环境执行
docker compose up -d --force-recreate backend worker,让后端接口和采集 Worker 读取新变量;无需重新构建镜像。 - 可执行
docker compose exec -T worker python -c "from app.core.config import get_settings; print(bool(get_settings().github_token))"检查 Worker 是否读到 Token。命令只输出True/False,不会显示令牌。