「Node.js 脆弱性」で調べる人に向けて、2026年10月21日のセキュリティリリースを一次情報で整理する。最重大は Brotli デコーダの境界外書き込みによるリモートコード実行(RCE・High・CVE-2026-111497)で、合わせて10件が修正された。Critical はなく、各系の最高は High だ。やることは一つで、自分の Node.js の版を確かめて修正版に上げる。この記事は、どの版に上げるのか・自分の版の確かめ方・npm audit との役割の違いといった迷いやすい点を、公式の一覧だけを根拠に整理する。なお一般のニュース記事には公式と食い違う CVE 番号が出ているので、番号は公式ページで確認してほしい。

FIXED VERSIONS修正版

対象は 26.x・24.x・22.x の3系。Critical は無く最高 High

26.12.1

26.x 系

Latest Release

24.22.1

24.x 系

Latest LTS

22.23.4

22.x 系

Maintenance LTS

出典: Node.js Security Releases, 2026-10-21(nodejs.org/en/blog/vulnerability)

30秒でわかる(2026-10-21時点)

  • ・対象:Node.js 26.x・24.x・22.x の3系と、サポートの切れた EOL 系
  • ・最重大:Brotli デコーダの境界外書き込み → RCE(High・CVE-2026-111497)
  • ・修正版:26.12.1 / 24.22.1 / 22.23.4。全10件がこの版で直る
  • ・確かめ方:node -v の値を系の修正版と比べる(npm audit では分からない)

まずやること

  • ・自分で直す(アプリ・CI・コンテナを動かしている人):稼働中の各環境で node -v を出し、系の修正版未満なら上げて再起動する
  • ・提供元を待つ(マネージドな実行環境を使っている人):Node.js の版を自分で選べない PaaS やサーバーレスでは、基盤側の更新告知を確認する。反映の前後で動いている版が変わったかを見る

今回は特定サービスの侵害ではなく、Node.js 本体の定例セキュリティリリースだ。依存の鎖がどこで切れるかという全体像はサプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説にまとめている。

2026年10月のNode.js 脆弱性で直るもの

公表日は2026年10月21日で、各系のリリースは同日以降に順次提供される。公式の発表によると、修正版は3つだ。26.x 系が 26.12.1(Latest Release)、24.x 系が 24.22.1(Latest LTS)、22.x 系が 22.23.4(Maintenance LTS)。Critical はなく、3系いずれも最高は High だった。

注目を集めるのは Brotli の RCE だが、一つの番号に対処する話ではない。同じリリースで TLS やDNSの検証バイパス、暗号の値の反復、権限モデルの穴など、性質の違う10件がまとめて直る。番号ごとに個別対応するのではなく、系の修正版へ一度に上げるのが筋だ。

BELOW THE HEADLINE見出しの下

最重大は Brotli の RCE(CVE-2026-111497)。下にまだ9件ある

まず目に入る: Brotli の RCE

同時に直る:

  1. TLS/DNS の検証バイパス 3件(High)
  2. 暗号値の反復・keep-alive の応答取り違え 3件(Medium)
  3. Permission Model の過剰付与・バイパス 3件(Low)

全10件が同じ修正版で直る。番号ごとに対処しない

出典: Node.js Security Releases, 2026-10-21

最重大の CVE-2026-111497 は、Brotli デコーダの境界外書き込みで、公式は「リモートコード実行を許す」と記している。Brotli は Node.js に組み込まれた圧縮方式で、zlib.brotliDecompress などから使われる。攻撃が成り立つ前提は、攻撃者が細工した Brotli 圧縮データを、アプリが展開する経路に流し込めることだ。たとえば外部から受け取った圧縮済みの応答やアップロードを復号する処理が該当しうる。具体的な再現手順やペイロードは公式も公開しておらず、本記事でも扱わない。確実なのは、修正版に上げれば直るという一点だ。

どのNode.js 脆弱性があるか|深刻度順の一覧

公式ページの表を深刻度順に並べ直したものが下の一覧だ。二次ソースは番号が食い違うため、ここでは公式の表記だけを載せる。

CVE 内容 深刻度 対象ライン
CVE-2026-111497 Brotli デコーダの境界外書き込みで RCE High 26 / 24 / 22
CVE-2026-105482 dns.resolve が NUL を含む名前を切り詰める High 26 / 24 / 22
CVE-2026-106069 ホストが緩く IP に解決されるとき TLS ホスト名検証をバイパス High 26 / 24 / 22
CVE-2026-105483 IP が全角数字のとき TLS ホスト名検証をバイパス High 26 / 24
CVE-2026-105481 keep-alive ソケットが送信前に書かれた応答を処理 Medium 26 / 24 / 22
CVE-2026-106072 非正規 IPv4 ホスト名で DNS SAN が IP 端点を認証 Medium 26 / 24 / 22
CVE-2026-106074 randomUUID/randomInt のエントロピーが起動スナップショット/SEA に保存され値が反復 Medium 26 / 24 / 22
CVE-2026-106073 Permission Model を fs.realpathSync でバイパス Low 26 / 24 / 22
CVE-2026-106070 ZipFile が検証失敗後に攻撃者制御のプレフィックスを返す Low 26 のみ
CVE-2026-106071 Permission Model がワイルドカードで過剰付与 Low 26 のみ

High の4件は、RCE のほかはいずれも「本来はじくべき通信を通してしまう」系だ。TLS のホスト名検証やDNSの名前解決が、全角数字のIPや緩いIP解決といった端のケースで欺かれる。暗号側の Medium では、crypto.randomUUID() や randomInt() の乱数が、起動スナップショットや単一実行可能アプリ(SEA)に焼き込まれると、どのプロセスでも同じ値を返してしまう。Low の3件は、--permission で絞ったはずのファイルアクセスが抜けるもので、権限モデルを使っている環境だけが関係する。性質はバラバラだが、対処は同じ修正版への更新で足りる。

自分のNode.jsは該当するか|node -v と修正版の比較

判定は難しくない。動いている Node.js 本体の版を出し、その系の修正版と比べるだけだ。

node -v                            # 動いている Node.js 本体の版
node -p "process.versions.node"    # スクリプトからも同じ値が取れる
node -p "process.versions.openssl" # 同梱された OpenSSL の版(依存更新の確認に)

たとえば v22.22.0 と出たなら、22.x 系の修正版 22.23.4 より小さいので対象だ。各系のしきい値は、26 系なら 26.12.1、24 系なら 24.22.1、22 系なら 22.23.4。これ未満なら上げる。サポートの切れた 20 以前などの EOL 系は、修正が出ないため常に対象で、まずサポート対象の系へ移す。

ここで誤解が多いのが npm audit との関係だ。

npm audit   # package-lock.json の依存を調べる。Node.js 本体の CVE は出ない

npm audit はプロジェクトの依存パッケージを npm の勧告データベースと照合する道具で、実際に古い依存を入れた環境で走らせると、その依存の勧告(たとえば lodash のプロトタイプ汚染など)は列挙するが、今回の CVE-2026-* のような Node.js ランタイム本体の番号は一件も出ない。ロックファイルが無いと This command requires an existing lockfile で止まり、そもそも依存を見る前提のコマンドだと分かる。つまり本体の該当は node -v で、依存の該当は npm audit でと役割が分かれている。

もう一点、node -v が答えるのは「このシェルで呼ばれた Node の版」だけで、これだけではホスト全体が安全とは言えない。nvm で複数の版を入れていれば別の版が残っているかもしれないし、which node が指す実体やコンテナ内の版は別に確かめる必要がある。これは脆弱性の判定ではなく、動いている版の確認だと捉えるのが正しい。陽性(修正版以上と出た)でも、同じホストの別プロセスが古い版で動いていれば危険は残るし、陰性(古いと出た)でも、そのプロセスが外部入力を一切 Brotli 展開しないなら Brotli RCE の実害は限定的、という具合に、版の表示だけでは実害の有無までは確定できない。

HOW TO CHECK確かめ方

判定は node -v と修正版の比較。npm audit ではない

  1. node -v

    動いている版を出す

  2. 系の修正版と比べる

    26→26.12.1 / 24→24.22.1 / 22→22.23.4

  3. 未満なら対象

    EOL 系は常に対象

  4. 上げて再起動

    更新後に再起動・再デプロイ

出典: Node.js Security Releases, 2026-10-21(判定手順は本文で実測)

アップデートの段取り

上げ方は環境ごとに違うが、順番は共通だ。稼働している各環境で版を確かめ、修正版へ上げ、プロセスを再起動する。

バージョン管理ツールを使っているなら、同じ系の修正版を入れて既定に切り替える。

nvm install 22.23.4          # nvm の場合。入れたい系の修正版を指定する
nvm alias default 22.23.4    # 既定を修正版に向ける

Docker で動かしているなら、ベースイメージのタグを修正版に固定し、イメージを作り直してデプロイする。node:22(移動するタグ)でも次の docker build で新しいパッチを拾うが、node:22.23.4 のように固定しておくと、どの版で動いているかが Dockerfile から読める。CI では、ランナーに入っている Node の版(GitHub Actions の setup-node の node-version など)も同じしきい値で見直す。

更新で見落としやすいのが再起動だ。バイナリを入れ替えても、すでに起動しているプロセスはメモリ上の古いコードで動き続ける。pm2・systemd・コンテナのいずれでも、更新後に再起動(またはローリングデプロイ)してから、もう一度 node -v で稼働中の版を確かめる。手順の細部や各OSのインストーラは公式のダウンロードとリリーススケジュールに従ってほしい。

段取りの要点

  • ・稼働中の各環境(本番・CI・開発コンテナ)で node -v を出す
  • ・系の修正版(26.12.1 / 24.22.1 / 22.23.4)以上へ上げる。EOL 系はサポート対象へ移す
  • ・プロセスを再起動・再デプロイし、反映後の版をもう一度確認する

EOLラインと依存の更新(eMudhra の CA 危殆化ほか)

EOL(サポート終了)の系は、セキュリティリリースのたびに常に影響を受ける側に入る。修正が出ないため、node -v が古い系を指しているなら、まずサポート対象の系へ移すのが先だ。

今回のリリースには、Node.js に同梱された依存の更新も含まれる。c-ares・OpenSSL(24/22)・SQLite(22)・Undici(26/24/22)に加え、eMudhra 中間CAの危殆化に対応した CA 証明書(ca-cert)の更新が 26/24/22 に入っている。これは Node.js が同梱するルート証明書の束から、信頼できなくなった中間CAを外すもので、更新しないと問題の証明書チェーンを古い信頼のまま扱い続けることになる。中間CAが失効・危殆化したときに自分のTLS接続がどう影響を受けるかは中間CAの危殆化・失効で自分のサイトの証明書はどうなる?確認手順とeMudhra事例で扱っている。同梱依存の版は node -p "process.versions.openssl" のように確かめられる。

なお、本体の更新と依存パッケージの棚卸しは別の作業だ。アプリが抱える npm 依存の脆弱性をどの順で直すかはnpm audit の結果はどれから直す?依存関係の脆弱性を到達性・EPSS・KEVで仕分ける実践手順に、本体ではなく周辺の層で詰まりやすい話はReact 脆弱性の多くは本体ではない|XSS・依存・SSR・古い版の4層を実測で整理する付き合い方にまとめた。

この記事の結論

  • ・最重大は Brotli の RCE。だが対処は10件まとめて、系の修正版への更新で足りる
  • ・本体の該当は node -v と修正版の比較で見る。npm audit には出ない
  • ・上げたら再起動まで確認する。EOL 系はサポート対象へ移す

参照ソース

・Node.js Security Releases: Wednesday, October 21, 2026(公式) — CVE 一覧・修正版・依存更新(2026-10-21時点)
・nodejs/node Release Schedule(公式) — 各系のサポート状況と EOL