コンテンツにスキップ

新しい系列での解消確認の開発

  • 状態: 実装済み(手元での検証まで)
  • 開始日: 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について