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)セキュリティチェックシステムの構築を提案する。コードコミット、依存関係変更、リリースポイントで自動的にセキュリティスキャンを行い、潜在的なセキュリティリスクを早期に発見・警告する。
動機
なぜこの機能が必要なのか?
オープンソースプロジェクトのセキュリティ重要性が増しています:
- 依存関係の脆弱性リスク:プロジェクトが使用するサードパーティ製依存関係には既知の脆弱性が存在する可能せいがある
- サプライチェーン攻撃:悪意のあるコードが依存関係チェーンを通じて注入される可能性がある
- 迅速な発見:脆弱性が発見された後、影響範囲の迅速な評価と修正が必要
- コンプライアンス要件:企業ユーザーはコードセキュリティにコンプライアンス要件を求める
現在の問題点
現在のプロジェクトには以下のセキュリティ上の盲点があります:
- 依存関係の未把握: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:
# 毎日午前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 | コード所有者 |
| デイリーサマリー | 全コントリビューター | |
| 修正完了 | 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、ソフトウェア構成分析 |
