コンテンツにスキップ

言語ランタイム本体の脆弱性通知の開発

  • 状態: 実装済み(Node.js は本番運用環境、Python は検証用のホストで通知を確認)
  • 開始日: 2026年10月25日
  • 最終更新: 2026年10月25日

目的

公式 node / python イメージのランタイム本体の脆弱性を通知に出す。 npm・pnpm に対応する Node.js と、uv に対応する Python を扱う。

背景

公式イメージでは、Node.js は nodejs.org の tarball から /usr/local/bin/node に、CPython はソースからビルドして /usr/local に配置され、OS パッケージでも言語パッケージでもないため、Trivy が検出しない。 そのため、Node2Shell(CVE-2026-111497)のようなランタイム本体の脆弱性が通知に出ない。

方針

  • イメージ設定と開発元の情報による照合
    • イメージ設定の NODE_VERSION / PYTHON_VERSION を、各言語の開発元が出すセキュリティ情報と照合する
  • 公開データの取得とローカルでの判定
    • 公開データを取得し、スキャン対象のイメージ情報を外へ送らず、KestreLynx 内で判定する

データ源

ランタイム データ源
Node.js nodejs/security-wg の core 索引の版の範囲を使い、未登録の CVE は nodejs.org のセキュリティブログで補い、リリース一覧と nodejs/Release のスケジュールを参照
Python PSF の advisory データベース、CVE の公式レコードにある CPython の版の範囲、python.org のリリース一覧、リリースサイクル

Python は、版の範囲がない2023年半ばより前の CVE は照合しない。

決定事項

  • 検出結果と Sensor の使用判定
    • ランタイム本体は Trivy の種類とは別の node-runtime / python-runtime として扱う
    • Sensor は実行ファイルのパスに対応する実行の証拠で使用中を判定する
  • データ欠損時の照合と記録の保持
    • 必要なデータが取得できないサイクルは、そのランタイムの照合を止め、記録を解消扱いにせず保持し、通知に照合できなかったことを注記する
    • Node.js と Python は別々に扱い、片方のデータだけが欠けても、もう片方は通常どおり照合する
  • 通知と修正の境界
    • 今回は通知だけを対象とし、Dockerfile のベース更新や修正 PR の対象には含めない
    • イメージ設定の版は、実際のバイナリと一致するとは限らない

検証方法

  • 取得した実データによる単体テストで、版の照合と検出結果を確認する
  • Docker と Sensor が稼働する本番運用環境で、Node.js の通知と実行の証拠を確認する
  • Docker と Sensor が稼働する検証用のホストで、Python と Node.js の通知、および Python のデータ欠損時の照合の停止範囲と記録の保持を確認する

検証結果

本番運用環境の Node.js

対象 新規検出 通知の使用状況
フロントエンド Node.js [node-runtime] 22.23.3 → 22.23.4 使用中(実行中)
バックエンド Node.js [node-runtime] 22.23.3 → 22.23.4 使用中(実行中)

既定の重大度 HIGH・CRITICAL で出る CVE は、CVE-2026-105482、CVE-2026-106069、CVE-2026-111497 の3件である。

検証用のホストの Python

python:3.12.14-slim では、既定の重大度で Python runtime 3.12.14 に次の4件が出る。 使用状況は Sensor の実行の証拠により「使用中(実行中)」となる。

CVE 重大度 修正版
CVE-2026-115557 CRITICAL なし
CVE-2026-19445 CRITICAL 3.12.15
CVE-2026-19553 HIGH 3.12.15
CVE-2026-82049 HIGH 3.12.15

同じホストの Node.js も照合され、22.23.1 の Web サービスには既定の重大度で6件が出て、使用状況は使用中となる。 26.12.1 のコンテナには該当する検出結果がない。

Python のデータ欠損時

Python のキャッシュがなく、リリース一覧の取得先が存在しない場合は、Python だけ照合を行わない。 generic webhook の runtime_unchecked には、次の項目が入る。

{"image": "python:3.12.14-slim", "package": "Python runtime"}

Python の4件の記録は保持され、解消扱いにならない。 Node.js は同じサイクルで通常どおり照合される。

既知の制約

  • イメージ設定への依存
    • 対応する NODE_VERSION / PYTHON_VERSION を持たないイメージは照合対象外
    • Node.js では、node バイナリだけを別イメージにコピーしたものや、NODE_VERSION を持たない distroless も対象外
    • イメージ設定の版と実際のバイナリが異なる場合は、イメージ設定の版で照合する
  • Node.js の影響範囲
    • ブログには影響開始の版がないため、系列の途中で入った脆弱性について、その系列の古い版も該当として出ることがある
    • security-wg の範囲に誤りがあれば、その誤りを引き継ぐ
  • Python の古い CVE
    • 2023年半ばより前の CVE は版の範囲がないため照合しない

未検証・次の作業

  • Node.js 本体の修正の扱い
    • FROM node:22-alpine のような浮動タグでは、再ビルドで直ることの提案が候補
    • FROM node:22.23.3-alpine のような固定タグでは、修正版のタグへ書き換える PR が候補
    • どちらの場合も、node バイナリの差し替えをどう確かめるかの決定が必要
  • ほかの言語と古い CVE
    • PHP・Ruby・Java などほかの言語の公式イメージと、古い CVE のための NVD は今後の検討対象

更新履歴

2026年10月25日

  • ランタイム本体の通知と検証

この記事は、KestreLynxの開発記録です。KestreLynxについて