nvwa-cve-fixer:基于 AI 技术的 CVE 智能修复项目

AI-powered CVE intelligent repair, conflict resolution, and code migration patch flow

分支2Tags2
文件最后提交记录最后更新时间
4 个月前
14 小时前
4 个月前
20 天前
2 个月前

openEuler社区AI漏洞修复项目

项目概述

nvwa-cve-fixer 是openEuler社区一个基于人工智能的 CVE(Common Vulnerabilities and Exposures)智能修复平台,提供自动化的补丁回移植、冲突解决和代码迁移能力。该项目集成了多个子模块,形成完整的 CVE 修复工作流,当前主要分为3个模块:

  • patch-backporting:基于大语言模型的补丁回移植引擎,负责分析补丁内容,理解代码语义,自动回移植到目标版本。
  • patchflow:CVE 补丁处理服务,可以批量回合补丁并且解决布丁冲突,当前主要负责openEuler社区kernel仓库补丁修复。
  • peripheral_rpm:CVE 补丁处理服务,当前负责分析软件包是否受影响,以及提供补丁修复能力,当前主要负责openEuler外围用户态软件包补丁修复。

nvwa 一词源自中国神话中的造物之神"女娲",象征着这个工具能够"修补"软件世界中的安全漏洞。

背景与动机

安全漏洞是软件系统面临的重大威胁。当上游社区发布 CVE 修复补丁时,下游发行版(如 openEuler)需要将这些补丁快速、准确地回移植到各个支持的生命周期版本中。传统的人工回移植方式面临以下挑战:

  • 效率低下:需要人工分析补丁内容,理解代码变更逻辑
  • 容易出错:手动移植容易引入新的 bug 或遗漏关键修复
  • 资源消耗:每个 CVE 都需要安全专家投入大量精力
  • 版本众多:一个 CVE 可能影响数十个分支版本

nvwa-cve-fixer 通过 AI 技术自动化这一过程,显著提升 openEuler社区CVE 修复效率。

核心概念

CVE (Common Vulnerabilities and Exposures)

CVE 是国际通用的漏洞标识符系统,每个 CVE ID 代表一个已知的安全漏洞。例如 CVE-2024-3094 代表 XZ Utils 的后门漏洞。

补丁回移植 (Backporting)

将新版本代码中的修复补丁应用到旧版本代码的过程。由于旧版本代码结构可能与新版本不同,补丁往往不能直接应用,需要智能分析和适配。

Patch Flow

自动化补丁处理的工作流,包括:获取上游补丁 → 分析影响版本 → 解决代码冲突 → 验证修复正确性 → 创建合并请求。

架构概览

nvwa-cve-fixer/
│
├── patch-backporting/     # PortGPT: AI 驱动的补丁回移植引擎
│   └── src/
│       ├── agent/        # LLM Agent 模块
│       ├── tools/        # 工具函数
│       └── backporting.py # 主入口
│
├── patchflow/            # CVE 补丁处理服务
│   └── src/
│       ├── cvekit/       # 命令行工具核心
│       ├── cve_service/  # CVE 服务(API/MCP)
│       └── git_webhook/  # Git Webhook 处理
│
└── peripheral_rpm/       # RPM 包 CVE 自动修复工具链
    ├── skills/           # OpenCode Skills
    └── tools/            # 辅助工具
        ├── cve-deal/     # CVE 处理工具
        └── atomgit-notifier/ # Issue 监控服务

核心模块详解

1. patch-backporting (PortGPT)

基于大语言模型的自动化补丁回移植工具,论文发表于 IEEE S&P 2026

核心能力:

  • 自动分析上游修复补丁的逻辑
  • 智能适配目标代码的上下文
  • 处理代码路径和变量名不匹配的场景
  • 生成与原补丁语义等价的修复代码

技术特点:

  • 支持 OpenAI 和 Azure OpenAI 双后端
  • 基于语义理解而非简单的文本替换
  • 提供 Docker 容器化部署,开箱即用

快速开始:

# 安装依赖
cd patch-backporting
curl -sSL https://pdm-project.org/install-pdm.py | python3 -
pdm install
source .venv/bin/activate

# 配置并运行
cd src
cp example.yml my_config.yml
# 编辑 my_config.yml 填入你的配置
python backporting.py --config my_config.yml --debug

Docker 部署:

# 构建镜像
docker build -t patch-backporting .

# 运行容器
docker run --rm -v $(pwd):/app/src patch-backporting \
  python backporting.py --config config.yml

2. patchflow

CVE 补丁处理服务,提供 cvekit 命令行工具,支持完整的 CVE 处理流程。

核心功能:

功能 描述
parse-issue 解析 CVE Issue,提取关键信息
setup-env 克隆并准备源码环境
get-commits 获取引入和修复 commit
analyze-branches 分析分支受影响性
apply-patch 应用补丁到目标分支
create-pr 创建 Pull Request
backport AI 驱动的补丁冲突修复
backport-batch 批量回移植处理

快速开始:

# 安装
cd patchflow/src
pip install -r requirements.txt
python3 setup.py install

# 环境配置
export REPO_URL=https://atomgit.com/your-org/your-repo
export FORK_REPO_URL=https://atomgit.com/your-fork/your-repo
export ATOMGIT_TOKEN=${ATOMGIT_TOKEN}
export LLM_PROVIDER=openai
export API_KEY=${API_KEY}

# 基本操作流程
cvekit --action parse-issue --cve-id CVE-2024-XXXX
cvekit --action setup-env
cvekit --action get-commits --cve-id CVE-2024-XXXX
cvekit --action analyze-branches --cve-id CVE-2024-XXXX
cvekit --action apply-patch --cve-id CVE-2024-XXXX --patch-path /path/to/patch
cvekit --action backport --cve-id CVE-2024-XXXX --branch target-branch
cvekit --action create-pr --cve-id CVE-2024-XXXX --branch target-branch

批量回移植:

# 从 Excel 生成配置
cvekit --action backport-batch \
  --backport-excel ./cve_list.xlsx \
  -o ./batch_config.yml

# 生成报告
cvekit --action backport-batch --backport-config ./batch_config.yml --debug

# 交互式执行回移植
cvekit --action backport-batch --backport-config ./batch_config.yml.report.yml -i

3. peripheral_rpm

RPM 包的端到端 CVE 自动修复工具链,集成 OpenCode Skills 实现智能化处理。

核心组件:

skills/rpm-patch-applier

RPM 补丁应用适配 Skill,处理源码 RPM 的补丁应用:

  • 阶段 1:源码准备(展开 tarball + git init)
  • 阶段 2:补丁应用与冲突解决(AI 辅助)
  • 阶段 3:Spec 文件更新(Patch 声明、%patch 指令、Release bump)
  • 阶段 4:验证(rpmbuild -bp 确认补丁可正确应用)

skills/cve-analyze

CVE 影响性分析 Skill:

  • 自动分析 CVE issue 的影响范围
  • 填写受影响版本、ABI 变化、原因说明等字段
  • 按模板格式化分析结果并发布评论

tools/cve-deal

CVE Issue 端到端处理工具,6 步完整流程:

  1. 抓取 Issue(解析 CVE ID、CVSS、目标分支)
  2. 准备分析数据(NVD 信息、Fork 仓库、AI 查找补丁)
  3. 受影响性分析(AI + 确定性脚本)
  4. 应用补丁到分支(AI 辅助 + spec 修改)
  5. 提交 PR(跨仓库 PR 创建)
  6. 生成评论(模板化 CVE 分析报告)

tools/atomgit-notifier

AtomGit Issue 监控通知服务:

  • 轮询 AtomGit API 获取 CVE 类型通知
  • 自动触发 cve-deal 流程处理
  • 实时反馈处理进度和结果

快速开始:

# 配置 OpenCode
pip install opencode
opencode config set default-proxy Sisyphus
opencode config set default-model zhipuai-coding-plan/glm-5-turbo

# 部署 Skills
cp -r peripheral_rpm/skills/* ~/.config/opencode/skills/

# 配置 AtomGit Token
cd peripheral_rpm/tools/atomgit-notifier
echo "your_atomgit_token" > token
chmod 600 token

# 配置监控仓库
vim repos.conf  # 每行一个 owner/repo

# 启动监控服务
bash atomgit_notifier.sh

触发 CVE 处理:

在 CVE issue 下评论:

@username /branches <openEuler-22.03-LTS,master>

工作流程详解

CVE 处理完整流程

┌─────────────────────────────────────────────────────────────────┐
│                      CVE 处理工作流                              │
└─────────────────────────────────────────────────────────────────┘

[1] Issue 检测                                                     
    │ atomgit-notifier 监控 CVE 类型 issue                       
    ▼                                                              
[2] CVE 解析                                                       
    │ 提取 CVE ID、CVSS、目标分支、评论内容                        
    ▼                                                              
[3] 补丁获取                                                       
    │ 从 NVD/上游仓库获取修复 commit 和补丁文件                   
    ▼                                                              
[4] 分支分组                                                       
    │ 基于 Git tree hash + spec hash 分组等价分支                 
    ▼                                                              
[5] 受影响性判断                                                    
    │ AI 分析 + 确定性脚本判断版本是否受影响                      
    ▼                                                              
[6] 补丁应用                                                       
    │ AI 辅助冲突解决,自动更新 spec 文件                         
    ▼                                                              
[7] PR 提交                                                        
    │ 自动创建跨仓库 PR 到 AtomGit/GitCode                        
    ▼                                                              
[8] 结果评论                                                       
    │ 按 openEuler CVE 模板格式化并发布分析结果                   

补丁回移植流程(patch-backporting)

[新版本修复补丁] ──► [PortGPT 分析] ──► [目标版本代码]
                              │
                              ▼
                    ┌─────────────────┐
                    │  冲突检测与解决  │
                    │  语义等价验证   │
                    │  补丁适配生成   │
                    └─────────────────┘
                              │
                              ▼
                       [生成的修复补丁]

技术亮点

特性 说明
AI 驱动 基于大语言模型实现智能补丁回移植和冲突解决,理解代码语义而非简单文本匹配
多平台支持 支持 GitCode、Gitee 等代码托管平台
断点续传 工作流状态持久化,支持从失败步骤恢复
批量处理 支持 Excel 配置文件批量处理大量 CVE
多语言支持 提供中英文界面
容器化部署 提供 Docker 镜像,快速部署
科研支撑 核心算法发表于 IEEE S&P 2026

安装与配置

环境依赖

sudo yum install -y git rpm-build curl jq

# Python 依赖
pip install opencode packaging openpyxl GitPython PyYAML

LLM 配置

支持多种 LLM 提供商:

# OpenAI(默认)
export LLM_PROVIDER=openai
export API_KEY=sk-your-api-key

# Azure OpenAI
export LLM_PROVIDER=azure
export AZURE_ENDPOINT=https://your-resource.openai.azure.com/
export AZURE_DEPLOYMENT=gpt-4
export API_KEY=your-azure-api-key

# 本地模型(OpenAI 兼容接口)
export LLM_PROVIDER=local
export LLM_BASE_URL=http://localhost:11434/v1
export MODEL_NAME=llama3
export API_KEY=optional-token

AtomGit Token 配置

# 创建 Personal Access Token
# 访问 https://atomgit.com/settings/tokens

# 配置 Token
export ATOMGIT_TOKEN=your_atomgit_token

# 或写入配置文件
cd peripheral_rpm/tools/atomgit-notifier
echo "your_token" > token
chmod 600 token

配置文件示例

backport-batch 配置

project: linux
project_url: https://atomgit.com/openeuler/kernel
project_dir: /path/to/source-repo
target_path: /path/to/target-repo
target_release: openEuler-24.03-LTS-SP1-patchpool
patch_dataset_dir: /path/to/patch_dataset
llm_provider: minimax
api_key: ${API_KEY}
commits:
  - commit: 2d1a8bfb61ec
    commit_title: 'etm4x: Fix etm4_count race by moving cpuhp callbacks to init'
  - commit: 16a0cbac6609
    commit_title: 'drivers: arch_topology: Refactor do-while loops'

常见问题

Q: 如何判断生成的补丁是否正确?

A: 建议从以下三个维度验证:

  1. 逻辑块匹配:生成的补丁是否修改了 GT 相同的逻辑块代码
  2. 位置正确性:代码变更位置是否与 GT 相同或等价
  3. 语义等价:修改后的代码语义是否与 GT 等价

Q: 支持哪些代码托管平台?

A: 当前支持:

  • AtomGit(主要目标平台)
  • GitCode
  • Gitee(向后兼容)

Q: 如何处理补丁冲突?

A: 有两种方式:

  1. 自动解决:使用 cvekit --action backport 命令,AI 会尝试自动解决冲突
  2. 手动辅助:在 OpenCode 中使用 /rpm-patch-applier Skill,AI 会指导你逐步解决冲突

Q: 批量处理有什么限制?

A:

  • 单次批量处理建议不超过 100 个 commit
  • 建议使用 --debug 参数先测试小批量,确认无误后再大规模处理
  • 敏感信息(token、api_key)建议通过环境变量传入

Q: 如何调试处理失败的问题?

A:

  1. 查看工作目录日志:/tmp/cve-{name}-{issue_number}/cve_deal.log
  2. 检查工作流状态:workflow_state.json
  3. 使用 --start-step N 从指定步骤重新执行
  4. 查看 OpenCode session:opencode /sessions /use <session_id>

许可证

本项目包含多个子模块,各模块遵循其对应的开源许可证:

模块 许可证
patch-backporting MIT License
patchflow 遵循 openEuler 相关许可证
peripheral_rpm 遵循 openEuler 相关许可证

目录结构

nvwa-cve-fixer/
├── patch-backporting/       # PortGPT 补丁回移植引擎
│   ├── src/                # 源代码
│   │   ├── agent/          # LLM Agent
│   │   ├── tools/          # 工具函数
│   │   └── backporting.py # 主入口
│   ├── docs/               # 文档(含论文 PDF)
│   ├── test/               # 测试用例
│   ├── Dockerfile
│   └── README.md
│
├── patchflow/              # CVE 补丁处理服务
│   ├── src/                # 源代码
│   │   ├── cvekit/         # cvekit 核心模块
│   │   ├── cve_service/    # CVE 服务(API/MCP)
│   │   ├── git_webhook/    # Git Webhook
│   │   └── tests/          # 测试用例
│   ├── docs/zh/            # 中文文档
│   └── README.md
│
├── peripheral_rpm/         # RPM CVE 修复工具链
│   ├── skills/             # OpenCode Skills
│   │   ├── rpm-patch-applier/
│   │   └── cve-analyze/
│   ├── tools/              # 辅助工具
│   │   ├── cve-deal/       # CVE 处理工具
│   │   └── atomgit-notifier/ # Issue 监控服务
│   └── README.md
│
└── README.md               # 本文件

参与贡献

欢迎提交 Issue 和 Pull Request!

  1. Fork 本仓库
  2. 创建特性分支:git checkout -b feature/your-feature
  3. 提交更改:git commit -m 'Add some feature'
  4. 推送分支:git push origin feature/your-feature
  5. 创建 Pull Request

项目维护者:openEuler CVE 修复团队

项目介绍

AI-powered CVE intelligent repair, conflict resolution, and code migration patch flow

定制我的领域