🛡️

VEX入門 - 脆弱性アラート疲れを解消するトリアージ管理

に公開

VEXとは何か

VEX(Vulnerability Exploitability eXchange) は、「この脆弱性はうちの製品では影響ありません」を機械可読な形式で伝えるための仕様です。

なぜVEXが必要か

SBOMを導入すると、こんな状況になりがちです:

プロジェクトA: Critical 23件、High 156件
プロジェクトB: Critical 18件、High 89件
プロジェクトC: Critical 31件、High 203件

全部対応するのは無理。 でも放置もできない。

ここで問題なのは、これらの脆弱性の多くが「理論上は存在するが、実際には悪用できない」ケースだということです。

例えば:

  • 脆弱性のある関数を使っていない
  • 脆弱性が発動する条件(ネットワーク経由のアクセス等)がない
  • 既に別の対策(WAF等)で保護されている

VEXは、この「影響なし」の判断を記録・共有するための仕組みです。

VEXの4つのステータス

ステータス 意味
Not Affected 影響なし 該当関数を使っていない
Affected 影響あり、対応必要 該当バージョンを使用中
Fixed 修正済み パッチ適用完了
Under Investigation 調査中 影響範囲を確認中

実際のVEXドキュメント

CycloneDX VEX形式の例:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.5",
  "vulnerabilities": [
    {
      "id": "CVE-2021-44228",
      "source": { "name": "NVD" },
      "analysis": {
        "state": "not_affected",
        "justification": "code_not_reachable",
        "detail": "Log4j2のJNDI Lookup機能は無効化済み。環境変数LOG4J_FORMAT_MSG_NO_LOOKUPSをtrueに設定。"
      },
      "affects": [
        {
          "ref": "pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1"
        }
      ]
    }
  ]
}

SBOMHubでのVEX管理

1. 脆弱性一覧からトリアージ

脆弱性一覧画面で、各脆弱性の「ステータス」を変更できます。

CVE-2021-44228 (Log4Shell)
├─ 影響コンポーネント: log4j-core 2.14.1
├─ CVSS: 10.0 (Critical)
├─ EPSS: 97.5%
└─ ステータス: [Not Affected ▼]
   └─ 理由: JNDI Lookup無効化済み

2. VEXエクスポート

トリアージ結果はVEXドキュメントとしてエクスポート可能:

# APIでエクスポート
curl -H "Authorization: Bearer $TOKEN" \
  https://api.sbomhub.app/api/v1/projects/xxx/vex \
  -o vex.json

3. 取引先への共有

公開ポータル機能を使えば、VEX情報を含めたSBOMを取引先に共有できます。

「この脆弱性は影響ありますか?」という問い合わせに対して、URLを渡すだけで回答完了。

トリアージのベストプラクティス

優先度の決め方

  1. EPSS(悪用可能性スコア)を見る

    • EPSS > 10%: 今すぐ対応
    • EPSS 1-10%: 今週中に判断
    • EPSS < 1%: 月次レビューで判断
  2. 到達可能性を確認

    • その関数/メソッドを実際に呼んでいるか?
    • 外部からの入力がその経路に到達するか?
  3. 緩和策の有無

    • WAF/IDS/IPSで保護されているか?
    • ネットワーク分離されているか?

Not Affectedの正当化理由(Justification)

VEXでは「なぜ影響なしと判断したか」の理由を記録します:

Justification 説明
code_not_present 脆弱なコードが含まれていない
code_not_reachable 脆弱なコードに到達できない
requires_configuration 特定の設定でのみ発動(その設定を使っていない)
requires_dependency 特定の依存関係が必要(その依存がない)
requires_environment 特定の環境でのみ発動(その環境ではない)
protected_by_compiler コンパイラの保護機能で緩和
protected_at_runtime ランタイムの保護機能で緩和
protected_at_perimeter WAF等で保護
protected_by_mitigating_control その他の緩和策あり

VEX運用のアンチパターン

NG: 「面倒だから全部Not Affected」

監査で説明できません。理由を必ず記録してください。

NG: 「調査中のまま放置」

Under Investigationは一時的なステータスです。期限を決めて判断してください。

NG: 「一度決めたら見直さない」

新しい攻撃手法が発見されることがあります。定期的な再評価が必要です。

SBOMHubでの運用フロー

┌─────────────────────────────────────────────────────────┐
│  1. SBOMアップロード(CI/CD or 手動)                    │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│  2. 脆弱性スキャン(NVD + JVN自動照合)                  │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│  3. EPSS優先度付け                                       │
│     - Critical + EPSS > 10% → 即時対応キューへ          │
│     - その他 → 週次レビューキューへ                      │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│  4. トリアージ(セキュリティチーム)                     │
│     - Affected → 開発チームへエスカレーション           │
│     - Not Affected → 理由を記録してクローズ             │
│     - Under Investigation → 期限設定                    │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│  5. VEXエクスポート(監査/取引先共有用)                 │
└─────────────────────────────────────────────────────────┘

まとめ

  • VEXは「影響なし」を機械可読に記録する仕組み
  • トリアージでアラート疲れを解消
  • EPSSで現実的な優先度付け
  • SBOMHubでVEX管理を一元化

リンク

Discussion