スキャンと優先度の判定
処理の流れ
KestreLynxは、スキャンのたびに稼働中のコンテナを確認し、検出結果と優先度を更新します。
- DockerホストまたはKubernetesクラスタから対象コンテナを取得する
- イメージ参照と実体の組み合わせでスキャン対象をまとめる
- 各対象をTrivyでスキャンし、指定した実体との一致を確認する
- 検出結果をパッケージと修正状態ごとに集約する
- トリアージが有効なら、悪用情報と深刻度から優先度を判定する
この結果を基に、差分と履歴の判定と通知の送信判定を行います。 修正計画を有効にした場合の処理は、修正計画の処理の流れを参照してください。
スキャン対象
1つのKestreLynxインスタンスで、Dockerホスト1台またはKubernetesクラスタ1つを対象にします。
Dockerの対象
Dockerでは、Composeで管理するものを含め、稼働中のコンテナが使うイメージを対象にします。
- 停止中のコンテナと、稼働中のコンテナが使っていないイメージは対象外
- KestreLynxが修正計画の依存更新に使う作業用コンテナは対象外
Dockerへの接続設定は設定を参照してください。
Kubernetesの対象
Kubernetesでは、コンテナごとの実行状態から対象を選びます。
| コンテナの種類 | 対象となる条件 |
|---|---|
| 通常コンテナ | 実行中 |
restartPolicy: Always付きinit container |
実行中 |
| 通常のinit container | 対象外 |
| ephemeral container | 対象外 |
対象namespaceの指定方法は設定を参照してください。
イメージの識別
イメージ参照は、web:1.0のような名前です。
実体は、その参照で実際に動いているイメージの内容を識別する情報です。
| 実行環境 | 実体の識別に使う情報 |
|---|---|
| Docker | Dockerが報告するconfig digest |
| Kubernetes | registry digestと、実行ノードのOS・アーキテクチャ |
同じ参照と同じ実体の組み合わせは1件にまとめます。 同じ参照でも実体が異なれば別件とし、実体を識別できないものは参照ごとにまとめます。
スキャン結果の確認
取得した一覧の完全性と、スキャンしたイメージの実体を確認してから結果を扱います。
コンテナ一覧の取得失敗
コンテナ一覧を取得できなかった回は、保存済みの履歴を変更せず終了します。 継続実行中は、次のスケジュールで再び取得を試みます。
Kubernetesでは、必要な一覧の一部だけを取得できた場合も、その部分結果でスキャンを進めません。 一覧から見えなくなっただけのコンテナを、停止したものとして扱うことを防ぎます。
イメージの実体確認
実体を識別できる場合は、その実体を指定してスキャンします。
| 実行環境 | スキャン対象の指定 | 結果の確認 |
|---|---|---|
| Docker | config digestで指定したローカルイメージ | 指定したconfig digestとの一致 |
| Kubernetes | registry digestとプラットフォームで指定したイメージ | 指定したdigestとOS・アーキテクチャの一致 |
指定した実体との一致を確認できない結果は、スキャン失敗として扱います。 実体を識別できない場合は、イメージ参照でスキャンします。
参照によるスキャン結果だけでは、稼働中の実体をスキャンしたことは確認できません。 通知上の注釈はスキャンの警告を参照してください。
スキャン失敗時の扱い
1件のスキャンに失敗しても、残りの対象はスキャンを続けます。 履歴がある参照では、次の規則で前回の検出結果を保持します。
| 今回の状態 | 前回の検出結果の扱い |
|---|---|
| 同じ参照のすべてのスキャンが失敗 | 前回の検出結果を保持 |
| 同じ参照の一部のスキャンが失敗 | 成功した結果を取り込み、失敗した実体に由来する可能性がある前回の検出結果も保持 |
| Kubernetesで参照によるスキャンが成功し、実体は未確認 | 一部失敗時と同じ規則で保持 |
一部失敗時は、通常側・EOL側それぞれで前回と今回のCVE IDを合わせ、高い方の優先度を保持します。 通常側では、前回の「修正版あり」の状態も保持します。
保持中の履歴が差分に与える影響は、保持中の履歴を参照してください。
パッケージ単位の集約
検出結果は、次の組み合わせが同じものを1つのグループにまとめます。
- イメージ参照と実体
- パッケージのエコシステム、OS・言語パッケージの種別、名前、導入済みバージョン
- 正規化した修正状態
同名パッケージでも、エコシステムや導入済みバージョン、修正状態が異なれば別グループになります。 各グループではCVE IDの重複を除きます。
グループの優先度は悪用情報による優先度、履歴の比較単位は差分の比較単位を参照してください。
検出結果の分類
深刻度、修正状態、EOL、優先度は、それぞれ異なる観点の情報です。
| 分類 | 表すもの |
|---|---|
| 深刻度 | 脆弱性の影響の大きさ |
| 修正状態 | 対象プラットフォームでの修正や調査の状態 |
| EOL | ベースOSやパッケージのサポート終了・サポート範囲 |
| 優先度 | 悪用情報を踏まえた確認の緊急性 |
深刻度
深刻度には、Trivyが報告する値を使います。 対象にする深刻度の指定方法と既定値は、設定を参照してください。
深刻度と優先度は一致するとは限りません。 優先度の判定は優先度の規則に従います。
修正状態
修正状態はTrivyのStatusから決め、修正版のバージョン欄から推測しません。
集約時には、次のように正規化します。
TrivyのStatus |
意味 | 集約先 |
|---|---|---|
fixed |
修正版あり | fixed |
affected |
影響あり・修正版なし | affected |
will_not_fix |
対象プラットフォームでは現時点で修正予定なし | will_not_fix |
fix_deferred |
修正延期 | affected |
under_investigation |
調査中 | affected |
unknown |
修正状態不明 | affected |
end_of_life |
サポート範囲外 | end_of_life |
not_affected |
影響なし | 集約・通知・優先度判定から除外 |
| 未指定・空 | unknownとして扱う |
affected |
| 上記以外 | 未定義の状態として残す | affected |
OSパッケージのwill_not_fixは、対象OSリリース向けの方針です。
開発元や別のOSリリースにも修正版がないことを意味しません。
元の状態を確認するフィールドは、Webhookの脆弱性フィールドを参照してください。
ベースOSのEOL
ベースOSのEOLは、Trivyが報告するOSのサポート終了状態から判定します。 個々のCVEの優先度とは独立した情報として扱います。
ベースOSがEOLの場合は、サポート中のベースイメージへの更新と再ビルドを検討してください。 Slackでの表示はEOLの表示を参照してください。
パッケージのEOL
パッケージのEOLは、TrivyのStatusがend_of_lifeの検出結果です。
配布元が対象リリースのサポート範囲外として扱うCVEであり、このリリース向けの修正は予定されていません。
EOLの検出結果は通常の所見と分けて扱い、同じパッケージに両方が存在する場合もあります。 トリアージを無効にしても、この分類は継続します。
悪用情報による優先度
トリアージは、悪用情報を使ってCVEごとの優先度を判定する機能です。 パッケージグループには、含まれるCVEのうち最も高い優先度を付けます。
| 情報源 | 判定に使う情報 |
|---|---|
| CISA KEV | 実際の悪用が確認された脆弱性への掲載 |
| EPSS | 今後30日以内に悪用活動が観測される確率の予測 |
EPSSは、脆弱性の影響の大きさや、監視対象の環境で悪用される確率を直接表すものではありません。
優先度の規則
利用可能な脅威情報がある場合は、次の表を上から順に判定します。 しきい値の設定方法と既定値は、設定を参照してください。
| 優先度 | 条件 |
|---|---|
| Act now | KEVに掲載されている、または既知のEPSSスコアがAct nowのしきい値以上 |
| Watch | Act nowに該当せず、既知のEPSSスコアがWatchのしきい値以上、または深刻度がCRITICAL |
| Low | 上記のいずれにも該当しない |
- EPSSスコアがないCVEでは、スコアを0とせず、EPSSの条件を判定から外す
- KEVのランサムウェア情報によって、別の優先度を設けることはない
修正状態による優先度の調整
通常のトリアージでは、判定した優先度を次のように扱います。
| 修正状態 | 優先度の扱い |
|---|---|
will_not_fix |
WatchをLowへ下げ、Act nowとLowは維持 |
fixed・affected・end_of_life |
判定した優先度を維持 |
affectedへ集約するその他の状態 |
affectedと同じ規則を適用 |
修正版がないことを理由に、Act nowを下げることはありません。 修正できない場合も、緩和策や置き換え、サポート中のバージョンへの移行を検討してください。
脅威情報の更新
KEVとEPSSは、スキャン時にキャッシュの経過時間を確認し、取得から20時間以上たっていれば更新を試みます。 更新に失敗しても、検証済みのキャッシュを取得から最大7日間利用します。
期限を超えたキャッシュは、判定に利用できない情報として扱います。 キャッシュの保存先と永続化は、設定を参照してください。
脅威情報を利用できない場合
情報源ごとの利用可否に応じて、判定方法を切り替えます。
| 利用できる情報 | 判定方法 |
|---|---|
| KEVとEPSS | 両方を使って通常の規則で判定 |
| KEVのみ | KEVと深刻度で判定 |
| EPSSのみ | EPSSと深刻度で判定 |
| どちらも利用不可 | CRITICALをAct now、それ以外の選択済み深刻度をWatchに分類 |
どちらも利用できない状態を縮退トリアージと呼びます。
縮退中はLowへ分類せず、will_not_fixによるWatchからLowへの引き下げも行いません。
縮退中の昇格差分は、通常のパッケージの変化とEOLパッケージの変化を参照してください。 利用不能や古いキャッシュの表示は、脅威情報の警告を参照してください。
トリアージ無効時の判定
トリアージを無効にすると、CVEやパッケージグループに優先度を付けません。 KEV・EPSSの取得と、Hacker Newsの議論リンクの検索も停止します。
スキャンと修正状態の分類は継続します。 有効・無効の設定は設定、表示はトリアージ無効時の並び順を参照してください。