一个全自动的RISC-V CVE数据库系统,每日自动更新并部署到GitHub Pages。
访问地址: https://YOUR_USERNAME.github.io/RISCV_CVE_Dashboard
例如:https://has2lab.github.io/RISCV_CVE_Dashboard
系统每天北京时间上午自动更新CVE数据并重新部署(由于GitHub高峰负载,可能会出现延迟)
- 🔄 全自动更新: 使用GitHub Actions每日自动下载CVE增量包
- 🤖 智能分类: 使用LLM对RISC-V CVE进行智能分类和总结
- 📊 可视化展示: 交互式Web界面,支持筛选、搜索和统计
- 🌐 在线访问: 部署到GitHub Pages,无需本地环境即可查看
- 📈 实时统计: 自动生成年份分布、分类统计等可视化图表
RISCV_CVE_Dashboard/
├── .github/
│ └── workflows/
│ ├── update-cves.yml # 自动更新CVE的workflow
│ └── deploy-pages.yml # 部署到GitHub Pages
├── visualization/ # Web可视化系统
│ ├── index.html # 主页面
│ ├── css/ # 样式文件
│ ├── js/ # JavaScript代码
│ ├── update_riscv_cves.py # 增量更新脚本(整合提取和分类)
│ ├── riscv_cves_classified.json # 分类数据(完整版)
│ └── riscv_cves_classified_summary.json # 分类数据(摘要版)
├── riscv_cves/ # 提取的RISC-V CVE
├── extract_riscv_cves.py # CVE提取脚本(独立使用)
├── classify_riscv_cves.py # CVE分类脚本(独立使用)
├── llm_config_manager.py # LLM配置管理器
├── llm_config.json # LLM配置文件
├── README.md # 项目说明文档
└── DEPLOYMENT.md # GitHub部署指南
Workflow文件: .github/workflows/update-cves.yml
运行时间: 每天北京时间上午
工作流程:
- 下载前一天的CVE增量包
- 提取RISC-V相关的CVE
- 使用LLM进行分类(本地模拟模式)
- 更新JSON数据文件
- 提交更改到仓库
- 自动部署到GitHub Pages
手动触发:
# 在GitHub仓库页面
Actions → Update RISC-V CVEs → Run workflowWorkflow文件: .github/workflows/deploy-pages.yml
触发条件:
master分支的visualization/目录有更新时自动部署- 可以手动触发
# 方法1: Fork这个仓库到你的GitHub账号
# 方法2: 克隆并推送到新仓库
git clone https://github.com/YOUR_USERNAME/RISCV_CVE_Dashboard.git
cd RISCV_CVE_Dashboard
git remote set-url origin https://github.com/YOUR_NEW_USERNAME/YOUR_NEW_REPO.git
git push -u origin master- 进入仓库的 Settings → Pages
- 在 Source 下选择 GitHub Actions
- 保存设置
如果要使用真实的LLM API(OpenAI或Anthropic),需要添加API密钥,默认使用DeepSeek的baseurl和model。如需手动更改可以修改llm_config.json文件:
- 进入仓库的 Settings → Secrets and variables → Actions
- 点击 New repository secret
- 添加以下secrets(根据需要):
| Secret名称 | 说明 | 示例 |
|---|---|---|
OPENAI_API_KEY |
DeepSeek密钥 | sk-... |
ANTHROPIC_API_KEY |
Anthropic API密钥 | sk-ant-... |
注意: 如果不添加这些secrets,系统会使用本地模拟模式(基于规则的分类),不会调用API。
将以下内容中的 YOUR_USERNAME 替换为您的GitHub用户名:
[]
**访问地址**: https://YOUR_USERNAME.github.io/RISCV_CVE_Dashboard/# 方法1: 手动触发workflow
# GitHub仓库页面 → Actions → Update RISC-V CVEs → Run workflow
# 方法2: 推送一个更改触发
git commit --allow-empty -m "Trigger first run"
git push# Python 3.11+
python --version
# 安装依赖
pip install -r requirements.txtcd visualization
# 测试模式(不下载增量包)
python update_riscv_cves.py --no-download --provider local
# 下载并更新(下载昨天的增量包)
python update_riscv_cves.py
# 下载特定日期的增量包
python update_riscv_cves.py --date 2025-11-16extract_riscv_cves.py 是核心的 CVE 提取脚本,支持直接关键词匹配和扩展关键词 + LLM 验证两种模式。
- 直接匹配: 使用正则表达式匹配明确的 RISC-V 关键词(如
risc-v,riscv,arch/riscv等),匹配到的 CVE 直接加入结果 - 扩展关键词匹配: 匹配可能与 RISC-V 相关的关键词(如 BOOM, Rocket, XiangShan, Spike 等),但这些关键词可能存在同名的不相关项目
- LLM 验证过滤: 对扩展关键词匹配的候选 CVE,使用大模型判断是否真正与 RISC-V 相关
- 聚类优化: 当候选数量超过 50 个时,使用 HDBSCAN 聚类算法对 CVE 描述进行聚类,按簇批量提交给 LLM 验证,提高效率
| 关键词 | 说明 | 可能的误匹配 |
|---|---|---|
BOOM |
Berkeley Out-of-Order Machine (RISC-V 处理器) | 其他项目 |
rocket |
Rocket Chip Generator (RISC-V SoC 生成器) | Rocket.Chat 等 |
XiangShan / 香山 |
开源 RISC-V 处理器项目 | - |
opentitan |
开源安全芯片项目 (使用 RISC-V 内核) | - |
Spike |
RISC-V 官方指令集模拟器 | Spike 游戏等 |
NEMU |
RISC-V 模拟器 | - |
# 基本提取(直接匹配 + 扩展关键词 + LLM 验证)
python extract_riscv_cves.py --cves-dir /path/to/cves --output-dir ./riscv_cves
# 仅使用直接 RISC-V 匹配(不使用扩展关键词和 LLM)
python extract_riscv_cves.py --cves-dir /path/to/cves --no-extended
# 指定配置文件
python extract_riscv_cves.py --cves-dir /path/to/cves --config ./llm_config.json| 参数 | 默认值 | 说明 |
|---|---|---|
--cves-dir |
cves |
CVE JSON 文件所在目录 |
--output-dir |
riscv_cves |
输出目录 |
--config |
llm_config.json |
LLM 配置文件路径 |
--no-extended |
- | 禁用扩展关键词匹配和 LLM 验证 |
--extended-only |
- | 仅测试扩展关键词(调试用) |
# LLM API 密钥 (用于验证扩展关键词候选)
export OPENAI_API_KEY="your-api-key" # 如果使用 OpenAI/DeepSeek
# Embedding API 密钥 (用于聚类,阿里云百炼)
export DASHSCOPE_API_KEY="your-dashscope-key"用于对大量候选 CVE 进行文本嵌入和聚类:
{
"embedding": {
"provider": "dashscope",
"api_key": "",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "text-embedding-v4",
"dimensions": 1024,
"batch_size": 10,
"timeout": 60,
"env_var": "DASHSCOPE_API_KEY"
}
}控制 LLM 验证行为:
{
"verification": {
"max_cves_per_batch": 5,
"clustering_method": "hdbscan",
"min_cluster_size": 3,
"max_retries": 5,
"initial_retry_delay": 1.0,
"max_retry_delay": 60.0,
"retry_multiplier": 2.0,
"riscv_criteria": [
"RISC-V处理器",
"RISC-V SoC",
"RISC-V指令集",
"RISC-V模拟器",
"RISC-V漏洞",
"RISC-V开发工具",
"RISC-V固件或应用"
]
}
}CVE 文件扫描
│
├─── 直接匹配 RISC-V 关键词 ──→ ✓ 直接加入结果
│
└─── 匹配扩展关键词 ──→ 候选列表 (去除直接匹配的)
│
├─ ≤50 个 ──→ 直接分批 LLM 验证
│
└─ >50 个 ──→ Embedding 聚类
│
└─→ 按簇分批 LLM 验证
│
├─ 相关 ──→ ✓ 加入结果
└─ 不相关 ──→ ✗ 丢弃
Scanning /path/to/cves for RISC-V related CVEs...
Output directory: riscv_cves
Extended keyword matching: Enabled
----------------------------------------------------------------------
Total CVE files to scan: 250000
----------------------------------------------------------------------
✓ Found RISC-V CVE: CVE-2024-26619
✓ Found RISC-V CVE: CVE-2024-35847
Progress: 100000/250000 files scanned...
----------------------------------------------------------------------
Extended keyword candidates: 45
Using direct batch verification (≤50 candidates)
验证批次 1/9...
✓ CVE-2024-12345: RISC-V related - OpenTitan security chip uses RISC-V core
✗ CVE-2024-67890: Not related - This is about Rocket.Chat messaging app
----------------------------------------------------------------------
Extraction complete!
Total RISC-V related CVEs found: 87
- Direct RISC-V matches: 83
- Extended keyword candidates: 45
- LLM verified: 4
- LLM rejected: 41
cd visualization
# 启动简单的HTTP服务器
python serve.py
# 或
python -m http.server 8000
# 在浏览器中访问
# http://localhost:8000完整的分类数据,包含所有CVE的原始数据、分类信息、摘要等。
{
"metadata": {
"total_cves": 83,
"classification_date": "2025-11-17T16:38:22",
"categories": ["Linux Kernel", "RISC-V CPU/SoC", "Simulator", ...]
},
"statistics": {
"by_category": {
"Linux Kernel": 64,
"RISC-V CPU/SoC": 9,
"Simulator": 3,
"RISC-V Development Tools": 2,
...
}
},
"classified_cves": [...]
}简化版本,不包含CVE原始数据,文件更小,适合Web端快速加载。
访问在线页面后,您可以:
- 📋 浏览CVE列表: 查看所有RISC-V相关的CVE
- 🔍 搜索和筛选: 按CVE ID、分类、严重程度筛选
- 📊 统计图表: 查看年份分布、分类分布等统计图表
- 📝 详细信息: 点击CVE查看完整的描述和技术细节
- 🏷️ 分类标签: 根据智能分类快速定位相关CVE
- ✅ API密钥存储在GitHub Secrets中,不会暴露在代码或日志中
- ✅ Workflow日志不会显示敏感信息
- ✅ 如果不配置API密钥,系统使用本地模拟模式,无安全风险
- ✅ 所有CVE数据来自公开的CVE数据库
- ✅ 不收集任何用户信息
- ✅ 部署到GitHub Pages的都是静态文件
编辑 .github/workflows/update-cves.yml:
on:
schedule:
# 修改为您想要的时间 (UTC时区)
- cron: '35 1 * * *' # 北京时间上午9:35编辑 llm_config.json:
default:
provider: local # 改为 "openai" 或 "anthropic"
model: gpt-3.5-turbo
classification:
predefined_categories:
- Linux Kernel
- RISC-V CPU/SoC
- Simulator
- RISC-V Development Tools
- Device-Specific Firmware & Applications
- RISC-V Instruction Set Manual
- Other
allow_new_categories: true如果要使用OpenAI API,修改 .github/workflows/update-cves.yml:
- name: Download and extract CVE delta package
run: |
cd visualization
# 改为使用 openai provider
python update_riscv_cves.py --provider openai --model gpt-3.5-turbo
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}- 进入仓库的 Actions 标签页
- 选择相应的workflow
- 查看运行历史和日志
- 进入 Settings → Pages
- 查看最新部署状态和URL
Q: Workflow运行失败怎么办?
- 检查Actions日志查看错误信息
- 确认GitHub Pages已启用
- 检查API密钥是否正确配置(如果使用)
Q: 页面无法访问?
- 确认GitHub Pages已启用并选择"GitHub Actions"作为源
- 等待几分钟让部署完成
- 检查仓库是否为Public(Private仓库需要GitHub Pro)
Q: 如何跳过某天的更新?
- 在Actions页面手动取消运行
- 或临时禁用workflow
- GitHub部署指南 - 详细的部署步骤和故障排查
- GitHub Actions 文档
- GitHub Pages 文档
- CVE数据源
欢迎提交Issue和Pull Request!
Apache License
- CVE数据: CVEProject/cvelistV5
- RISC-V社区: RISC-V International
免责声明:分析结果均由大模型生成,仅供参考。
Made with ❤️ for RISC-V Security Research