開発ノウハウセキュリティ速報解説

2026年10月発表のNode.jsの脆弱性10件|原因・影響と修正版への更新手順


Node.jsのプロジェクトは2026年10月21日、サポート中の3つのメジャーバージョンに向けたセキュリティリリースを公開しました。修正された脆弱性は10件で、最も高い深刻度は「高(High)」です。修正コミットを読むと、原因はBrotli形式の展開処理やTLSのホスト名検証など、Node.js本体と同梱ライブラリの複数のモジュールに分かれています。原因が本体の側にあるため、アプリやフレームワークを更新しても直りません。修正版は22.23.4・24.22.1・26.12.1で、OSのパッケージで入れている場合は、OSの修正済みパッケージへ更新します。

公開2026.10.22
最終更新2026.10.22
読了 25 分 / 約12,000字
この記事をシェアポスト
開発ノウハウNode.jsセキュリティリリース

2026年10月発表
Node.jsの脆弱性10件

2026年10月21日、Node.jsのプロジェクトは22.x・24.x・26.xの修正版(22.23.4・24.22.1・26.12.1)を、セキュリティリリースとして公開しました。公式発表の概要は次のとおりです。

The Node.js project will release new versions of the 26.x, 24.x, 22.x releases lines on or shortly after, Wednesday, October 21, 2026 in order to address security vulnerabilities. The highest severity issue fixed in this release is HIGH.

意訳
Node.jsプロジェクトは、脆弱性に対処するため、26.x・24.x・22.xの新しいバージョンを2026年10月21日(水)以降すみやかに公開します。今回のリリースで直す問題のうち、最も高い深刻度はHIGH(高)です。
Node.js公式「Wednesday, October 21, 2026 Security Releases」(2026年10月21日)

Node.jsは、サーバーでJavaScriptを動かすための実行環境です。今回の10件は、Node.js本体のモジュールと、本体に同梱しているライブラリの両方に及びます。

C
結論
原因はNode.js本体と同梱ライブラリ、アプリの更新では直らない脆弱性
  • 原因:同梱のBrotli(圧縮データの展開)、TLSのホスト名検証(lib/tls.js)、DNSの問い合わせなど、複数のモジュールにあります。修正は修正版のリリースノートに、Node.js本体と同梱ライブラリの変更として記録されています。
  • 対象:22.x・24.x・26.xの修正前のバージョンと、サポートが終わったバージョン(25.x・20.x以前など)です。外部と通信するサービスは、ほぼ当てはまります。
  • やること:Node.jsを22.23.4・24.22.1・26.12.1以降か、OSの修正済みパッケージに更新します。確かめ方は04章、更新手順は05章で整理しています。

01.根本原因と原因のモジュール

この章の要点01 / 9

本体の6つのモジュールと同梱のBrotliにある10件の原因

  1. 重いのは圧縮の展開と証明書の確認同梱のBrotliと、TLSのホスト名の照合
  2. 入力の読み方の食い違いが4件ホスト名の表記やNUL文字を、確かめる側と使う側で別に読んでいた
  3. 直すのはNode.js本体の更新アプリやフレームワークの更新では解消しない

10件の原因は1か所ではありません。修正コミットから原因の場所を並べると、Node.js本体の6つのモジュールと、同梱するBrotliの展開処理に分かれます。

モジュール(ソースの場所)担っている処理原因CVE番号(深刻度)
同梱のBrotli(deps/brotli/c/dec/decode.c)圧縮データの展開不正なブロックの切り替えを見逃し、メモリの範囲外に書き込むCVE-2026-111497(高)
TLS(lib/tls.js の checkServerIdentity)証明書のホスト名検証変換して初めてIPアドレスになる表記を、名前として証明書と照合するCVE-2026-105483(高)・106069(高)・106072(中)
DNS(lib/internal/dns/)dns.resolve などの問い合わせ名前の途中のNUL文字で、それ以降が切り捨てられるCVE-2026-105482(高)
HTTP(lib/_http_agent.js)keep-alive接続の使い回し未読のデータが届いた接続を、確かめずに使い回すCVE-2026-105481(中)
乱数(lib/internal/crypto/random.js)randomUUID() などの乱数のキャッシュ起動スナップショットにキャッシュが残るCVE-2026-106074(中)
ZIP(lib/internal/zip/entry.js)ZIPの読み込み(26.xのみ)検証に失敗したヘッダーの情報がキャッシュに残るCVE-2026-106070(低)
権限モデル(src/permission/fs_permission.h・lib/fs.js)ファイルアクセスの制限ワイルドカードの照合の誤りと、realpathSync の確認漏れCVE-2026-106071(低)・106073(低)

このほか、同梱ライブラリ(undici・c-ares・OpenSSLなど)の更新による修正もあります。こちらは03章で扱います。

Brotliの展開処理の範囲外書き込み

Brotliは、Webの通信でよく使われる圧縮形式の1つです。Node.jsは展開処理のライブラリを本体に同梱しており、標準のzlibモジュールから使えます。公式発表は、このCVE-2026-111497を次の見出しで挙げています。

Node.js Brotli decoder out-of-bounds write permits remote code execution (CVE-2026-111497) - (high)

意訳
Node.jsのBrotliの展開処理(デコーダー)の範囲外書き込みにより、遠隔からのコードの実行が可能になる(CVE-2026-111497)。深刻度は高。
Node.js公式「Wednesday, October 21, 2026 Security Releases」の見出し(2026年10月21日)

範囲外書き込みとは、確保したメモリの外側にデータを書いてしまう欠陥のことです。遠隔からのコードの実行(RCE: Remote Code Execution)は、攻撃者が用意したプログラムを、通信を通じてサーバー上で動かされることを指します。Node.jsの修正は、Brotliの開発元であるGoogleが2026年2月に入れた変更を、同梱版へ取り込むものです。取り込んだコミットは、変更の中身を次のように記しています。

Detect and report invalid stream earlier.

意訳
不正なデータの並び(ストリーム)を、より早い段階で検出して報告する
Node.jsの修正コミット「deps: brotli: cherry-pick 0ed4268a4401abcb44720963」(元の変更の作成は2026年2月27日、Node.jsへの反映は10月20日)

修正版は、ブロックの切り替えが不正なデータを、新しいエラーコードで止めます。標準のfetchも、Brotli形式の応答をこの展開処理に渡しています(同梱のライブラリ(undici)のソース)。外部のサーバーに接続するだけのサービスも対象になります。

TLSのホスト名検証の照合の食い違い

HTTPSなどのTLS通信では、接続先が示した証明書が、接続しようとしたホスト名のものかを確かめます。CVE-2026-105483・106069・106072の3件は、このホスト名検証をIPアドレスの書き方の違いですり抜けられる問題です。修正コミットは、原因と直し方を次のように記しています。

TLS identity checks normalized non-canonical numeric hosts before matching certificates. Platform resolvers can interpret the original host as a different address. Reject hosts that become IP addresses only after domainToASCII() normalization.

意訳
TLSの身元の確認では、正規でない数値のホストを、証明書と照合する前に正規化していた。一方、OSの名前解決は、元のホストを別のアドレスとして解釈することがある。そこで、domainToASCII()で正規化して初めてIPアドレスになるホストを拒否する。
Node.jsの修正コミット「tls: reject non-canonical IP addresses」(作成は2026年9月15日、Node.jsへの反映は10月20日)

修正コミットのテストに並ぶ表記を、Node.js 22.22.0のurl.domainToASCII()で実際に変換すると、次のようになりました。

書き方変換後修正版の扱い
127の部分を全角数字にした表記127.0.0.1拒否
区切りに句点(。)を使った表記127.0.0.1拒否
127.1(省略形)127.0.0.1拒否
0127.0.0.1(先頭にゼロ)87.0.0.1(0127を8進数として読む)拒否
127.0.0.1(正規の表記)127.0.0.1従来どおり照合

どれも、Node.jsのnet.isIP()ではIPアドレスと判定されない文字列です。修正前は、変換して初めてIPアドレスになる文字列を、IPアドレスではなくDNS名として証明書と照合していました。修正版は、こうしたホスト名をHost is a non-canonical IP addressというエラーで拒否します。

影響が出るのは、tls.connect()やhttps.request()のhostオプションに、こうした文字列がそのまま渡る場合です。fetchやURLの文字列で接続先を指定すると、URLの解析(new URL())の段階で正規の表記に直ります。

ホスト名の扱いをめぐる修正は、6月と7月のセキュリティリリースでも続いていました。同じ領域の修正を並べると次のとおりです。

公表CVE番号内容
2026年6月CVE-2026-48618Unicodeの区切り文字の扱いの違いで、ワイルドカード証明書の階層の確認をすり抜ける
2026年6月CVE-2026-48934セッションの再利用で、別のサーバー名へのホスト名検証が飛ばされる
2026年7月CVE-2026-58040HTTPS Agentのセッションの再利用で、ホスト名検証が飛ばされる
2026年10月CVE-2026-105483ほか2件IPアドレスの書き方の違いで、ホスト名検証をすり抜ける

利用者が入力したURLへ接続する機能(Webhookの送信先や、指定したURLの画像の取得など)は、表記の違いを突いた攻撃の対象になりやすい機能です。受け取ったURLをnew URL()で解析し、正規化されたhostnameを使えば、表記の違いによる食い違いは避けられます。旧来のurl.parse()は127.1などを正規化しないまま返すため、置き換えをおすすめします。

ただし、正規化はサーバー側リクエスト偽造(SSRF)への対策の一部にすぎません。OWASPのSSRF対策ガイドは、名前解決した接続先のIPアドレスを許可した範囲と照らし合わせることや、リダイレクトに自動で従わないことも求めています。

DNSの問い合わせとkeep-alive接続の原因

dns.resolveやdns.resolve4などの関数は、名前をC言語の文字列として下位のライブラリ(c-ares)に渡します。C言語の文字列はNUL文字で終わるため、名前の途中にNUL文字があると、それ以降がエラーにならずに切り捨てられていました(CVE-2026-105482)。アプリが確かめた名前と、実際に問い合わせる名前が食い違うおそれがあります。

修正版は、NUL文字を含む名前をERR_INVALID_ARG_VALUEのエラーとして受け付けません(修正コミット)。

fetchやhttpモジュールの名前解決はdns.lookup()を使うため、この件の対象はdns.resolveなどを直接呼ぶコードです。dns.lookup()側のNUL文字は、6月のCVE-2026-48930ですでに修正されています。

http.Agentは、使い終えた接続を閉じずに保持し、次のリクエストで使い回します(keep-alive)。標準のhttp.globalAgentは、v19.0.0から既定でkeep-aliveが有効です(公式ドキュメント)。

保持している接続に先にデータが届いたら、その接続を破棄する仕組みは、6月のCVE-2026-48931の修正ですでに入っていました。ただしこの仕組みは、イベントループが入出力を確かめるときにしか動きません。その前にOSへ届いたデータは見逃され、次のリクエストへの応答として扱われていました(CVE-2026-105481)。

修正版は、接続を使い回す直前に、未読のデータが届いているかをOSに問い合わせます。届いていれば、その接続を破棄して別の接続を使います(修正コミット)。

乱数・ZIP・権限モデルの原因

crypto.randomUUID()とcrypto.randomInt()は、速さのために乱数をまとめて作り、キャッシュしておきます。起動スナップショット(--build-snapshot)を作ると、このキャッシュがそのまま保存されていました(CVE-2026-106074)。

単一実行ファイル(SEA: Single Executable Applications)も、設定のuseSnapshotをtrueにして作った場合は同じです(既定はfalse)。同じファイルから起動したプロセスは、起動直後に同じUUIDや乱数を出していたことになります。修正は、スナップショットをまたいで乱数のキャッシュを消す処理を組み込むものです(24.22.1のリリースノートの「crypto: reset random caches across snapshots」)。

26.xは、v26.8.0でZIPファイルを読み書きするAPI(zlib.ZipFileなど)を追加しました。zlibのドキュメントでの安定度は1.0(Early development:開発の初期段階)です。

このAPIでは、ファイルの中身を読む前の整合性の確認に失敗しても、確認前の情報がキャッシュに残っていました。そのあとの読み込みが、攻撃者の用意したバイト列を返すおそれがありました(CVE-2026-106070、修正コミット)。

権限モデルは、ファイルやネットワークへのアクセスを、許可したものだけに絞る機能です。起動時に--permissionを付けると有効になります。

CVE-2026-106071(26.xのみ)は、ワイルドカード(*)を使った許可が意図より広く効き、許可したつもりの無いパスまで読めていた問題です(修正コミット)。

CVE-2026-106073は、fs.realpathSyncが権限の確認を通らず、許可していない場所のファイルの有無を調べられた問題です(修正コミット)。

!
使い方の前提
権限モデルは悪意のあるコードを止める仕組みではありません

権限モデルのドキュメントは、この機能を、信頼しているコードの誤操作を防ぐシートベルトのような仕組みと説明しています。悪意のあるコードに対しては安全を保証しないとも明記しています。

権限モデルの回避は、3月・6月・7月のリリースでも修正されています。信頼できないコードを動かす場合は、コンテナなど別の隔離の手段と組み合わせてください。

02.想定される被害と悪用状況

この章の要点02 / 9

最高の評価は「高」、中心は外部との通信に関わる修正

  1. 圧縮データの展開はコード実行のおそれ細工した応答を受け取るだけで展開処理に届く
  2. 証明書の確認のすり抜けで相手を偽られる接続先を外部から指定できると、送った認証情報が別の相手に渡るおそれ
  3. 悪用の記載は公表時点でなし公式発表にも米国政府のカタログにも未掲載

どれほど危険かを、公式発表とアドバイザリの評価の段階で示すと、次のとおりです。

2026年10月のNode.jsの脆弱性の警戒レベル(評価の段階と各組織の評価)

低Low
中Medium・Moderate
高High
緊急Critical
  • Node.jsの公式発表(今回の10件で最も高い評価・4件)

    高(高)
  • undiciのアドバイザリ(GitHub)(同梱版で直った8件の最高値(CVE-2026-87018など2件)・CVSS v3.1)

    7.5(高)

評価のほかに警戒の度合いを左右する事情

  • 外部との通信で届く細工した応答を返すだけで、fetchの展開処理に届く
  • 対象が広いサポート中の3つのバージョンすべてに影響する
  • 修正内容が公開済み修正コミットから原因の場所を読み取れる
  • 最高でも緊急ではなく高公式発表の評価
  • 悪用の確認一覧には未掲載米国CISAのKEVカタログ(10月21日版の時点)
段階は、Node.jsの脆弱性の公式発表とGitHubのアドバイザリが使う4段階(Low・Medium・High・Critical。GitHubは中をModerateと呼ぶ)。undiciの値はCVE-2026-87018のアドバイザリのCVSSスコア。CVE.orgとNVDには10月22日時点で記録が無く、NVDの評価は出ていない。

情報を抜かれる攻撃の流れ

深刻度「高」の2つの原因を、攻撃者とサーバーのやり取りとして単純化すると、次のようになります。

流れ1:細工した圧縮データでメモリを壊される

Node.jsが受け取ったデータを展開する途中で起きる

  1. 1
    攻撃者 → サーバー悪意のあるサーバーや乗っ取られたサーバーが、細工したBrotli形式の応答を返す
  2. 2
    サーバーの中でfetchなどが応答を展開する途中で、メモリの範囲外に書き込む
  3. 3
    サーバーの中で壊れたメモリを足がかりに、攻撃者のコードが動くおそれがある

その先で起こりうること

  • サーバーの乗っ取り
  • プロセスの異常終了

流れ2:証明書の確認をすり抜けられ、送った情報を抜かれる

接続先のホスト名を外部から指定できる場合に起きる

  1. 1
    攻撃者 → サーバー正規でない表記のIPアドレスを、接続先として登録させる
  2. 2
    サーバーの中でNode.jsはその表記を名前として証明書と照合し、OSは別のアドレスとして接続する
  3. 3
    サーバー → 攻撃者確かめた相手と実際の接続先が食い違ったまま、アプリが認証情報を付けたリクエストを送る

攻撃者の手元に届きうる情報

  • パスワード
  • 認証トークン
  • APIキー
  • 送信したデータ
図:圧縮データの展開と、証明書の確認のすり抜けから被害に至るまでの流れ(公式発表と修正コミットの説明をもとに単純化した図。攻撃に使う具体の値は省いた)

流れ1は、Brotliの範囲外書き込み(CVE-2026-111497)です。公式発表は、この欠陥でコードの実行が可能になると見出しに書いています(01章)。流れ2は、TLSのホスト名検証の3件で、修正コミットが説明する確かめた相手と実際の接続先の食い違いから、起こりうる被害を示しました。

攻撃に使う通信の細かな中身は、再現に使えてしまうため書きません。どちらの流れも、修正版に上げれば成り立たなくなります。

悪用状況とCVEの公開時期

公式発表は、実際に悪用された事例には触れていません。米国のサイバーセキュリティ・社会基盤安全保障庁(CISA)は、悪用が確認された脆弱性のカタログ(KEV)を公開しています。10月21日版の時点で、このカタログにもNode.js本体の項目はありません。

2026年10月22日の確認時点では、CVEの公的なデータベース(CVE.org・NVD)にこれらの番号の詳細はまだ登録されていません。Node.jsのセキュリティポリシーは、その理由を次のように説明しています。

As a result, CVEs may not be immediately available when security releases are published, but will typically be disclosed within a few days of the release.

意訳
そのため、セキュリティリリースの公開時点ではCVEをすぐには参照できないことがありますが、通常はリリースから数日以内に公開されます。
Node.js「Security(CVE publication timeline)」

修正内容はコミットとして公開されており、攻撃の手がかりを誰でも読める状態です。公式発表にもKEVにも悪用の記載が無い今のうちに、更新を進めてください。

03.影響を受ける範囲

この章の要点03 / 9

サポートが終わったバージョンも含む、修正前のすべてのバージョンへの影響

  1. 26.xは10件すべてが対象24.xは8件、22.xは7件が対象
  2. 外部と通信するならほぼ該当展開・証明書・接続の使い回しの修正が関係する
  3. 同梱ライブラリもまとめて更新fetchの部品は8件のアドバイザリに対応したバージョンへ

バージョン別の対象と修正版

使っているメジャーバージョンごとの更新先は、次のとおりです。表の件数は、そのバージョンに影響する脆弱性の数です。

バージョン修正版影響する脆弱性
26.x26.12.110件
24.x24.22.18件
22.x22.23.47件
上記以外(25.x・20.x以前など)なし(サポート終了)—

OSのパッケージ(aptなど)で入れたNode.jsは、修正を取り込んでも番号が修正版と同じになるとは限りません。確かめ方は04章で説明します。サポートが終わったバージョンについて、Node.jsのサポート終了の説明ページは次のように明記しています。

When new security releases reveal issues and patches in newer major lines, even if the same vulnerability affects EOL release lines, there will not be any new releases for them. Users still clinging on to EOL release lines and using affected code paths will be immediately vulnerable to attacks exploiting these disclosed vulnerabilities.

意訳
新しいメジャーバージョンのセキュリティリリースで問題と修正が明らかになったとき、同じ脆弱性がサポート終了のバージョンに影響していても、そのバージョンの新しいリリースは出ません。サポート終了のバージョンを使い続け、影響を受けるコードを通している利用者は、公表された脆弱性を突く攻撃にすぐにさらされます。
Node.js公式「End-Of-Life」

修正された10件の一覧です。CVE番号は、脆弱性ごとに振られる共通の識別番号です。

CVE番号内容深刻度対象のバージョン
CVE-2026-111497Brotli形式の展開処理での範囲外の書き込み(遠隔からのコード実行につながるおそれ)高26・24・22
CVE-2026-106069IPアドレスとして緩く解釈されるホスト名で、証明書のホスト名検証をすり抜ける高26・24・22
CVE-2026-105483全角数字で書いたIPアドレスで、証明書のホスト名検証をすり抜ける高26・24
CVE-2026-105482dns.resolveなどの関数が、NUL文字を含む名前を途中で切って問い合わせる高26・24・22
CVE-2026-105481keep-aliveの接続で、リクエストの送信前に届いていたデータを次のリクエストへの応答として扱う中26・24・22
CVE-2026-106072正規でない表記のIPv4アドレスで、DNS名向けの証明書がIPアドレスの接続先を認証する中26・24・22
CVE-2026-106074起動スナップショットと単一実行ファイル(SEA)に乱数のキャッシュが保存され、同じファイルから起動したプロセスが同じ値を出す中26・24・22
CVE-2026-106070ZIPのヘッダー検証に失敗したあとの読み込みが、攻撃者の用意したバイト列を返す低26
CVE-2026-106071権限モデルのワイルドカード指定が、意図より広いファイルアクセスを許す低26
CVE-2026-106073fs.realpathSyncで権限モデルの制限を回避できる低26・24・22

サポート期限とリリース体制の変更

長期サポート版(LTS: Long Term Support)は、セキュリティ修正を長く受け取れるバージョンです。各バージョンの期限は、Node.jsのリリーススケジュール(schedule.json)のとおりです。

バージョン状態(2026年10月22日時点)サポート終了
27.x10月28日からアルファ版の提供を始める予定2030年4月30日(予定)
26.x最新リリース(Current)。10月28日に長期サポート版へ移行予定2029年4月30日
24.xメンテナンス中の長期サポート版(10月20日から)2028年4月30日
22.xメンテナンス中の長期サポート版2027年4月30日
25.xサポート終了2026年6月1日
20.xサポート終了2026年4月30日

Node.jsは2026年3月、27.xからメジャーバージョンのリリースを年1回(4月)に減らし、すべてのメジャーバージョンを長期サポート版にすると発表しました。奇数バージョンと偶数バージョンの区別はなくなり、毎年10月からの半年間は、アルファ版で互換性を壊す変更を先に試せるようになります。22.xは残り半年でサポートが終わるため、24.xか26.xへ移る計画を早めに立てておくと安心です。

使い方別の影響

今回の修正は対象のAPIが広く、外部と通信するNode.jsのサービスはほぼ当てはまります。次の表で、自社の使い方に当てはまる行から確認してください。

確認すること当てはまる場合関係する修正
fetch・https.requestで外部のAPIやサイトに接続している最優先で更新するBrotli、keep-alive、undici
zlib.brotliDecompressなどで、外部から受け取ったデータを展開している更新するBrotli
圧縮されたリクエスト本文を、自前の処理やミドルウェアで展開するサーバー更新するBrotli
利用者が入力したホスト名を、tls.connectなどのhostに直接渡している更新し、new URL()で正規化してから使うTLSの3件
dns.resolveなどの関数を直接呼んでいる更新し、名前の入力を検証するCVE-2026-105482
--permissionを付けて起動している更新し、別の隔離の手段と組み合わせる権限モデルの2件
起動スナップショットや、useSnapshotを有効にしたSEAで配布している修正版で作り直すCVE-2026-106074
26.xのZIPのAPIで外部のZIPを読んでいる更新するCVE-2026-106070
undiciをnpmで入れているパッケージも更新するundiciのアドバイザリ

どの行にも当てはまらない場合も、更新は必要です。サポート中のバージョンの修正版に上げれば、今回の10件はまとめて解消します。ただし、起動スナップショットとSEAは修正版で作り直す必要があります。

同梱ライブラリ経由の影響

Node.jsは、HTTPクライアントや名前解決、暗号の処理に外部のライブラリを同梱しています。今回は次のライブラリが更新されました。

ライブラリ更新後のバージョン対象のバージョン更新の理由
undici(fetchの実装)8.12.2(26.x)・7.30.1(24.x)・6.29.1(22.x)すべて10月15日に公開されたアドバイザリへの対応
c-ares(DNSの名前解決)1.34.9すべて解放済みメモリの使用など11件のセキュリティ修正
OpenSSL(暗号・TLS)3.5.924.x・22.x(26.xは26.11.0で更新済み)9月29日に公表された修正
SQLite(node:sqlite)3.53.422.x公表済みの脆弱性への対応
ルート証明書Mozillaのルート証明書一覧(NSS)3.131.1すべてemSignのルート証明書3つを削除
公開鍵のブロックリスト新設すべてeMudhraの中間証明書8枚の秘密鍵の侵害への対応

c-aresの修正内容は1.34.9のリリースノートに、OpenSSLの修正内容はOpenSSL 3.5系の脆弱性一覧にまとまっています。どのライブラリがどのバージョンで更新されたかは、22.23.4・24.22.1・26.12.1の各リリースノートで確かめられます。

標準のfetchとWebSocketは、同梱のundiciで動いています(Node.js本体のソース)。そのため、undiciの修正はNode.jsを更新すれば反映されます。undiciのセキュリティアドバイザリのうち、今回の同梱版で修正されたものは次のとおりです(括弧内はCVSSのスコア)。

CVE番号内容深刻度
CVE-2026-109383Agentに関数で渡したTLSの独自の確認(証明書のピン留めなど)が無視され、効かなくなる高(7.4)
CVE-2026-87018TLS 1.2の再ネゴシエーションで別の証明書を示されると、プロセスが異常終了する高(7.5)
CVE-2026-1098696つ以上の圧縮形式を重ねた応答で、プロセスが異常終了する高(7.5)
CVE-2026-109829リダイレクトとキャッシュの組み合わせで、別の利用者向けの応答が返る(7.x・8.x)高(7.4)
CVE-2026-109924EventSourceの解析で、メモリを使い果たす中(5.9)
CVE-2026-109932WebSocketの自動応答(PONG)が溜まり、メモリを使い果たす中(5.9)
CVE-2026-109841大文字を含むアルゴリズム名で、サブリソース完全性(SRI)の確認をすり抜ける(7.x・8.x)中(5.9)
CVE-2026-87029展開を担うインターセプターで例外が処理されず、プロセスが異常終了する(7.x・8.x)中(5.9)

Agentやインターセプターに関わる項目は、主にnpmでundiciを入れ、そのAPIを直接使う場合に関係します。npmで入れたundiciを更新する手順は05章で扱います。

eMudhraの中間証明書の侵害への対応

認証局eMudhra(emSign)が運用する中間証明書8枚で、秘密鍵を第三者が簡単に割り出せる状態だったことが、2026年10月17日に報告されました(Mozillaのインシデント記録)。8枚のうち6枚はTLS用で、Chrome・Mozilla・Microsoft・Appleの各ルートプログラムで信頼されていました。

同じ記録へのeMudhraの書き込みによると、同社は8枚を失効させました。対象の中間証明書から、サイト向けの証明書は発行していないとも説明しています。そのため、このあと説明するブロックリストの主な役割は、漏れた鍵で偽の証明書を作られた場合の防御です。Node.jsの修正コミットは、対応の理由を次のように記しています。

Node.js embeds the Mozilla root store but has no equivalent of the browsers' CRLSet/OneCRL and no default online revocation checking, so a certificate chain through a compromised intermediate still verifies as long as it reaches a trusted root.

意訳
Node.jsはMozillaのルート証明書一覧を組み込んでいるが、ブラウザのCRLSetやOneCRLに当たる仕組みはなく、既定ではオンラインで失効を確かめることもしない。そのため、侵害された中間証明書を経由する証明書チェーンでも、信頼するルートまでたどれれば検証を通ってしまう。
Node.jsの修正コミット「tls: reject chains containing blocked public keys」(2026年10月20日)

そこで今回の修正では、対象8枚の公開鍵を載せたブロックリストをNode.js本体に組み込みました。検証済みの証明書チェーンにこれらの鍵が含まれていれば、失効扱いで拒否します。

修正コミットの説明によると、同じリストはGo(CVE-2026-111943)とElectronも採用しています。公開鍵で照合するので、別の認証局がクロス署名した同じ鍵の証明書も拒否されます。

04.Node.jsのバージョンの確認方法

この章の要点04 / 9

node -vとprocess.versionsで分かる更新の要否

  1. node -vで本体のバージョンを確認22.23.4・24.22.1・26.12.1より前なら更新する
  2. 同梱ライブラリはprocess.versionsundici・ares・opensslのバージョンを表示する
  3. OSのパッケージは修正の記録で判断修正を取り込んでも番号の先頭が古いままのことがある

まず、動いているNode.jsのバージョンと、同梱ライブラリのバージョンを確かめます。

# Node.js本体のバージョン
node -v

# 同梱ライブラリのバージョン(undici・ares・opensslなど)
node -p process.versions

# npmで入れたundiciが依存関係のどこにあるか
npm ls undici

node -vの結果が修正版より前なら、更新の対象です。process.versionsのundici・ares・opensslを見れば、同梱ライブラリが新しくなったかも確かめられます。

OSのパッケージ(aptなど)で入れたNode.jsは、番号だけで判断しないでください。Debianは、セキュリティのFAQで、新しい上流のバージョンへ上げる代わりに、安定版に収録したバージョンへ修正を移植すると説明しています。修正済みかどうかは、パッケージの変更履歴(changelog)や、ディストリビューションのセキュリティ情報で確かめます。

05.実行環境別の更新手順

この章の要点05 / 9

入れ方ごとに違う修正版への上げ方

  1. 手元とサーバーは修正版を入れ直すnvm・miseやOSのパッケージで更新する
  2. Dockerはイメージを作り直す公式イメージは10月21日に公開済み
  3. Lambdaは更新の設定を確認既定は自動、コンテナイメージの関数は作り直し

修正版への上げ方は、Node.jsをどう入れているかで変わります。

実行環境更新のしかた
手元の開発環境・自社のサーバー(nvm・mise)修正版を入れ、プロジェクトで指定するバージョンを書き換える
OSのパッケージ(aptなど)ディストリビューションの修正済みパッケージに更新する
Dockerベースイメージを取得し直して作り直し、デプロイする
AWS Lambda既定は自動で更新される。コンテナイメージの関数は作り直す
npmで入れたundiciNode.jsとは別にパッケージを修正版へ上げる

手元の開発環境とサーバー

バージョン管理ツールを使っている場合は、修正版を入れてから、プロジェクトで指定しているバージョンを書き換えます。

# nvm
nvm install 24.22.1
nvm alias default 24.22.1

# mise(カレントディレクトリの mise.toml に書き込む)
mise use node@24.22.1

.nvmrc・.node-version・package.jsonのengines・CIの設定ファイルにバージョンを固定している場合は、それらも修正版に書き換えます。OSのパッケージで入れている場合は、ディストリビューションが修正済みパッケージを出しているかを確かめてから更新します。

Node.jsのバージョンをプロジェクトごとに固定して切り替える方法は、別記事で詳しく整理しています。あわせてご覧ください。

関連記事

mise|Node・Pythonのバージョン管理と環境変数・タスクを1つのCLIに

ディレクトリを移動するだけでNode.jsのバージョンが切り替わる仕組みと、nvmからの移行、CIでのバージョンの固定までを扱っています。

続きを読む

Dockerのイメージ

Docker Hubの公式のnodeイメージには、22.23.4・24.22.1・26.12.1のタグが10月21日に公開されています。FROM node:24.22.1-slimのようにバージョンまで書いておくと、どのバージョンで動いているかが明確になります。

node:24のようにメジャーバージョンだけを指定したタグでは、手元に残った古いイメージがそのまま使われることがあります。最新のイメージを取得し直してビルドし、デプロイまで済ませてください。

docker build --pull -t my-app .

AWS Lambdaのランタイム

Lambdaが管理するランタイム(nodejs24.xなど)について、AWSのドキュメントは次のように説明しています。

By default, for functions using managed runtimes, Lambda applies runtime updates automatically.

意訳
管理されたランタイムを使う関数では、Lambdaは既定でランタイムの更新を自動で適用します。
AWS「Understanding how Lambda manages runtime version updates」

反映の時期はAWSが決め、段階的に適用されます。Function updateモードでは関数を更新したとき、Manualモードでは手動で指定したときに、はじめて新しいランタイムへ切り替わります。

コンテナイメージで動かしている関数は、更新されたベースイメージから作り直してデプロイする必要があります。関数の中でprocess.versionをログに出しておくと、実際に動いているNode.jsのバージョンを確かめられます。

npmで入れたundici

undiciをnpmの依存関係に入れている場合は、Node.jsの更新とは別に上げる必要があります。04章のnpm ls undiciで、直接の依存か間接的な依存かを確かめてから更新します。

npm install undici@^8.12.2

修正版は6.29.1・7.30.1・8.12.2以降です。間接的な依存だけの場合は、それを使っているパッケージの更新を待つか、package.jsonのoverridesで修正版を指定します。

更新で変わる挙動

修正版に上げると、これまで通っていた処理がエラーになる場合があります。更新の前後で、次の4つの変更に当たらないかを確かめてください。

変更対象のバージョン影響が出る例対応
正規でない表記のIPアドレスへのTLS接続を拒否すべてtls.connect()などのhostに127.1や0127.0.0.1を直接書いた接続意図した宛先を、10進数の正規の表記で書く
emSignのルート証明書3つを一覧から削除すべてこれらのルートにつながる証明書を使うサイトへの接続(Node.js標準のルート証明書を使う場合)相手先に証明書の入れ替えを依頼する
NUL文字を含む名前をdns.resolveなどの関数が拒否すべて名前の途中にNUL文字が入った入力入力の段階で取り除く
ブロックの切り替えが不正なBrotliデータに新しいエラーコードすべてcodeがERR__ERROR_FORMAT_BLOCK_SWITCHのエラーエラー処理の分岐を確かめる

削除されたのは、emSign ECC Root CA - G3・emSign Root CA - C1・emSign ECC Root CA - C3の3つです(更新のコミット)。

このほか26.12.1には、脆弱性の修正ではない変更の取り消しも1件含まれます。10月14日の26.12.0で入ったES Modulesの読み込み方の変更が取り消され、26.11以前と同じ挙動に戻りました(取り消しのコミット)。

CVE番号は付いていませんが、24.xと26.xには、JavaScriptエンジンV8の修正も取り込まれています。JSON.parseで、エスケープを含むキーが後続の解析結果のキーを壊すおそれがあった不具合です(修正コミット)。

06.開発形態別の追加の対応

この章の要点06 / 9

フレームワークやElectronでも土台になるNode.js本体の更新

  1. フルスクラッチは使っているAPIを点検hostの直接指定やdns.resolveの呼び出しを確かめる
  2. フレームワークも本体の更新が必要npmで入るundiciもあわせて確認する
  3. Electronは配布元の更新を待つアプリに同梱されたNode.jsは別に更新される

Node.js本体の更新は、どの作り方でも必要です。そのうえで、作り方ごとに足す確認は次のとおりです。

開発形態追加で確かめること
フルスクラッチ(http・tls・dnsを直接使う)影響の出るAPIを使っていないか、コードを点検する
フレームワーク(Express・Next.jsなど)npmの依存関係にundiciが入っていないかを確かめる
ElectronのアプリElectron自体の更新を確かめる(同梱のNode.jsは別に更新される)
単一実行ファイル(SEA)・起動スナップショット修正版のNode.jsで作り直して配り直す

フルスクラッチで開発したアプリ

http・tls・dnsなどの標準モジュールを直接使っている場合は、03章の使い方別の表で、とくに次の3点を点検します。

  • 利用者の入力を、tls.connect()やhttps.request()のhostにそのまま渡していないか
  • 旧来のurl.parse()で取り出したホスト名を、接続先に使っていないか
  • 外部から受け取った名前を、dns.resolveなどで直接問い合わせていないか

フレームワークで作ったアプリ

ExpressやNext.jsなどのフレームワークも、Node.jsの上で動きます。TLS・DNS・HTTP・展開処理の修正は、フレームワークではなくNode.js本体の更新で反映されます。

フレームワークやその周辺のパッケージが、npmでundiciを入れていることもあります。04章のnpm ls undiciで依存関係を確かめ、入っていれば修正版へ上げてください。フレームワーク自体のセキュリティ更新は、それぞれの配布元の告知で確認します。

Electronのアプリと単一実行ファイル

Electronは、公式ドキュメントのとおり、ChromiumとNode.jsをバイナリに組み込んで動きます。サーバーのNode.jsを更新しても、配布したElectronのアプリには反映されません。Electron自体の更新情報を確かめ、修正を取り込んだバージョンでアプリを作り直します。

単一実行ファイル(SEA)も、作ったときのNode.jsを内部に持ちます。修正版のNode.jsで作り直して、配り直してください。

07.発見の経緯とタイムライン

この章の要点07 / 9

HackerOneへの報告から10月21日の一斉公開までの流れ

  1. 報告はHackerOne経由修正コミットに報告のリンクが記載されている
  2. 修正は非公開の場で準備8月末から9月に作られ、公開日に一斉に反映
  3. 一部の修正はAIの支援つきコミットにAIツールの名前が記されている

今回の修正にかかわる主な出来事を、日付の順に並べると次のとおりです。

日付出来事
2026年2月27日Brotliの開発元(Google)が、不正なデータを早く検出する変更を作成
2026年8月28日〜9月25日Node.js本体の修正コミットが作られる(Brotliの取り込みを除く)
2026年9月29日OpenSSL 3.5.9の修正が公表される
2026年10月15日undiciが、同梱版で修正される8件のアドバイザリを公開
2026年10月17日〜18日eMudhraの中間証明書の侵害が報告され、同社が8枚を失効
2026年10月19日c-ares 1.34.9が公開される
2026年10月21日Node.jsが22.23.4・24.22.1・26.12.1を公開

修正コミットの多くには、報告を受け付けたHackerOneのページへのリンクが記されています(例:IPアドレスの正規化の修正コミット)。Node.jsのセキュリティポリシーは、修正を公開まで表に出さない手順を次のように定めています。

Fixes are prepared for all supported releases. These fixes are not committed to the public repository but rather held locally pending the announcement.

意訳
修正はサポート中のすべてのリリースに向けて準備します。これらの修正は公開のリポジトリにはコミットせず、公表まで手元で保持します。
Node.js「Security(Disclosure policy)」

修正コミットの一部には、AIツールの支援を受けたことを示す「Assisted-by」の行があり、ツールの名前が記されています。たとえば乱数のキャッシュの修正コミットには「Assisted-by: Codex」とあります。脆弱性の修正の作業にも、AIツールが使われていることが分かります。

08.よくある質問(FAQ)

Node.js 20を使っています。今回の修正版はありますか?

修正版は22.x・24.x・26.xだけに出ています。20.xは2026年4月30日でサポートが終わっているため、24.xか26.xへの移行をおすすめします。

標準のfetchだけを使っています。npmのundiciも更新が必要ですか?

標準のfetchの修正は、Node.jsを修正版に上げれば反映されます。npmの依存関係にundiciが入っている場合だけ、そのパッケージも6.29.1・7.30.1・8.12.2以降へ上げてください。

更新したらHTTPS接続がエラーになりました。何が原因ですか?

接続先のhostに127.1のような正規でない表記のIPアドレスを直接書いていると、修正版は証明書の確認で接続を拒否します(修正版のリリースノート)。emSignのルート証明書3つが削除されたため、これらにつながる証明書を使うサイトへの接続も失敗します。

AWS Lambdaの関数は自分で更新する必要がありますか?

Lambdaが管理するランタイムを既定の更新モード(Auto)で使っていれば、AWS側で順次更新されます。コンテナイメージで動かしている関数は、自分で作り直してデプロイする必要があります。

Node.jsのセキュリティ情報をいち早く受け取る方法はありますか?

Node.jsのセキュリティポリシーは、告知専用のメーリングリスト(nodejs-sec)と公式ブログの脆弱性カテゴリを案内しています。修正版の公開日には、まずメーリングリストに告知が届き、6時間以内に同じ内容がブログに載ります。

09.まとめ

2026年10月21日のセキュリティリリースでは、Brotliの展開、TLSのホスト名検証、DNS、keep-aliveの接続など、外部との通信に関わる部分がまとめて修正されました。22.23.4・24.22.1・26.12.1以降か、OSの修正済みパッケージへ上げたうえで、Dockerのイメージ、Lambdaのランタイム、npmで入れたundiciの更新も確かめてください。

依存関係やランタイムの更新は、後回しにするほど一度に上げる幅が大きくなり、確認の手間も増えます。弊社では、AIをフル活用したWeb制作・運用の中で、こうした更新を継続して回す仕組みづくりのご相談も承っています。

お問い合わせ

Node.jsの更新と運用の仕組みづくりをご相談ください

弊社では AI フル活用の運用保守・記事更新・計測改善までを提供しています。セキュリティ更新の確認から定期的なアップデートの体制づくりまで、無料相談からお気軽にお問い合わせください。

TANTOU の詳細を見る

開発ノウハウ

一覧に戻る →
この記事をシェア
澤田 翔太(Shota Sawada)
この記事を書いた人

澤田 翔太

株式会社クリプタル 代表取締役

1988年生まれ、慶應義塾大学卒。創業メンバーとして関わった株式会社セールスサポートを株式会社ネオマーケティング(東証STD 4196)に売却。株式会社クリプタルでも複数の事業立ち上げと売却を経験し、2022年9月には婚活・恋愛メディア「シッテク」「婚活会議」を株式会社ベビーカレンダー(東証GRT 7363)へ売却。現在はAI業務支援事業、TANTOU事業、グロースハック支援事業、メディア事業、SEOコンサルティング事業を手がける。