ふくふくHukuhuku LLC
EP.12脆弱性ウォッチ 10分公開:

Node.jsが10件の脆弱性を修正:Brotli・TLSの影響と本番ランタイムの確認手順

Node.js 22.23.4・24.22.1・26.12.1の修正を整理。BrotliのCVSS 9.2とNode.jsのHighの違い、10件の対象系列、CLIと本番を分けた棚卸し・更新確認を解説します。

#セキュリティ#脆弱性#Node.js#Brotli#TLS
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア
ATTENTION:Node.jsを使うサービスは、実際に動くランタイムを確認

10月21日の修正版は22.23.4/24.22.1/26.12.1です。Brotli展開時のコード実行につながる問題を含みます。外部から受け取る圧縮データを処理するサービスは優先して調査し、検証・更新を進めてください。手元のnodeコマンドを更新しただけでは、本番のコンテナや常駐プロセスまで更新されたとは限りません。

Node.jsは、JavaScriptをサーバーや開発用のPCで動かす実行環境です。Node.jsの10月21日付セキュリティ告知は、22・24・26系にまたがる10件のCVEを掲載しています。CVEは脆弱性を識別する番号で、10件すべてが全系列に共通するわけではありません。APIサーバー、バックグラウンド処理、CI、Node.jsを同梱する製品まで対象を棚卸しします。

まず確認する修正版:系列を変えずに対応できる

利用中の系列今回の修正版確認した公式資料
22.x22.23.422系リリースノート
24.x24.22.124系リリースノート
26.x26.12.126系リリースノート

修正版の提供日は2026年10月21日です。22・24系はLTS(長期サポート)、26系は確認時点でCurrentです。この問題の対応のためだけに、22系から26系へ飛び級する必要はありません。運用中の系列に対応する修正版、またはそれ以降の公式な修正を含む版を選びます。各CVEが入り込んだ最初の版は、この告知からは一律に確定できないため記載しません。

サポート終了版は、この表にないから安全ということではありません。Node.jsはセキュリティリリース時にEOL版も影響対象として扱い、サポート中の版の利用を求めています。OSベンダーや製品ベンダーが修正をバックポートしている場合は、上流の番号だけで判断せず、その配布元の勧告とパッケージのリリース番号を確認します。

Brotliの9.2点とNode.jsのHighは、評価元が違う

Brotliはデータを小さくする圧縮方式です。CVE-2026-111497では、細工された圧縮データの展開中に、本来書き込むべき範囲を越えてメモリを書き換える問題が報告されています。Googleが登録したCVEの公式レコードは、停止、情報の露出、任意コード実行の可能性を説明しています。Webを公開しているだけで必ず成立するという意味ではなく、攻撃者が用意したデータが対象のデコーダーへ到達するかが重要です。

評価元・対象評価日付の意味
Node.js Project/Node.jsでの問題High(高)10月21日付の修正告知
Google CNA/BrotliのCVEレコードCVSS v4.0:9.2、Critical(緊急)CVEレコードの公開は10月22日13:35 UTC=22:35 JST

CVSSは技術的な深刻さを評価する指標です。9.2はGoogleがBrotliについて登録した値であり、Node.jsが今回の全10件を9.2と採点したわけではありません。Node.jsの告知は最高深刻度をHighとしています。他の9件の数値スコアは確認したNode.js告知では示されていないため、推測して補いません。

Brotli単体にも1.2.1、1.1.1、1.0.10の修正リリースがあります。ただしNode.js 22.23.4のリリースノートでは修正コミットの取り込みが記載されています。Node.jsに組み込まれたBrotliの表示番号だけで修正の有無を決めず、Node.js本体または配布元の修正履歴を根拠にしてください。

本稿が確認した一次資料では、実際の攻撃への利用は確認できていません。「悪用されていない」と断定するものではありません。確認できたCISA KEVのデータは10月21日更新で、後から公開されたCVEの状況を判断するには限界があります。悪用情報を待ってから棚卸しを始める必要はありません。

10件の違い:圧縮、通信相手の確認、乱数、権限制御

下表のHigh/Medium/LowはNode.jsの個別CVE見出しに従います。系列は修正前の影響対象を示します。概要しか公表されていない項目について、攻撃に必要な全条件を確認できたとは扱いません。

CVE・深刻度影響系列何を確認するか
2026-111497/High22・24・26Brotliデコーダーの範囲外書き込み。外部由来の圧縮データを展開する経路
2026-105482/High22・24・26dns.resolveでNUL文字を含む名前が途中で切れる問題。名前解決へ渡す入力
2026-105483/High24・26全角数字で書かれたIPアドレスとTLS証明書のホスト名確認
2026-106069/High22・24・26緩い解釈でIPアドレスと扱われるホスト名でのTLS検証
2026-105481/Medium22・24・26Keep-alive接続で、リクエスト前に書かれたレスポンスを処理する問題
2026-106072/Medium22・24・26標準的でないIPv4表記と、証明書のDNS名欄によるIP接続先の認証
2026-106074/Medium22・24・26起動スナップショットやSEAに乱数キャッシュが保存され、プロセス間で値が繰り返される問題
2026-106070/Low26ZIPヘッダー検証失敗後にZipFileが攻撃者の指定した先頭バイトを返す問題
2026-106071/Low26Permission Modelのワイルドカード検索によるファイル権限の過剰付与
2026-106073/Low22・24・26fs.realpathSyncによるPermission Modelの回避

TLSのホスト名検証は、暗号化された通信の相手が「接続したかった相手」か確かめる処理です。暗号化していても相手の確認に不備があれば問題になります。一方、乱数の問題はrandomUUID()やrandomInt()のキャッシュを起動スナップショットやSEA(単一実行ファイル形式)へ保存する条件です。あらゆる通常起動のNode.jsで乱数が必ず重複すると一般化しません。

Permission ModelはNode.jsがファイルなどへのアクセスを制限する機能です。使っている場合は権限設定を点検しますが、使っていないことはBrotliやTLSの問題まで対象外にする根拠にはなりません。今回の更新にはc-ares、Undici、CA証明書などの依存部品の対応も含まれます。アプリケーションのnpmパッケージだけを更新して完了にしないことが大切です。

読み取り専用で調べる:CLIと本番を分けて記録する

権限のある環境で、次のコマンドは起動したNode.jsと組み込み部品の版を表示します。process.versionとprocess.versionsの公式仕様に基づく確認例です。設定やパッケージは変更しません。編集部ではローカルで実行し、3つのキーを持つJSONが返ることを確認しました。修正版の攻撃耐性を試験したものではありません。

このコマンドで分かるのは、その場で起動したNode.jsの版。稼働中の全サービスの版ではない。
Bash
node -p 'JSON.stringify({node:process.version,brotli:process.versions.brotli,openssl:process.versions.openssl},null,2)'
確認する場所残す根拠見落としやすいこと
開発PC・CI利用するNode.jsの版と設定ファイル開発PCだけ直してCIに旧版が残る
コンテナ・常駐サービス実行イメージ、配布元、稼働プロセスの起動記録イメージを更新しても古いコンテナが稼働し続ける
サーバーレス・管理型サービス提供元の修正告知と実行ランタイムの適用状況ビルド時のNode.jsとリクエスト実行時の版が違う
Node.js同梱製品製品ベンダーの対象版・修正版OS側のnodeを更新しても製品内蔵版は変わらない

稼働プロセスの版は、既存の起動ログや管理機能など、運用手順で確認できる情報を使います。内部情報を返す公開エンドポイントを新設する必要はありません。npm auditはnpm依存関係の点検と分けて扱い、結果だけでNode.js本体の今回の修正が入ったと判断しません。

更新から確認まで:再デプロイ後の稼働状態を残す

  1. 1サービス名、環境、Node.jsの系列・配布元、責任者を台帳にまとめる。不明な実行環境は対象外ではなく未確認にする。
  2. 2対象系列の公式修正版、または配布元が修正を保証するパッケージを選ぶ。外部由来データのBrotli展開やTLS接続がある処理を優先して検証計画に入れる。
  3. 3試験環境で、通常の圧縮レスポンス処理、外部APIへのTLS接続、バックグラウンドジョブ、使用している権限制御やSEAの起動を確認する。攻撃データを本番へ送る試験はしない。
  4. 4既存の承認された手順で更新・再起動・再デプロイする。コンテナや複数ワーカーは、旧版の稼働個体が残っていないかを確認する。
  5. 5実行版、配布元の修正根拠、適用時刻、回帰確認、未確認事項を保存する。ロールバックで脆弱な版へ戻す場合も対応完了の記録を残したままにしない。

すぐに更新できない場合、外部由来の圧縮データを扱う機能を一時停止・制限できるかを担当者が検討します。ただしBrotliへの対処だけではTLSや乱数などの別の問題は直りません。CDNで圧縮を止めても、アプリケーションが外部APIから受け取るデータの展開など、別経路が残る場合があります。暫定策を全10件の修正と同じ扱いにはしません。

一般のサービス利用者は、サーバーのNode.jsを自分で更新する必要はありません。自社で契約するSaaSや同梱製品について、管理者が提供元の告知・対応状況を確認します。今回の告知だけを根拠に、情報漏えいの発生や全利用者のパスワード変更を断定することもできません。

LLMに渡す、根拠付きの棚卸しプロンプト

以下は編集部が作成した防御点検用の指示文です。機密値を除いた台帳と公式資料を添え、読み取り専用の確認から始めます。LLMの回答をそのまま修正済みの証明にはせず、担当者が稼働環境と照合してください。

匿名化した資産台帳と公式資料を添えるための指示文。

あなたは自社環境の防御点検担当です。提供した匿名化済みの台帳とNode.jsの2026年10月21日付公式告知・系列別リリースノートを使い、読み取り専用の棚卸しをしてください。 22.23.4、24.22.1、26.12.1を今回の修正版として、開発PC、CI、コンテナ、常駐サービス、サーバーレス、Node.js同梱製品を分けて確認してください。CLIで表示した版と実際に稼働する版、上流版と配布元のバックポートを区別してください。Brotliの表示番号だけで修正済み・未修正を断定しないでください。 各行を「対象」「対象外(根拠付き)」「未確認」に分類し、サービス、配布元、稼働版、CVE、利用機能、外部入力の到達経路、修正根拠URL、責任者、確認期限を表にしてください。公表情報にない影響開始版・CVSS・実悪用を推測しないでください。 更新案と回帰確認案を作成し、適用は担当者の判断に分けてください。秘密鍵、トークン、個人情報は要求せず、攻撃再現、外部スキャン、インストール、再起動、設定変更を実行しないでください。

点検指示文をダウンロード。優先順位の決め方は脆弱性のトリアージも参照してください。

確認日:2026年10月23日。公開仕様と公式告知を照合した解説です。版の表示コマンド以外のパッチ適用・脆弱性再現は実施していません。運用の優先順位、台帳、回帰確認の手順は編集上の提案です。

よくある質問

npm auditやnpmパッケージの更新だけで対応できますか?
今回の対象はNode.js本体や組み込み部品です。npm依存関係の点検とは分け、実行ランタイムの修正状況を確認してください。
Node.jsを使っていれば必ず遠隔からコードを実行されますか?
そのようには断定できません。Brotliでは細工されたデータが対象デコーダーへ到達する経路などの確認が必要です。ほかのCVEも利用機能と条件が異なります。
Brotliの版が1.1.0なら、修正済みのNode.jsも危険ですか?
部品の表示番号だけでは判断できません。修正を取り込むバックポートがあるため、Node.jsの修正版または配布元のセキュリティ告知を根拠に確認します。
シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp