RFC-005: 自动化CVE安全检查系统
拒绝原因
本 RFC 被拒绝,原因如下:
1. cargo audit 已足够满足需求
Rust 生态已有成熟的 cargo audit 工具,能够:
- 自动检测依赖中的已知 CVE
- 检查依赖是否已弃用
- 与 CI/CD 集成简单
重复造轮子没有必要。
2. 资源投入与收益不成正比
自研 CVE 扫描系统需要:
- 持续维护漏洞数据库
- 定期更新检测规则
- 开发 AI 增强功能(复杂且效果不确定)
而 cargo audit 已经足够好用。
摘要
本RFC提出建立一套基于AI增强 + GitHub Actions的自动化CVE(通用漏洞披露)安全检查系统,在代码提交、依赖变更、发布节点自动进行安全扫描,及早发现并预警潜在安全风险。
动机
为什么需要这个特性?
开源项目的安全性日益重要:
- 依赖漏洞风险:项目使用的第三方依赖可能存在已知漏洞
- 供应链攻击:恶意代码可能通过依赖链注入
- 及时发现:漏洞发现后需要快速评估影响并修复
- 合规要求:企业用户对代码安全有合规性要求
当前的问题
当前项目存在以下安全盲区:
- 依赖未知:未系统化追踪 Cargo/Rust 依赖的版本和漏洞状态
- 手动检查:依赖更新和安全审计依赖人工检查
- 无CI集成:没有在CI流程中强制安全检查
- 预警缺失:新CVE公布后无法及时评估影响
提案
核心架构
┌─────────────────────────────────────────────────────────────┐
│ 安全检查架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 代码提交 │ │ 依赖变更 │ │ 定时触发 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ GitHub Actions │ │
│ │ 自动化工作流 │ │
│ └───────────┬─────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │依赖漏洞扫描│ │代码安全分析│ │ AI风险评估 │ │
│ │(Cargo) │ │(Semgrep) │ │(LLM) │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ 漏洞数据库 + AI 分析 │ │
│ │ (NVD + GitHub Advisories│ │
│ │ + 自定义规则) │ │
│ └───────────┬─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ 安全报告 + 告警通知 │ │
│ └─────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘技术选型
| 组件 | 技术方案 | 说明 |
|---|---|---|
| 依赖漏洞扫描 | cargo-audit | Rust 官方漏洞数据库集成 |
| 代码安全分析 | 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 | 代码所有者 |
| 每日摘要 | 所有贡献者 | |
| 修复完成 | GitHub Check | PR 参与者 |
权衡
优点
- 自动化程度高:无需人工干预,自动扫描和报告
- AI 增强:智能分析漏洞影响,减少误报
- 多层次防护:依赖、代码、供应链全覆盖
- CI/CD 集成:安全检查融入开发流程
- 可扩展:支持自定义规则和AI模型
缺点
- 依赖外部服务:AI 分析需要 OpenAI/Claude API
- 成本考虑:大量扫描可能产生 API 调用费用
- 误报处理:需要持续优化规则减少误报
- 维护成本:规则库需要持续更新
替代方案
| 方案 | 描述 | 为什么不选 |
|---|---|---|
| 仅使用 cargo-audit | 只做依赖漏洞扫描 | 缺少代码层安全分析 |
| 购买商业安全服务 | 使用 Snyk、Sonatype 等 | 成本高,定制性差 |
| 纯手动审计 | 人工检查代码和依赖 | 效率低,覆盖面窄 |
| 仅 Semgrep | 只做代码静态分析 | 缺少依赖漏洞数据 |
实现策略
阶段划分
Phase 1: 基础依赖扫描(v0.3)
- 配置
cargo-auditGitHub Action - 建立安全报告模板
- 添加基础 Slack/邮件通知
- 配置
Phase 2: 代码安全分析(v0.4)
- 配置 Semgrep 规则集
- 添加自定义安全规则
- 建立漏洞分级处理流程
Phase 3: AI 增强(v0.5)
- 集成 OpenAI/Claude API
- 实现漏洞影响分析
- 开发修复建议生成
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:术语表
| 术语 | 定义 |
|---|---|
| CVE | Common Vulnerabilities and Exposures,通用漏洞披露 |
| CVSS | Common Vulnerability Scoring System,通用漏洞评分系统 |
| NVD | National Vulnerability Database,国家漏洞数据库 |
| SAST | Static Application Security Testing,静态应用安全测试 |
| SCA | Software Composition Analysis,软件成分分析 |
