コンテンツにスキップ

言語ランタイム本体の修正計画の開発

  • 状態: 実装済み(本番運用環境と検証用のホストで確認)
  • 開始日: 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 など)、デプロイし直す」と案内する
  • サポート終了の系列
    • 修正版がないイメージには修正計画の項目が作られないため、系列を上げる案内は通知の検出結果の注記に載せる
    • 注記は「サポート終了(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について