新しい系列での解消確認の開発
- 状態: 実装済み(手元での検証まで)
- 開始日: 2026年10月29日
- 最終更新: 2026年10月29日
目的
固定タグの修正候補は、同じ系列(同じ major・minor)の最新パッチだけから選ぶ。 系列が終わっている場合や、新しいパッチでも直らない場合は、通知が「新しい版待ち」のままで、新しい minor で直るかは利用者が自分で調べる必要があった。
その手間を減らすため、新しい minor・major の最新版で所見が解消するかを最大2つの版で調べ、解消する版があれば修正計画とカードで知らせる。 互換性は確かめられないため、新しい系列へ更新する PR は作らない。
方針
- 同じ系列の最新パッチから修正候補を選ぶ規則は変えない
- 新しい系列の候補も、同じ系列の候補と同じ方法で比較する
決定事項
対象と調べる版
対象は、配布イメージの固定タグと、対応付けた Dockerfile の固定タグの FROM とする。
同じ系列に新しいパッチがない場合、新しいパッチが現在と同じ内容の場合、新しいパッチでも対象の所見が解消しない場合に調べる。
| 順番 | 調べる版 |
|---|---|
| 1つ目 | 同じ major で minor が新しい版のうち最新版 |
| 2つ目 | 新しい major の版のうち最新版 |
間の minor は調べないため、確認した版で直らなくても「修正版がない」とは言わない。 同じ系列の候補で一部が解消し、PR の候補になった項目の残りの所見は対象に含めない。
- 同じ major の候補がなければ、新しい major の候補から調べる
- 1つ目ですべて解消して新しい所見も増えなければ、2つ目は調べない
- 1つ目が一部解消、新しい所見の増加あり、または未解消なら、2つ目も調べる
- 1つ目を確認できなかった場合は、2つ目へ進まない
比較と表示する候補
判定は比較の判断の種類から作らず、対象ごとの結果から作る。 解消した件数と新しく増えた所見を分けて扱い、判断できない対象や比較元で検出されない対象が1件でもあれば「直る」とは言わない。
| 比較結果 | 扱い |
|---|---|
| すべて解消し、新しい所見の増加なし | 全部解消 |
| 一部が解消し、新しい所見の増加なし | 一部解消 |
| 1件以上が解消し、新しい所見や KEV 掲載の所見が増加 | 解消と増加を併記し、要判断 |
| 解消した対象が0件 | 未解消 |
| 判断できない対象や比較元で検出されない対象あり | 確認できない結果として扱い、表示する候補に選ばない |
表示する候補は、全部解消して増加のない版を優先する。 それがなければ解消件数が多い版を選び、同数なら増加のない版、それも同じなら先に調べた版を選ぶ。
Dockerfile は稼働イメージごとに現在と候補のベースを比較し、同じ候補について結果を集約する。 この比較はベースイメージどうしの比較であり、再ビルド後のイメージやアプリケーションの互換性は未確認とする。
修正計画とカードでの案内
修正計画は、イメージやファイルごとに更新の提案を並べる「🔧 修正計画」のメッセージで、新しい系列で直る版があるときだけ「新しい系列」の行を出す。
カードは、脆弱性の通知のスレッドでパッケージごとに所見を示す部分で、新しい系列の結果を対応:の行に出す。
修正計画の行には「互換性は未確認」と添える。
| 場面 | 表示例 |
|---|---|
| 修正計画で全部解消 | 新しい系列: nginx 1.24.1 → 1.27.3 (minor の更新、所見1件が解消、互換性は未確認) |
| 修正計画で一部解消 | 新しい系列: nginx 1.24.1 → 1.27.3 (minor の更新、所見2件中1件が解消、互換性は未確認) |
| 修正計画で Dockerfile のベースを比較 | 新しい系列: ベースイメージ python 3.11.9-slim → 3.13.1-slim (minor の更新、所見2件が解消、ベースの比較、再ビルド後は未確認、互換性は未確認) |
| 修正計画で新しい所見が増える場合 | 要判断: 新しい系列の nginx 1.24.1 → 2.0.1 で所見1件が解消、新たな所見2件 (major の更新、互換性は未確認) |
カードでは、そのカードに含まれる所見の結果を、検出件数:の次の対応:行に示す。
| 場面 | 表示例 |
|---|---|
| カードの所見が元イメージで解消 | 対応: 元イメージ python 3.11.9 → 3.13.1 で解消(minor の更新、同じ系列に新しい版なし、ベースの比較) |
| カードの所見が配布イメージで一部解消 | 対応: イメージ nginx 1.24.1 → 1.27.3 で一部解消(2件中1件、minor の更新、同じ系列に新しい版なし) |
| カードの所見が確認した版でも未解消 | 対応: イメージ nginx 1.24.1 の新しい版待ち(確認した 1.27.3 と 2.0.1 でも未解消) |
| 同じ系列にも条件に合う新しい系列にも新しい版なし | 対応: 元イメージ python 3.11.9 の新しい版待ち(同じ系列にも、条件に合う新しい系列にも新しい版なし) |
新しい系列でも直らない場合は、カードの対応:の行が「確認した版でも未解消」に変わるだけで、修正計画のメッセージには出さない。
この行が変わったことだけでは、スレッドの詳細報告を送り直さず、次に所見が変わったときか週次の全体報告で届ける。
検証方法
単体テスト
- 版の選び方、次の候補へ進む条件、表示する候補の優先順位を確認
- 対象ごとの結果と新しい所見の増加による分類を確認
- Dockerfile の稼働イメージごとの比較結果の集約を確認
- 修正計画の通知行、カード、Webhook と送信判定を確認
結合テストの環境
手元の Docker・Trivy・Docker Hub を使い、次の2つの対象で確認した。
| 対象 | 構成 |
|---|---|
| 配布イメージ | aquasec/trivy:0.71.2 をそのまま動かしたコンテナ |
| Dockerfile のベース | FROM aquasec/trivy:0.71.2 の Dockerfile から作ったコンテナ |
結合テストの確認範囲
同じ系列の候補の有無、新しい系列の候補選択、スキャンによる比較、レジストリ要求の回数を確認した。 修正計画の Slack の行とカードの行は、結合テストで得た計画と所見から描画して確認した。
検証結果
2026年10月29日の手元での検証結果を示す。
候補と解消状況
| 確認項目 | 結果 | 実装にとっての意味 |
|---|---|---|
| 候補の選択 | 0.71.2 の系列に新しいパッチはなく、新しい系列の候補は 0.76.1 の minor 更新だけで、新しい major はなし |
同じ系列で候補がなくても、新しい系列の確認へ進める |
| 配布イメージと Dockerfile のベース | どちらも対象の所見56件中53件が解消し、新しい所見の増加はなし | 両方の対象で一部解消を判定できる |
| 残る所見 | brotli-libs の CVE-2026-111497 は 0.76.1 でも未解消 |
全体の解消件数だけで、個々の所見も直るとは扱わない |
修正計画とカードの表示
| 表示箇所 | 確認した表示 |
|---|---|
| 配布イメージの修正計画 | 新しい系列: aquasec/trivy 0.71.2 → 0.76.1 (minor の更新、所見56件中53件が解消、互換性は未確認) |
Dockerfile のベースに残る brotli-libs のカード |
対応: 元イメージ trivy 0.71.2 の新しい版待ち(確認した 0.76.1 でも未解消、ベースの比較) |
| 配布イメージで解消する所見のカード | 対応: イメージ trivy 0.71.2 → 0.76.1 で解消(minor の更新、同じ系列に新しい版なし) |
修正計画では一部解消する版を知らせ、カードでは残る所見と解消する所見を分けて示せた。 これにより、利用者は更新で解消する範囲と、引き続き新しい版を待つ対象を区別できる。
未検証・次の作業
- すべて解消する
resolvesの実例での確認 - タグの多いリポジトリで、全体の一覧の取得が上限に収まるかの確認
- 本番運用環境と検証用のホストでの動作確認
更新履歴
2026年10月29日
- 新しい系列の最大2つの版を比較し、解消状況を修正計画とカードで知らせる仕組みの実装
- 対象ごとの判定、通知の届け方の記録
- 配布イメージと Dockerfile のベースでの結合テストの結果と未検証の範囲の記録
この記事は、KestreLynxの開発記録です。KestreLynxについて