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公式「Wednesday, October 21, 2026 Security Releases」(2026年10月21日)Node.jsプロジェクトは、脆弱性に対処するため、26.x・24.x・22.xの新しいバージョンを2026年10月21日(水)以降すみやかに公開します。今回のリリースで直す問題のうち、最も高い深刻度はHIGH(高)です。
Node.jsは、サーバーでJavaScriptを動かすための実行環境です。今回の10件は、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.根本原因と原因のモジュール
本体の6つのモジュールと同梱のBrotliにある10件の原因
- 重いのは圧縮の展開と証明書の確認同梱のBrotliと、TLSのホスト名の照合
- 入力の読み方の食い違いが4件ホスト名の表記やNUL文字を、確かめる側と使う側で別に読んでいた
- 直すのは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公式「Wednesday, October 21, 2026 Security Releases」の見出し(2026年10月21日)Node.jsのBrotliの展開処理(デコーダー)の範囲外書き込みにより、遠隔からのコードの実行が可能になる(CVE-2026-111497)。深刻度は高。
範囲外書き込みとは、確保したメモリの外側にデータを書いてしまう欠陥のことです。遠隔からのコードの実行(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.
意訳Node.jsの修正コミット「tls: reject non-canonical IP addresses」(作成は2026年9月15日、Node.jsへの反映は10月20日)TLSの身元の確認では、正規でない数値のホストを、証明書と照合する前に正規化していた。一方、OSの名前解決は、元のホストを別のアドレスとして解釈することがある。そこで、domainToASCII()で正規化して初めてIPアドレスになるホストを拒否する。
修正コミットのテストに並ぶ表記を、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-48618 | Unicodeの区切り文字の扱いの違いで、ワイルドカード証明書の階層の確認をすり抜ける |
| 2026年6月 | CVE-2026-48934 | セッションの再利用で、別のサーバー名へのホスト名検証が飛ばされる |
| 2026年7月 | CVE-2026-58040 | HTTPS 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.想定される被害と悪用状況
最高の評価は「高」、中心は外部との通信に関わる修正
- 圧縮データの展開はコード実行のおそれ細工した応答を受け取るだけで展開処理に届く
- 証明書の確認のすり抜けで相手を偽られる接続先を外部から指定できると、送った認証情報が別の相手に渡るおそれ
- 悪用の記載は公表時点でなし公式発表にも米国政府のカタログにも未掲載
どれほど危険かを、公式発表とアドバイザリの評価の段階で示すと、次のとおりです。
2026年10月のNode.jsの脆弱性の警戒レベル(評価の段階と各組織の評価)
Node.jsの公式発表(今回の10件で最も高い評価・4件)
高(高)undiciのアドバイザリ(GitHub)(同梱版で直った8件の最高値(CVE-2026-87018など2件)・CVSS v3.1)
7.5(高)
評価のほかに警戒の度合いを左右する事情
- 外部との通信で届く細工した応答を返すだけで、fetchの展開処理に届く
- 対象が広いサポート中の3つのバージョンすべてに影響する
- 修正内容が公開済み修正コミットから原因の場所を読み取れる
- 最高でも緊急ではなく高公式発表の評価
- 悪用の確認一覧には未掲載米国CISAのKEVカタログ(10月21日版の時点)
情報を抜かれる攻撃の流れ
深刻度「高」の2つの原因を、攻撃者とサーバーのやり取りとして単純化すると、次のようになります。
流れ1:細工した圧縮データでメモリを壊される
Node.jsが受け取ったデータを展開する途中で起きる
- 1攻撃者 → サーバー悪意のあるサーバーや乗っ取られたサーバーが、細工したBrotli形式の応答を返す
- 2サーバーの中でfetchなどが応答を展開する途中で、メモリの範囲外に書き込む
- 3サーバーの中で壊れたメモリを足がかりに、攻撃者のコードが動くおそれがある
その先で起こりうること
- サーバーの乗っ取り
- プロセスの異常終了
流れ2:証明書の確認をすり抜けられ、送った情報を抜かれる
接続先のホスト名を外部から指定できる場合に起きる
- 1攻撃者 → サーバー正規でない表記のIPアドレスを、接続先として登録させる
- 2サーバーの中でNode.jsはその表記を名前として証明書と照合し、OSは別のアドレスとして接続する
- 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.
意訳Node.js「Security(CVE publication timeline)」そのため、セキュリティリリースの公開時点ではCVEをすぐには参照できないことがありますが、通常はリリースから数日以内に公開されます。
修正内容はコミットとして公開されており、攻撃の手がかりを誰でも読める状態です。公式発表にもKEVにも悪用の記載が無い今のうちに、更新を進めてください。
03.影響を受ける範囲
サポートが終わったバージョンも含む、修正前のすべてのバージョンへの影響
- 26.xは10件すべてが対象24.xは8件、22.xは7件が対象
- 外部と通信するならほぼ該当展開・証明書・接続の使い回しの修正が関係する
- 同梱ライブラリもまとめて更新fetchの部品は8件のアドバイザリに対応したバージョンへ
バージョン別の対象と修正版
使っているメジャーバージョンごとの更新先は、次のとおりです。表の件数は、そのバージョンに影響する脆弱性の数です。
| バージョン | 修正版 | 影響する脆弱性 |
|---|---|---|
| 26.x | 26.12.1 | 10件 |
| 24.x | 24.22.1 | 8件 |
| 22.x | 22.23.4 | 7件 |
| 上記以外(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-111497 | Brotli形式の展開処理での範囲外の書き込み(遠隔からのコード実行につながるおそれ) | 高 | 26・24・22 |
| CVE-2026-106069 | IPアドレスとして緩く解釈されるホスト名で、証明書のホスト名検証をすり抜ける | 高 | 26・24・22 |
| CVE-2026-105483 | 全角数字で書いたIPアドレスで、証明書のホスト名検証をすり抜ける | 高 | 26・24 |
| CVE-2026-105482 | dns.resolveなどの関数が、NUL文字を含む名前を途中で切って問い合わせる | 高 | 26・24・22 |
| CVE-2026-105481 | keep-aliveの接続で、リクエストの送信前に届いていたデータを次のリクエストへの応答として扱う | 中 | 26・24・22 |
| CVE-2026-106072 | 正規でない表記のIPv4アドレスで、DNS名向けの証明書がIPアドレスの接続先を認証する | 中 | 26・24・22 |
| CVE-2026-106074 | 起動スナップショットと単一実行ファイル(SEA)に乱数のキャッシュが保存され、同じファイルから起動したプロセスが同じ値を出す | 中 | 26・24・22 |
| CVE-2026-106070 | ZIPのヘッダー検証に失敗したあとの読み込みが、攻撃者の用意したバイト列を返す | 低 | 26 |
| CVE-2026-106071 | 権限モデルのワイルドカード指定が、意図より広いファイルアクセスを許す | 低 | 26 |
| CVE-2026-106073 | fs.realpathSyncで権限モデルの制限を回避できる | 低 | 26・24・22 |
サポート期限とリリース体制の変更
長期サポート版(LTS: Long Term Support)は、セキュリティ修正を長く受け取れるバージョンです。各バージョンの期限は、Node.jsのリリーススケジュール(schedule.json)のとおりです。
| バージョン | 状態(2026年10月22日時点) | サポート終了 |
|---|---|---|
| 27.x | 10月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.9 | 24.x・22.x(26.xは26.11.0で更新済み) | 9月29日に公表された修正 |
| SQLite(node:sqlite) | 3.53.4 | 22.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-109383 | Agentに関数で渡したTLSの独自の確認(証明書のピン留めなど)が無視され、効かなくなる | 高(7.4) |
| CVE-2026-87018 | TLS 1.2の再ネゴシエーションで別の証明書を示されると、プロセスが異常終了する | 高(7.5) |
| CVE-2026-109869 | 6つ以上の圧縮形式を重ねた応答で、プロセスが異常終了する | 高(7.5) |
| CVE-2026-109829 | リダイレクトとキャッシュの組み合わせで、別の利用者向けの応答が返る(7.x・8.x) | 高(7.4) |
| CVE-2026-109924 | EventSourceの解析で、メモリを使い果たす | 中(5.9) |
| CVE-2026-109932 | WebSocketの自動応答(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の修正コミット「tls: reject chains containing blocked public keys」(2026年10月20日)Node.jsはMozillaのルート証明書一覧を組み込んでいるが、ブラウザのCRLSetやOneCRLに当たる仕組みはなく、既定ではオンラインで失効を確かめることもしない。そのため、侵害された中間証明書を経由する証明書チェーンでも、信頼するルートまでたどれれば検証を通ってしまう。
そこで今回の修正では、対象8枚の公開鍵を載せたブロックリストをNode.js本体に組み込みました。検証済みの証明書チェーンにこれらの鍵が含まれていれば、失効扱いで拒否します。
修正コミットの説明によると、同じリストはGo(CVE-2026-111943)とElectronも採用しています。公開鍵で照合するので、別の認証局がクロス署名した同じ鍵の証明書も拒否されます。
04.Node.jsのバージョンの確認方法
node -vとprocess.versionsで分かる更新の要否
- node -vで本体のバージョンを確認22.23.4・24.22.1・26.12.1より前なら更新する
- 同梱ライブラリはprocess.versionsundici・ares・opensslのバージョンを表示する
- OSのパッケージは修正の記録で判断修正を取り込んでも番号の先頭が古いままのことがある
まず、動いているNode.jsのバージョンと、同梱ライブラリのバージョンを確かめます。
# Node.js本体のバージョン
node -v
# 同梱ライブラリのバージョン(undici・ares・opensslなど)
node -p process.versions
# npmで入れたundiciが依存関係のどこにあるか
npm ls undicinode -vの結果が修正版より前なら、更新の対象です。process.versionsのundici・ares・opensslを見れば、同梱ライブラリが新しくなったかも確かめられます。
OSのパッケージ(aptなど)で入れたNode.jsは、番号だけで判断しないでください。Debianは、セキュリティのFAQで、新しい上流のバージョンへ上げる代わりに、安定版に収録したバージョンへ修正を移植すると説明しています。修正済みかどうかは、パッケージの変更履歴(changelog)や、ディストリビューションのセキュリティ情報で確かめます。
05.実行環境別の更新手順
入れ方ごとに違う修正版への上げ方
- 手元とサーバーは修正版を入れ直すnvm・miseやOSのパッケージで更新する
- Dockerはイメージを作り直す公式イメージは10月21日に公開済み
- Lambdaは更新の設定を確認既定は自動、コンテナイメージの関数は作り直し
修正版への上げ方は、Node.jsをどう入れているかで変わります。
| 実行環境 | 更新のしかた |
|---|---|
| 手元の開発環境・自社のサーバー(nvm・mise) | 修正版を入れ、プロジェクトで指定するバージョンを書き換える |
| OSのパッケージ(aptなど) | ディストリビューションの修正済みパッケージに更新する |
| Docker | ベースイメージを取得し直して作り直し、デプロイする |
| AWS Lambda | 既定は自動で更新される。コンテナイメージの関数は作り直す |
| npmで入れたundici | Node.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.
意訳AWS「Understanding how Lambda manages runtime version updates」管理されたランタイムを使う関数では、Lambdaは既定でランタイムの更新を自動で適用します。
反映の時期は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.開発形態別の追加の対応
フレームワークやElectronでも土台になるNode.js本体の更新
- フルスクラッチは使っているAPIを点検hostの直接指定やdns.resolveの呼び出しを確かめる
- フレームワークも本体の更新が必要npmで入るundiciもあわせて確認する
- 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.発見の経緯とタイムライン
HackerOneへの報告から10月21日の一斉公開までの流れ
- 報告はHackerOne経由修正コミットに報告のリンクが記載されている
- 修正は非公開の場で準備8月末から9月に作られ、公開日に一斉に反映
- 一部の修正は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 フル活用の運用保守・記事更新・計測改善までを提供しています。セキュリティ更新の確認から定期的なアップデートの体制づくりまで、無料相談からお気軽にお問い合わせください。

