コンテンツにスキップ

KestreLynxの仕組み

KestreLynxは、ある時点のTrivyスキャン結果を、次の2つの方針で通知へ 変換します。

  • 前回のスキャンからの変化 — 既定のdiffモードでSlackチャンネルへ 投稿する内容です。
  • 現在も未解決の脆弱性 — Slack Botを使用する場合のスレッドと、汎用Webhookの ペイロードで確認できます。

毎日すべてのCVEを繰り返すと新しいリスクを見落としやすくなります。一方、変化だけを 通知すると、現在の未解決項目が分かりにくくなります。KestreLynxはこの2つを分けて 扱います。

Dockerホスト
実行中イメージを取得し、重複を除去
各イメージをTrivyでスキャン
イメージ、パッケージ、修正状態ごとに検出結果を集約
CISA KEVとEPSSの情報を付加して優先度を決定
現在の結果と保存済みの状態を比較
    ├── Slackサマリー:前回からの変化
    ├── Slackスレッド:現在の未解決項目
    └── 汎用Webhook:現在の状態と差分を含む構造化データ

1. スキャンの流れ

実行中のイメージを特定する

KestreLynxは、設定されたDockerソケットを通してGET /containers/jsonを呼び出します。 実行中コンテナが使用しているイメージ参照を取得し、重複を除去して並べ替えます。 10個のコンテナが同じイメージ参照を使用している場合でも、そのイメージをスキャンする のは1回です。

KestreLynxコンテナ1つが監視する範囲はDockerホスト1台です。停止中のコンテナと、 ディスクに存在していても実行中コンテナが使用していないイメージは対象外です。

実行中コンテナの一覧を取得できなかった場合、そのスキャン回は終了し、保存済みの状態は 変更しません。次のスケジュールで再試行します。

一意な各イメージをスキャンする

KestreLynxは、一意なイメージごとにTrivy CLIを実行し、JSON形式の結果を取得します。 scan.severityで指定した深刻度をTrivyへ渡します。既定値はHIGH,CRITICALです。

1つのイメージでエラーが発生しても、ほかのイメージのスキャンは続行します。エラーは 通知のスキャン失敗に表示します。また、そのイメージの前回の検出状態を今回も 引き継ぎます。スキャンできなかったイメージを安全とみなすと、誤った「解消」通知が 発生するためです。

パッケージ単位に集約する

Trivyの各行を正規化し、次の単位でパッケージグループを作成します。

イメージ + パッケージ + Trivyの修正状態

この単位に属するCVEの重複を除去してまとめます。グループには、インストール済み バージョン、修正版がある場合はそのバージョン、CRITICALとHIGHの件数、参照URL、 グループ内で最も高い優先度が含まれます。

同じパッケージでも、あるCVEには修正版があり、別のCVEには修正版がない場合などは、 複数の修正状態グループに現れることがあります。

2. 3種類の分類

KestreLynxは、深刻度、修正状態、優先度を別々に扱います。それぞれが示す意味は異なり、 同じものではありません。

分類 情報源 判断する内容
深刻度 Trivyおよびアドバイザリー情報 影響がどの程度大きくなり得るか
修正状態 Trivy 上流で利用可能な修正版があるか
優先度 KestreLynxのトリアージ 悪用シグナルを踏まえて、どの程度急いで確認すべきか

たとえばCRITICALのCVEでも、強い悪用シグナルがなければWatchになる場合があります。 反対にHIGHのCVEでも、CISA KEVへ掲載されていればAct nowになります。

修正状態

KestreLynxは、Trivyのステータスを修正対応の基準となる状態として保持します。

Trivyのステータス KestreLynxでの意味
fixed 修正版が利用できます。
affected 影響を受けますが、まだ修正版がありません。
will_not_fix 上流が修正しないと判断しています。

この修正状態の分類は、汎用Webhookの構造化データにも保持されます。Slackでは通常、 緊急性の高い対応を先に確認できるよう、優先度順に組み替えて表示します。

アップグレード時の注意度

fixedのパッケージには、提示されたバージョン変更の大きさや種類を表す注釈を付けます。

表示 判定方法
ディストリビューションのセキュリティ更新 OSパッケージのバージョンはSemVerではなく、ディストリビューションのリビジョンとして扱います。
比較的安全 言語パッケージのメジャーバージョンが同じ、または小さくなります。
注意が必要 言語パッケージのメジャーバージョンが大きくなります。
不明 言語パッケージのバージョンを確実に解析できません。

これは変更規模の目安であり、更新の安全性を保証するものではありません。実際の更新時は、 リリースノート、アプリケーションとの互換性、テスト結果も確認する必要があります。

ベースOSのサポート終了

イメージのベースOSがサポート終了であるとTrivyが報告した場合、KestreLynxはCVEの 優先度とは別に、EOL baseとして最上部へ表示します。EOLはCVEの優先度では ありません。通常のセキュリティ更新が今後提供されない可能性があるため、サポート中の ベースイメージで再ビルドすることが基本的な対応になります。

3. 悪用情報に基づくトリアージ

トリアージは既定で有効です。KestreLynxは、Trivyが検出したCVE IDへ次の2種類の 情報を付加します。

  • CISA KEVは、実際の悪用が確認された脆弱性を示します。
  • EPSSは、今後30日以内に悪用活動が発生する確率を推定します。影響の大きさを 示すものではなく、監視対象の環境で悪用可能であることを証明するものでもありません。

CVEごとの優先度判定

既定のしきい値では、各CVEを次の順序で分類します。

優先度 条件
Act now CISA KEVに掲載されている、またはEPSSが0.10(10%)以上です。
Watch Act nowではなく、EPSSが0.01(1%)以上、または深刻度がCRITICALです。
Low 上記のどちらにも該当しません。KEVになく、EPSSがしきい値未満のHIGHも含まれます。

EPSSの2つのしきい値は、triage.act_now_epsstriage.watch_epssで変更できます。 EPSSにCVEのスコアがない場合は、0として扱うのではなく、EPSSに関する条件を 判定から除外します。

KEVのランサムウェアキャンペーン情報は根拠として表示しますが、それだけで別の 優先度を作ることはありません。

優先度と修正状態の関係

修正版がない場合でも、強い悪用シグナルを隠さないようにします。

  • Act nowのCVEは、fixedaffectedwill_not_fixのどの状態でもAct nowの ままです。修正版がなければ、通知で緩和策や置き換えの検討を促します。
  • WatchのCVEがwill_not_fixの場合、強い悪用シグナルのない修正不能項目を 対応キューへ残し続けないようLowへ下げます。
  • Lowは修正状態にかかわらずLowのままです。

パッケージグループの優先度は、そのグループに含まれるCVEのうち最も高い優先度です。 完全な優先度表示でAct nowWatchLowの横に表示する件数は、CVE件数では なくパッケージグループの件数です。diffのハートビートでは、同じイメージとパッケージの 修正状態グループをまとめ、現在の最も高い優先度で1件として数えます。

フィードの取得、キャッシュ、プライバシー

KEVとEPSSのフィードは一括でダウンロードし、CVE IDとの照合はローカルで行います。 ホストで検出したCVEの完全な一覧を、これらのサービスへ送信することはありません。 フィードのキャッシュは、state.pathと同じ場所にあるintelディレクトリへ保存します。

  • フィードは約20時間経過すると更新します。
  • 更新できない場合、検証済みのキャッシュを最大7日間使用できます。
  • KEVとEPSSは別々に状態を管理します。片方だけ利用できる場合は、その情報を使って トリアージを続け、利用できない情報源を通知へ表示します。
  • ダウンロードしたデータは検証してから既存のキャッシュと置き換えます。

どちらの情報源も利用できない場合は、縮退トリアージになります。警告を表示し、 CRITICALをAct now、それ以外の選択済み深刻度をWatchとして扱います。悪用情報が 利用できない間は、何もLowへ分類しません。また、その回は優先度上昇の通知を抑止します。 これにより、フィード障害を大量のリスク上昇として誤通知することを防ぎます。

triage.discussion_linksが有効な場合、Act nowと判定済みのCVE IDだけを Hacker Newsの検索APIへ送信します。CVE IDが一致し、20ポイント以上の議論だけを 参照リンクとして追加します。このCVE IDの外部送信を避ける場合はfalseにします。

4. 差分状態と変化の判定

既定のdiffモードでは、state.pathへ履歴を保存します。既定のパスは /var/lib/kestrelynx/state.jsonです。このディレクトリはDockerボリュームで 永続化する必要があります。

イメージとパッケージの組み合わせごとに、次の情報を保存します。

  • 初めて検出した日時
  • CVE IDの集合
  • 1つ以上の修正版が利用可能か
  • 前回のパッケージ最大優先度

EOLを初めて検出した日時と、直近のSlack完全レポートスレッドへの参照は、別に保存します。 状態ファイルは一時ファイルへ書き込んだあと、アトミックに置き換えます。

変化として扱う条件

現在と前回の状態を、次の優先順位で比較します。

変化 条件
新規 イメージとパッケージの組み合わせが前回の状態にありません。
優先度上昇 既知のパッケージの最大優先度が上昇しました。例:WatchからAct now。
CVE追加 既知のパッケージに1つ以上の新しいCVE IDが加わりました。
修正版が利用可能 前回は修正版がなく、今回は1つ以上の修正版があります。
解消 前回保存されていたイメージとパッケージの組み合わせが、成功した今回のスキャン結果にありません。

同じスキャン回で複数の条件が成立した場合、優先順位が最も高い理由だけを表示します。 優先度が下がった場合は変化として通知しませんが、新しい優先度は保存します。その後に 再び優先度が上がった場合は、保存した値を基準に上昇を検出できます。

「解消」は、KestreLynxの現在の対象から検出項目がなくなったことを意味します。 修正版の適用、イメージの変更、コンテナの停止、対象深刻度の変更、スキャナー側データの 変更など、複数の原因が考えられます。「解消」だけでは、パッチの適用を証明しません。

初回実行時や利用可能な状態ファイルがない場合、現在のすべてのパッケージを新規として 通知します。状態ファイルが壊れている場合も同じ扱いになり、警告をログへ出力します。 状態ファイルの形式バージョンが一致しない場合は、互換性のない履歴を解釈せず、 新しい状態として開始します。

状態を更新するタイミング

通知が不要な場合は、計算した新しい状態をそのまま保存します。通知が必要な場合は、 設定したすべての通知先への送信が成功したあとにだけ保存します。送信に失敗した変化は 失われず、次のスキャン回で再通知されます。

複数の通知先を設定した場合は、すべてへの送信を試みます。一部だけ失敗すると、成功した 通知先にも次の回で同じ変化が届く可能性があります。これは厳密な1回限りの配信よりも、 通知を失わないことを優先した動作です。

5. 通知を送信する条件

diffモード(既定)

現在の結果 notify_on_clean: falseの場合の動作
検出項目があり、変化もある 変化と現在の未解決件数を通知します。
検出項目があるが、変化はない 短いハートビートを送り、チャンネルには詳細一覧を繰り返しません。
最後の検出項目が解消した 解消した内容と、未解決項目がないことを通知します。
検出項目がなく、前回から変化もない 通知しません。
1つ以上のイメージでスキャンが失敗した 脆弱性の検出項目がなくても、失敗を通知します。

EOL、Act now、Watchのいずれかで最も古い項目が14日を超えると、ハートビートへ 経過日数と時計マークを表示します。Lowは緊急の滞留とはみなさないため、 ハートビートの経過日数には使用しません。

notify.full_report_dayの曜日(既定は月曜日)には、その回が通知対象であれば、 Slackへ現在の完全レポートも含めます。neverで週次レポートを無効化できます。 notify_on_cleanfalseの場合、週次レポートの曜日であっても、検出項目も変化もない スキャンについて通知を強制することはありません。

fullモード

notify.mode: fullでは差分状態を使用しません。検出項目またはスキャン失敗があれば、 スキャンのたびに現在のレポートを送ります。何も検出されなかった場合の通知は、 notify_on_cleantrueのときだけです。

6. Slackでの表示

SlackメッセージはBlock Kitではなく、通常のmrkdwnテキストで作成します。Slackでいう 「完全レポート」は、全CVEをそのまま列挙するという意味ではなく、現在の状態を示す レポートです。Act nowとWatchは展開しますが、Lowは件数だけにまとめます。省略のない データは汎用Webhookで取得できます。

トリアージが有効な場合、現在のレポートは次の順に表示します。

  1. EOLのベースイメージ
  2. Act now — パッケージの詳細と、最も強いCVEのKEVおよびEPSSの根拠
  3. Watch — 簡潔なパッケージ情報と最も強いシグナル
  4. Low — 件数のみ
  5. スキャン失敗と、脅威情報の鮮度に関する警告

Act nowの参照先には、Trivyの主要アドバイザリー、KEVのnotesにあるベンダー情報、 任意のHacker News議論リンクが含まれる場合があります。Lowの詳細はSlackでは省略し、 完全な一覧は構造化された汎用Webhookで確認できます。

共通ヘッダー

現在、Slackの通知本文とラベルは英語です。すべてのSlackチャンネル通知は、 スキャン時刻と2種類のイメージ件数から始まります。

🛡️ KestreLynx — scan results for 2026-08-16 09:00
4 images scanned, 3 affected
  • images scannedは、その回で検出した一意な実行中イメージ参照の数です。スキャンに 失敗したイメージも含みます。
  • affectedは、対象の脆弱性またはEOLのベースOSがある一意なイメージ数です。 スキャン失敗しかないイメージはaffectedに含めず、Scan failuresへ表示します。
  • 時刻にはプロセスのローカルタイムゾーンを使用します。コンテナではTZ環境変数で 指定します。

チャンネルの差分通知

既定のチャンネル通知は、現在の完全レポートの複製ではなく、変化のレポートです。 該当する項目がある場合、次の順序で表示します。

  1. 共通ヘッダー
  2. 新たに検出したEOLベースイメージ
  3. 脆弱性情報源に関する警告
  4. 新規または変化したパッケージ
  5. 解消したEOLイメージとパッケージ
  6. 週次の現在状態レポート、またはスキャン失敗とOpen now
  7. Bot使用時のみ、今回のスレッドレポートまたは前回のレポートへのリンク

省略した表示例は次のとおりです。

🛡️ KestreLynx — scan results for 2026-08-16 09:00
4 images scanned, 3 affected

🆕 New since last scan (1)
🚨 ghcr.io/example/api:latest
   • openssl 3.0.13 → 3.0.14 (CRITICAL 1 / HIGH 0)  🟢 upgrade: distro security patch — ⬆️ escalated to ACT NOW
     ↳ CVE-2026-12345 CRITICAL · CISA KEV (exploited in the wild) · EPSS 12%

✅ Resolved since last scan (1)
• ghcr.io/example/worker:latest: libxml2

📌 Open now: 🚨 1 act-now / 👀 2 watch / 🔕 8 low
   — oldest act-now/watch unresolved 4 day(s)

📊 Full report in this message's thread ↓

New since last scan (N)のNはCVE件数ではなく、変化したイメージとパッケージの 組み合わせ件数です。新規・変化項目は、優先度、イメージ名、パッケージ名の順で 並べ替えます。

変化がない場合は、次のような本文になります。

No changes since last scan.
📌 Open now: 🚨 1 act-now / 👀 2 watch / 🔕 8 low
🔗 Last full report → thread

未解決項目がない場合、Open nowは次の表示になります。

🎉 Open now: none — all clear

現在状態レポートのレイアウト

fullモード、diff通知内の週次レポート、Bot APIのスレッドは、そのスキャン時点で 未解決の内容を表します。チャンネルへ表示する形式は次のようになります。

Priority: ⛔ 1 EOL base · 🚨 1 act now · 👀 2 watch · 🔕 8 low

⛔ Base OS end-of-life (top priority)
• ghcr.io/example/legacy:latest — base OS is EOL (...)

🚨 Act now (1) — exploited or likely to be
• ghcr.io/example/api:latest
   • openssl 3.0.13 → 3.0.14 (CRITICAL 1 / HIGH 0)  🟢 upgrade: distro security patch
     ↳ CVE-2026-12345 CRITICAL · CISA KEV (...) · EPSS 12%
       📎 advisory · vendor advisory · 💬 HN (120 pts)

👀 Watch (2) — not urgent, keep an eye on
• ghcr.io/example/frontend:latest
   • zlib 1.2.13 (no fix available) (CRITICAL 1 / HIGH 0) — CVE-2026-23456 · EPSS 0.4%

🔕 Low priority (8) — 8 finding(s) across 3 image(s), no exploitation signal (...)

件数が0の優先度と空のセクションは表示しません。Priority行では、修正状態ごとに分かれた パッケージグループを数えます。そのため、同じパッケージのCVEが異なる修正状態で 報告された場合、同じパッケージが複数件として数えられることがあります。

パッケージ行の読み方

修正版があるパッケージ行の形式は次のとおりです。

パッケージ 現在のバージョン → 修正版 (CRITICAL N / HIGH N) 更新ラベル [lang] 変化ラベル

修正版がない場合、矢印と修正版の代わりに(no fix available)を表示します。 CRITICALとHIGHは、そのパッケージと修正状態のグループに含まれる、重複を除いた CVE IDの件数です。[lang]は言語パッケージを示し、通常、付いていないものは OSパッケージです。

パッケージの後ろに表示するラベルの意味は次のとおりです。

実際の表示 意味
🟢 upgrade: distro security patch OSパッケージの修正です。ディストリビューションのバージョンをSemVerとして比較しません。
🟢 upgrade: low-risk 言語パッケージのメジャーバージョンが増えません。安全性を保証する表示ではありません。
🟠 upgrade: major version bump — needs care 言語パッケージのメジャーバージョンが増えるため、互換性を壊す可能性があります。
⚪ upgrade: risk unknown バージョンを確実に解析できません。
[lang] TrivyがOSパッケージではなく言語依存パッケージとして分類しています。
⬆️ escalated to ACT NOW/WATCH 前回から、既知パッケージの最大優先度が上昇しました。
N new CVE(s) 既知のイメージとパッケージに、新しいCVE IDが追加されました。
fix now available 前回は修正版がなく、今回は1つ以上の修正版があります。

緑色の更新アイコンは、提示されたバージョン変更の種類を示します。イメージ、 パッケージ、脆弱性が安全であるという意味ではありません。

判定根拠と参照URLの行

Act nowのパッケージには、最も強いCVEの判定根拠を続けて表示します。

↳ CVE-2026-12345 CRITICAL · CISA KEV (exploited in the wild) · EPSS 12%

最も強いCVEは、優先度、EPSSが取得済みか、EPSSの高さ、CVE IDの順で決まります。 同じパッケージにほかのCVEもある場合、チャンネルではCVEごとに展開せず、 (+N more CVE(s) in this package)と表示します。

判定根拠のラベルには次の意味があります。

ラベル 意味
CISA KEV (exploited in the wild) 利用可能な現在のKEVカタログにCVEが掲載されています。
EPSS N% 現在のEPSS確率です。スコアがない場合はn/a、非常に小さい値は<0.1%、非常に大きい値は>99%と表示します。
🧨 ransomware campaign CISAがランサムウェアキャンペーンでの使用を確認しています。別の優先度ではなく、判定根拠です。
no fix yet, consider mitigation affectedグループに修正版がないため、緩和策の検討が必要です。
upstream won't fix, consider replacing will_not_fixのため、置き換えなど別の対応が必要な可能性があります。
📎 advisory Trivyが提供する主要アドバイザリーURLです。
vendor advisory KEVのnotesから取得したベンダーまたはCISAの参照URLです。
💬 HN (N pts) 条件を満たした任意のHacker News議論とポイント数です。

Watchでは、通常は最も強いCVEとEPSS値だけをパッケージ行の後ろへ簡潔に表示します。 LowはSlackでパッケージごとの詳細を表示しません。

セクション、状態、警告ラベル

ラベル 意味
⛔ EOL base ベースOSがサポート終了です。CVE優先度とは別に管理します。
🚨 Act now 悪用が確認済み、またはEPSSがAct nowのしきい値以上です。
👀 Watch Act nowより弱いシグナルですが、確認・監視する対象です。
🔕 Low 設定したしきい値へ達するシグナルがありません。「脆弱ではない」という意味ではありません。
🆕 New since last scan 新しいパッケージと、内容が変化した既知パッケージを含みます。
✅ Resolved since last scan 現在の対象から消えました。パッチ適用済みを証明する表示ではありません。
📌 Open now 最新スキャン後の未解決項目を件数でまとめたものです。
⏰ oldest ... unresolved 最も古いEOL、Act now、Watchが14日以上残っています。
⚠️ Scan failures その回でスキャンできなかったイメージです。
⚠️ ... data unavailable 一方または両方の悪用情報源を利用できません。
Intel data is N day(s) old 更新に失敗したため、検証済みの古いキャッシュを使用しています。
📋 Weekly full report 設定した曜日に追加する現在状態のレポートです。
📊 Full report in this message's thread Bot APIが、このチャンネルメッセージのスレッドへ現在状態を投稿しました。
🔗 Last full report 新しいスレッドは不要だったため、直近の成功済みレポートを参照します。

✅ Actionable now (fixed)は、トリアージを無効にしたレイアウトだけに表示します。 この場合の「actionable」は修正版が存在するという意味で、トリアージ優先度の Act nowとは異なります。

Slackスレッドの形式

Bot APIのスレッドは📊 Full report — YYYY-MM-DD HH:MMから始まり、EOL、ACT NOW、 WATCH、LOWの順に表示します。Act nowとWatchのパッケージは詳細を展開します。

📊 Full report — 2026-08-16 09:00

🚨 ACT NOW (1) — exploited or likely to be
• ghcr.io/example/api:latest
   • openssl 3.0.13 → 3.0.14 (CRITICAL 1 / HIGH 0)  🟢 upgrade: distro security patch
     ↳ CVE-2026-12345 CRITICAL · CISA KEV (...) · EPSS 12%
       Trivyが提供する短いタイトル
       📎 advisory · vendor advisory · 💬 HN (120 pts)
     also: CVE-2026-20001, CVE-2026-20002
     ⏱ open 4 day(s) — first seen 2026-08-12

🔕 LOW (8) — no exploitation signal

完全な判定根拠とタイトルを表示するのは、最も強いCVEだけです。追加のCVE IDは also:の後ろへ最大8件表示し、残りは(+N more)にまとめます。検出当日は経過日数の 代わりにfirst seen todayを表示します。レポートがメッセージの上限を超える場合、 連続する複数の返信へ分割し、継続するセクション見出しには(cont.)を付けます。

現在のSlackのLowフッターは週次レポートも参照先として案内しますが、週次レポートでも Lowは件数のみです。LowのCVEごとの完全な一覧は汎用Webhookで確認します。

Incoming WebhookとBot APIの違い

機能 Slack Incoming Webhook Slack Bot API
チャンネルへサマリーを投稿 可能 可能
スレッドへ現在のレポートを投稿 不可 可能
変化がない日に前回レポートへのリンクを表示 不可 可能

slack_bot_tokenslack_channelを設定すると、チャンネルは変化を確認する場所になります。 検出結果に変化があった日と週次レポートの日は、そのチャンネルメッセージのスレッドへ 現在の状態を投稿します。変化がない日はスレッドを作り直さず、チャンネルの ハートビートから直近の完全レポートへリンクします。

スレッドではEOL、Act now、Watchを展開します。パッケージごとに、最も強いCVE、 Trivyが提供する場合はタイトル、判定根拠、参照URL、ほかのCVE ID、初回検出からの 経過日数を表示します。Lowは件数だけです。長いレポートはイメージまたは行の境界で 複数の返信に分割します。Slack APIの呼び出しは最大3回試行し、レポートの投稿が 完了した場合だけ新しいスレッド参照を保存します。

Bot APIで初めて通知する場合、通知先チャンネルを変更した場合、または前回の有効な パーマリンクがない場合は、新しい完全レポートスレッドを作成します。これにより、 次回以降のハートビートが参照できる通知先を確保します。

7. 汎用Webhook

notify.generic_webhook_urlは構造化JSONを受け取るHTTPエンドポイントです。どちらの Slack通知方式とも併用できます。Discord、Teamsなど、特定サービス用のメッセージへ 整形する機能ではありません。

通知を送る回では、サマリー件数、EOLイメージ、修正状態ごとのセクション、 パッケージバージョン、更新時の注意度と優先度、CVE IDと判定根拠、スキャン失敗を含む 現在の完全なレポートを送ります。diffモードの場合は、今回の差分も含みます。

トップレベルの構造は次のとおりです。

JSONフィールド 内容
generated_at RFC 3339形式のスキャン時刻です。
summary 全イメージ数と影響イメージ数です。トリアージ有効時は優先度件数と情報源の状態も含みます。
eosl_images ベースOSがEOLのイメージです。
actionable Trivyのステータスがfixedの現在のパッケージグループです。
watch Trivyのステータスがaffectedの現在のパッケージグループです。
wont_fix Trivyのステータスがwill_not_fixの現在のパッケージグループです。
scan_errors イメージごとのスキャン失敗です。
diff diffモードのnewresolved、EOLの変化、最古の未解決日数です。fullモードでは含みません。

各findingには、packageinstalledfixedstatusseverity_countsupgrade_riskpriorityvuln_idsvulns配列が含まれます。各CVEオブジェクトには、 深刻度、タイトル、アドバイザリーURL、KEVとランサムウェアのフラグ、EPSS値、優先度、 参照リンクが含まれる場合があります。EPSSスコアがない場合はnullです。

互換性を維持するため、トップレベルの検出セクションは修正状態を表します。 actionableはTrivyのfixedwatchaffectedwont_fixwill_not_fixです。 これらは、各パッケージに含まれるトリアージのpriorityフィールドとは別のものです。 特に、Webhookのトップレベルにあるwatch配列と、トリアージ優先度のWatchは 同じ意味ではありません。

完全なペイロードを送るのは、前述の通知条件を満たすスキャン回だけです。 notify_on_clean: falseによって省略された、検出項目も変化もないスキャンでは、 Webhookを呼び出しません。

8. トリアージを無効にした場合

triage.enabled: falseにすると、KEV、EPSS、議論リンクの取得を停止します。 Act now、優先度としてのWatch、Lowという分類は行いません。Slackは修正状態に基づく 次の表示へ切り替わります。

  1. EOLのベースイメージ
  2. 修正版あり
  3. 影響あり、上流の修正待ち
  4. 上流では修正予定なし

差分では引き続き、新規、CVE追加、修正版が利用可能、解消を検出します。優先度の 基準を作らないため、優先度上昇の検出は行いません。

9. 複数回のスキャン例

あるイメージのopensslに、EPSS 0.4%でKEVにはないHIGHのCVEが1件あるとします。

  1. 初回スキャンでは、パッケージを新規、優先度をLowとして通知します。
  2. 翌日に結果が変わっていなければ、Slackには未解決件数のハートビートだけを送ります。
  3. 修正版が公開されると、修正版が利用可能としてバージョン変更の注釈とともに 通知します。
  4. 更新を適用する前にCVEがCISA KEVへ追加されると、既知のパッケージであっても Act nowへ優先度上昇として通知します。
  5. コンテナイメージを更新し、そのパッケージが検出されなくなると解消として 通知します。

この流れがKestreLynxの中心です。意味のある変化を通知できるだけの履歴を保持しながら、 調査時に必要な現在の状態も残します。