言語ランタイム本体の脆弱性通知の開発
- 状態: 実装済み(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 は実行ファイルのパスに対応する実行の証拠で使用中を判定する
- ランタイム本体は Trivy の種類とは別の
- データ欠損時の照合と記録の保持
- 必要なデータが取得できないサイクルは、そのランタイムの照合を止め、記録を解消扱いにせず保持し、通知に照合できなかったことを注記する
- 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 には、次の項目が入る。
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について