Skip to content

RFC-005: 自动化CVE安全检查系统

拒绝原因

本 RFC 被拒绝,原因如下:

1. cargo audit 已足够满足需求

Rust 生态已有成熟的 cargo audit 工具,能够:

  • 自动检测依赖中的已知 CVE
  • 检查依赖是否已弃用
  • 与 CI/CD 集成简单

重复造轮子没有必要。

2. 资源投入与收益不成正比

自研 CVE 扫描系统需要:

  • 持续维护漏洞数据库
  • 定期更新检测规则
  • 开发 AI 增强功能(复杂且效果不确定)

cargo audit 已经足够好用。


摘要

本RFC提出建立一套基于AI增强 + GitHub Actions的自动化CVE(通用漏洞披露)安全检查系统,在代码提交、依赖变更、发布节点自动进行安全扫描,及早发现并预警潜在安全风险。

动机

为什么需要这个特性?

开源项目的安全性日益重要:

  1. 依赖漏洞风险:项目使用的第三方依赖可能存在已知漏洞
  2. 供应链攻击:恶意代码可能通过依赖链注入
  3. 及时发现:漏洞发现后需要快速评估影响并修复
  4. 合规要求:企业用户对代码安全有合规性要求

当前的问题

当前项目存在以下安全盲区:

  • 依赖未知:未系统化追踪 Cargo/Rust 依赖的版本和漏洞状态
  • 手动检查:依赖更新和安全审计依赖人工检查
  • 无CI集成:没有在CI流程中强制安全检查
  • 预警缺失:新CVE公布后无法及时评估影响

提案

核心架构

┌─────────────────────────────────────────────────────────────┐
│                    安全检查架构                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐     │
│  │  代码提交   │    │  依赖变更   │    │  定时触发   │     │
│  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘     │
│         │                  │                  │             │
│         └──────────────────┼──────────────────┘             │
│                            │                                │
│                            ▼                                │
│              ┌─────────────────────────┐                    │
│              │     GitHub Actions      │                    │
│              │     自动化工作流         │                    │
│              └───────────┬─────────────┘                    │
│                          │                                  │
│          ┌───────────────┼───────────────┐                  │
│          ▼               ▼               ▼                  │
│   ┌────────────┐  ┌────────────┐  ┌────────────┐           │
│   │依赖漏洞扫描│  │代码安全分析│  │ AI风险评估 │           │
│   │(Cargo)    │  │(Semgrep)  │  │(LLM)      │           │
│   └────────────┘  └────────────┘  └────────────┘           │
│                          │                                  │
│                          ▼                                  │
│              ┌─────────────────────────┐                    │
│              │   漏洞数据库 + AI 分析   │                    │
│              │  (NVD + GitHub Advisories│                    │
│              │   + 自定义规则)          │                    │
│              └───────────┬─────────────┘                    │
│                          │                                  │
│                          ▼                                  │
│              ┌─────────────────────────┐                    │
│              │   安全报告 + 告警通知    │                    │
│              └─────────────────────────┘                    │
│                                                              │
└─────────────────────────────────────────────────────────────┘

技术选型

组件技术方案说明
依赖漏洞扫描cargo-auditRust 官方漏洞数据库集成
代码安全分析Semgrep支持自定义规则的静态分析
AI风险评估OpenAI API / Claude API漏洞影响分析和修复建议
漏洞数据库NVD + GitHub Advisory DB官方漏洞数据源
工作流编排GitHub Actions原生集成,无需额外基础设施

GitHub Actions 工作流设计

1. 提交时检查(security-check.yml

yaml
# .github/workflows/security-check.yml
name: Security Check

on:
  push:
    branches: [main, develop]
    paths:
      - '**/Cargo.toml'
      - '**/Cargo.lock'
      - 'src/**'
      - 'rust-toolchain*'
  pull_request:
    paths:
      - '**/Cargo.toml'
      - '**/Cargo.lock'
      - 'src/**'

jobs:
  dependency-audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-

      - name: Run cargo-audit
        uses: actions-rs/audit-check@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
        continue-on-error: true

      - name: AI Vulnerability Analysis
        if: failure()
        run: |
          echo "Running AI analysis..."
          # 调用 AI 分析漏洞影响
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

  code-security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run Semgrep
        uses: returntocorp/semgrep-action@v1
        with:
          config: >-
            r/security-audit r/lang-rust
        continue-on-error: true

  generate-report:
    needs: [dependency-audit, code-security]
    runs-on: ubuntu-latest
    if: always()
    steps:
      - name: Generate Security Report
        run: |
          echo "## 安全检查报告" >> $GITHUB_STEP_SUMMARY
          # 生成Markdown格式报告

2. 定时全面扫描(security-scheduled.yml

yaml
# .github/workflows/security-scheduled.yml
name: Scheduled Security Scan

on:
  schedule:
    # 每天凌晨 UTC 时间执行
    - cron: '0 0 * * *'
  # 手动触发
  workflow_dispatch:
    inputs:
      scan_level:
        description: 'Scan Level'
        required: false
        default: 'full'
        type: choice
        options:
          - full
          - dependencies
          - code

jobs:
  daily-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Full Dependency Audit
        run: |
          cargo audit --json > audit_results.json
          # 处理 JSON 结果

      - name: Check for Yanked Versions
        run: |
          # 检查 Cargo.toml 中是否有 yanked 版本
          cargo update --dry-run | grep yanked

      - name: AI Security Assessment
        run: |
          # AI 分析新漏洞风险
          python3 ai_security_analysis.py
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

      - name: Send Notification
        if: failure()
        uses: slackapi/slack-github-action@v1
        with:
          payload: |
            {
              "text": "🚨 YaoXiang 安全扫描发现新漏洞",
              "attachments": [...]
            }

AI 增强功能

漏洞影响分析

python
# ai_vulnerability_analysis.py

import openai
import json

def analyze_vulnerability(vulnerability_data: dict) -> dict:
    """
    使用 AI 分析漏洞的影响范围和修复优先级
    """

    prompt = f"""
    分析以下安全漏洞信息,提供修复建议:

    漏洞详情:
    - CVE ID: {vulnerability_data['cve_id']}
    - 包名: {vulnerability_data['package']}
    - 影响版本: {vulnerability_data['affected_versions']}
    - 严重程度: {vulnerability_data['severity']}
    - 描述: {vulnerability_data['description']}

    项目信息:
    - 当前版本: {vulnerability_data['current_version']}
    - 是否在关键路径: {vulnerability_data['is_critical_path']}

    请提供:
    1. 影响评估(1-10分)
    2. 修复优先级(P0/P1/P2/P3)
    3. 建议的修复步骤
    4. 临时缓解措施
    """

    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[
            {
                "role": "system",
                "content": "你是代码安全专家,专注于开源项目漏洞分析和修复建议。"
            },
            {"role": "user", "content": prompt}
        ],
        temperature=0.3
    )

    return parse_ai_response(response)

自定义安全规则

yaml
# .semgrep/rules/security-audit.yaml

rules:
  - id: yaoxiang-unsafe-ffi
    pattern: |
      extern "C" {
        $FUNC(...)
      }
    message: |
      检测到 FFI 调用,请确保:
      1. 参数已正确验证
      2. 内存已正确释放
      3. 错误已正确处理
    severity: WARNING
    languages: [rust]

  - id: yaoxiang-dos-risk
    pattern: |
      fn $FUNC(...) {
        ...
        $VAR.clone()
        ...
      }
    message: |
      潜在 DoS 风险:注意大对象的 clone 操作
    severity: WARNING
    languages: [rust]

安全报告格式

markdown
# YaoXiang 安全扫描报告

**扫描时间**: 2025-01-05 10:30:00 UTC **扫描分支**: main **提交哈希**: abc123def456

## 漏洞摘要

| 严重程度 | 数量 | 状态   |
| -------- | ---- | ------ |
| Critical | 0    | 无     |
| High     | 2    | 待处理 |
| Medium   | 5    | 已评估 |
| Low      | 12   | 监控中 |

## 依赖漏洞

### High - 需要立即处理

1. **CVE-2024-XXXXX: package-name**
   - 影响版本: < 1.2.0
   - 当前版本: 1.1.5 (易受攻击)
   - 修复版本: 1.2.0
   - AI 风险评估: P0 - 高风险

### Medium - 本周处理

...

## 代码安全问题

...

## AI 分析摘要

本次扫描发现 2 个高危漏洞,建议优先处理...

## 建议行动

- [ ] 升级 `package-name` 到 1.2.0
- [ ] 审查 `module/path/file.rs` 的 FFI 调用
- [ ] 配置 Dependabot 自动更新依赖

详细设计

集成点

阶段集成点检查内容阻断条件
提交时PR CI依赖漏洞、代码安全问题Critical/High
合并时合并检查完整安全扫描Critical/High
发布时Release CI全面安全审计任何漏洞
定时每日任务新CVE检查、依赖更新通知

权限模型

yaml
permissions:
  contents: read
  security-events: write
  checks: write
  issues: write # 用于创建安全告警 issue

通知策略

事件通知方式接收者
Critical/High 漏洞Slack + Email + GitHub Mention安全团队 + PR 作者
Medium 漏洞GitHub Issue代码所有者
每日摘要Email所有贡献者
修复完成GitHub CheckPR 参与者

权衡

优点

  • 自动化程度高:无需人工干预,自动扫描和报告
  • AI 增强:智能分析漏洞影响,减少误报
  • 多层次防护:依赖、代码、供应链全覆盖
  • CI/CD 集成:安全检查融入开发流程
  • 可扩展:支持自定义规则和AI模型

缺点

  • 依赖外部服务:AI 分析需要 OpenAI/Claude API
  • 成本考虑:大量扫描可能产生 API 调用费用
  • 误报处理:需要持续优化规则减少误报
  • 维护成本:规则库需要持续更新

替代方案

方案描述为什么不选
仅使用 cargo-audit只做依赖漏洞扫描缺少代码层安全分析
购买商业安全服务使用 Snyk、Sonatype 等成本高,定制性差
纯手动审计人工检查代码和依赖效率低,覆盖面窄
仅 Semgrep只做代码静态分析缺少依赖漏洞数据

实现策略

阶段划分

  1. Phase 1: 基础依赖扫描(v0.3)

    • 配置 cargo-audit GitHub Action
    • 建立安全报告模板
    • 添加基础 Slack/邮件通知
  2. Phase 2: 代码安全分析(v0.4)

    • 配置 Semgrep 规则集
    • 添加自定义安全规则
    • 建立漏洞分级处理流程
  3. Phase 3: AI 增强(v0.5)

    • 集成 OpenAI/Claude API
    • 实现漏洞影响分析
    • 开发修复建议生成
  4. Phase 4: 高级特性(v0.6)

    • 自动修复 PR
    • 供应链安全签名
    • 漏洞赏金集成

依赖关系

  • Phase 1 → Phase 2 → Phase 3 → Phase 4(顺序依赖)
  • 无外部 RFC 依赖

风险

风险影响缓解措施
API 密钥泄露安全风险使用 GitHub Secrets,定期轮换
扫描超时CI 延迟设置超时限制,优化扫描范围
误报过多开发困扰持续优化规则,建立白名单
成本超支财务影响设置 API 调用限额,使用缓存

开放问题

  • [ ] 使用哪个 AI 服务商?(OpenAI / Anthropic / 本地部署)
  • [ ] 是否需要自动创建修复 PR?
  • [ ] 如何处理供应链攻击检测?
  • [ ] 是否需要支持私有依赖仓库?

附录

附录A:安全扫描配置

toml
# cargo-audit 配置
# cargo.toml 或 .cargo/config.toml

[package.metadata.audit]
# 忽略特定漏洞
ignore = ["RUSTSEC-0000-0000"]

# 严重程度阈值
severity-threshold = "medium"

# 允许的许可证
allow = ["MIT", "Apache-2.0", "BSD-3-Clause"]

附录B:GitHub Security Advisory 配置

yaml
# .github/advisories.yml
# 自定义漏洞数据库

exceptions:
  - package: 'some-internal-crate'
    vulnerability: 'YX-2024-001'
    reason: '仅内部使用,已采取缓解措施'
    expires: '2025-06-01'

附录C:术语表

术语定义
CVECommon Vulnerabilities and Exposures,通用漏洞披露
CVSSCommon Vulnerability Scoring System,通用漏洞评分系统
NVDNational Vulnerability Database,国家漏洞数据库
SASTStatic Application Security Testing,静态应用安全测试
SCASoftware Composition Analysis,软件成分分析

参考文献