言語ランタイム本体の修正計画の開発
- 状態: 実装済み(本番運用環境と検証用のホストで確認)
- 開始日: 2026年10月25日
- 最終更新: 2026年10月26日
目的
公式 node / python イメージのランタイム本体の脆弱性について、直し方を修正計画に出す。
言語ランタイム本体の脆弱性通知の開発に続き、検出結果をベース更新や再ビルドの案内につなげる。
背景
ランタイム本体の検出結果はイメージ設定の版から作るため、由来するレイヤーの情報がなく、従来の Dockerfile のベース更新の修正計画では対象にならなかった。 直し方は、Dockerfile のタグ指定と系列のサポート状況で変わる。
| 指定・状況 | 直し方 |
|---|---|
版を固定したタグ(FROM node:22.23.3-alpine) |
修正版のタグへ書き換える |
浮動タグ(FROM node:22-alpine) |
書き換える行はなく、更新されたベースを取り直して再ビルドする |
| サポート終了の系列(Node.js 18 など) | 同じ系列には修正版が出ないため、系列を上げる |
方針
- 既存のベース更新への反映
- 新しい修正の経路は作らず、既存の Dockerfile のベース更新の判定にランタイム本体の情報を足す
- 通知の注記による案内
- 浮動タグには再ビルドの見込みを示し、サポート終了の系列には手動で系列を上げる必要があることを示す
データ源
| 情報 | 用途 |
|---|---|
| 稼働イメージと現在のベースのレイヤー列・イメージ設定 | レイヤーの対応と NODE_VERSION / PYTHON_VERSION の一致を確認 |
| 現在のベースと候補のランタイムの版・各言語の開発元のセキュリティ情報 | 既存のランタイム照合を使い、候補との比較や再ビルドの見込みを算出 |
決定事項
- 版を固定したタグでの帰属と比較
- 現在のベースのレイヤー列が稼働イメージの先頭と順序も含めて一致し、両者のイメージ設定の
NODE_VERSION/PYTHON_VERSIONが対象のランタイムについて同じなら、その検出結果をベース由来とする - 現在のベースと候補の比較ではランタイムも照合し、どちらかの側で照合できなければ候補を採用しない
- 現在のベースのレイヤー列が稼働イメージの先頭と順序も含めて一致し、両者のイメージ設定の
- 浮動タグの再ビルドの見込み
- ベースを確認できない場合、現在のベースのランタイムの版を引き継ぐと、検出中の CVE のうち何件が出なくなる見込みかを通知する
- 完成イメージの比較ではなく、新しい版で増える CVE は数えず、判定も変えない
- generic webhook の
rebuild_runtimesにも、稼働版・ベースの版と、出なくなる見込みの CVE・残る CVE を載せる
- ビルド方法に応じた案内
- Compose の
buildから Dockerfile を見つけた場合は、docker compose build --pullを案内する - 設定の対応付けだけで Dockerfile を見つけた場合は、CI などでのビルドを想定し、「ベースを取り直して再ビルドし(
docker build --pullなど)、デプロイし直す」と案内する
- Compose の
- サポート終了の系列
- 修正版がないイメージには修正計画の項目が作られないため、系列を上げる案内は通知の検出結果の注記に載せる
- 注記は「サポート終了(EOL): この系列には修正版が出ないため、系列を上げる必要がある(手動)」とする
詳しい条件はベースレイヤーの照合、案内の読み方は再ビルドの案内にまとめている。
検証方法
- 単体テストで、ランタイムの帰属と候補の比較、再ビルドの見込み、サポート終了の注記を確認する
- 本番運用環境で、浮動タグを使うイメージの修正計画と再ビルドの案内を確認する
- 検証用のホストで、版を固定したタグを使うイメージのベース照合から PR の作成まで確認する
検証結果
本番運用環境の浮動タグ
フロントエンドとバックエンドは、どちらも FROM node:22-alpine を使い、CI でビルドしている。
両方の修正計画に、CI 向けの再ビルドと再デプロイの案内、および次の見込みが出た。
現在の node:22-alpine の Node.js は 22.23.4。この版を引き継げば、検出中の Node.js 22.23.3 の 3 件のうち 3 件は出なくなる見込み(再ビルド後のイメージは未確認)
対象の3件は、CVE-2026-105482、CVE-2026-106069、CVE-2026-111497 である。
検証用のホストの固定タグ
検証用のリポジトリに FROM node:22.23.3-alpine の Dockerfile を置き、同じ Dockerfile でビルドしたイメージを動かした。
ベースの4層が稼働イメージの先頭と一致し、NODE_VERSION も同じため、Node.js の検出結果がベース由来になった。
候補 node:22.23.4-alpine との比較結果は次のとおりである。
| 比較対象 | 結果 |
|---|---|
| Node.js 本体の3件 | 解消 |
| ベースに含まれる npm 配下のパッケージの9件 | 残存 |
| 新たに入る検出結果 | 0件 |
FROM を node:22.23.4-alpine に書き換える PR が作られ、PR 本文の「解消」に Node.js の3件が載った。
generic webhook にも PR の作成が出た。
検証用のホストでの追加確認
| 確認内容 | 結果 |
|---|---|
| Python の固定タグ | FROM 更新 PR を作成(Python 本体の3件を解消) |
| Python の浮動タグ | 4件中3件が出なくなる見込み |
| サポート終了の系列(Node.js 18/20、Python 3.8/3.9) | 系列を上げる注記を表示 |
Compose の image:・Kubernetes のマニフェストのタグ更新 |
PR を作成(Node.js・Python 本体の各3件を解消) |
| ホストでビルドしたイメージ(Docker Official Image の名前で、Docker Hub が初回の匿名アクセスを拒否) | ローカルビルドとして除外(Dockerfile のベースも同じ) |
既知の制約
- イメージ設定と実行ファイルのずれ
- 上のレイヤーで
node/pythonの実行ファイルだけを差し替えていても、版の環境変数が同じなら区別できない - Dockerfile でランタイムを入れ直す場合や、
ENVで版を上書きする場合は、再ビルドの見込みが外れることがある
- 上のレイヤーで
- 再ビルド後の確認範囲
- 浮動タグの見込みは、再ビルド後のイメージを確認した結果ではない
- Docker Hub の認証情報とローカルビルドの判定
- 認証情報を設定すると、ホストでビルドしたイメージも非公開リポジトリと区別できず、レジストリへのログインが必要と表示される
未検証・次の作業
- ローカルビルドの判定に使わない拒否
- 403、リダイレクト後の拒否、応答成功後の拒否を判定に使わないことは単体テストでのみ確認
- ほかの言語
- PHP・Ruby・Java などのランタイム本体への対応は今後の検討対象
更新履歴
2026年10月26日
- 検証用のホストでの追加確認
2026年10月25日
- 実装と、本番運用環境・検証用のホストでの確認を記録
この記事は、KestreLynxの開発記録です。KestreLynxについて