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(Common Vulnerabilities and Exposures)セキュリティチェックシステムの構築を提案する。コードコミット、依存関係変更、リリースポイントで自動的にセキュリティスキャンを行い、潜在的なセキュリティリスクを早期に発見・警告する。

動機

なぜこの機能が必要なのか?

オープンソースプロジェクトのセキュリティ重要性が増しています:

  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:
    # 毎日午前0時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、ソフトウェア構成分析

参考文献