Node.js v26.12.1/v24.22.1/v22.23.4へ今すぐ更新を。High 4件の脆弱性を解説

2026年10月21日(米国時間)、Node.jsプロジェクトはサポート中の3系統、26.x・24.x・22.x向けにセキュリティリリースを公開しました。修正された脆弱性は全部で10件。そのうち4件が、深刻度「High(重要)」に分類されています。

中でも目を引くのが、Brotli圧縮データの展開処理で範囲外への書き込み(out-of-bounds write)が起き、リモートコード実行につながり得るという1件です。ほかにもTLS証明書のホスト名検証をすり抜けられる問題が複数含まれており、「定例のセキュリティリリース」と流すには重い内容です。

同じ週には、PHP本体の重大な脆弱性「php2shell」が修正版より先に流出する騒ぎもありました。結論から言うと、今回のNode.jsはphp2shellほどの緊急事態ではありません。ただし、まったく侮れない内容です。本記事では、php2shellとの深刻度の比較も交えながら、脆弱性ごとに整理していきます。

今回のリリースの概要

項目内容
公開日2026年10月21日(米国時間)
対象ライン26.x(Current)、24.x(LTS)、22.x(LTS)
修正版v26.12.1、v24.22.1、v22.23.4
修正された脆弱性10件(High 4件、Medium 3件、Low 3件)
最高深刻度3ラインすべてでHigh
依存ライブラリの更新c-ares、ルート証明書(eMudhra中間CA侵害への対応)、OpenSSL、SQLite、Undici
悪用状況公式発表では言及なし(執筆時点で実際の攻撃は報告されていない)
EOLのバージョン20.x以前は修正版が出ない。公式は「EOLのバージョンはセキュリティリリースのたびに常に影響を受ける」と明記

なお、公式の告知には各脆弱性のタイトルと影響ラインは載っていますが、CVSSスコアや詳しい技術解説はほとんど書かれていません。以下の解説は、公式告知のタイトルと各リリースノートに記載された修正コミットの内容から読み取れる範囲で整理したものです。

修正版のバージョン

リリースライン位置づけ修正版
26.xCurrentv26.12.1
24.x(Krypton)LTSv24.22.1
22.x(Jod)LTSv22.23.4
20.x以前EOL(20.xは2026年4月30日にサポート終了)公式の修正版なし

脆弱性の一覧

CVE深刻度内容影響ライン
CVE-2026-111497HighBrotliデコーダーの範囲外書き込み(リモートコード実行の恐れ)26 / 24 / 22
CVE-2026-106069Highホスト名が「緩く」IPアドレスとして解釈される場合のTLS証明書ホスト名検証バイパス26 / 24 / 22
CVE-2026-105483High全角数字で書かれたIPアドレスによるTLS証明書ホスト名検証バイパス26 / 24
CVE-2026-105482Highdns.resolveがNUL文字を含む名前を途中で切り詰める26 / 24 / 22
CVE-2026-105481MediumKeep-Aliveソケットが、リクエスト送信前に書き込まれたレスポンスを処理してしまう26 / 24 / 22
CVE-2026-106072Medium非正規形式のIPv4ホスト名で、DNS名のSANがIPエンドポイントの認証に使われてしまう26 / 24 / 22
CVE-2026-106074Mediumスナップショット/SEAに乱数キャッシュが保存され、randomUUID()などが毎回同じ値を返す26 / 24 / 22
CVE-2026-106070LowZipFileがZIPヘッダー検証の失敗後に攻撃者が制御できる先頭バイトを返す26
CVE-2026-106071LowPermission Modelのワイルドカード処理によるファイルシステム権限の過剰付与26
CVE-2026-106073Lowfs.realpathSyncによるPermission Modelのバイパス26 / 24 / 22

特に注意したいHigh 4件

Brotliデコーダーの範囲外書き込み(CVE-2026-111497)

今回いちばん重いのがこれです。Node.jsに組み込まれている圧縮ライブラリBrotliのデコーダーに、確保したメモリの外側へデータを書き込んでしまう欠陥があり、公式はリモートコード実行を許す恐れがあるとしています。修正はBrotli本家の修正コミットを取り込む形で行われ、あわせて新しいエラーコードBROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCHが公開されました。不正な形式のデータを、新たにエラーとして弾くようになったと読み取れます。

影響を受けやすいのは、外部から受け取ったBrotli圧縮データを展開する処理です。たとえば次のようなケースが考えられます。

  • zlib.createBrotliDecompress()やzlib.brotliDecompressSync()で、ユーザーがアップロードしたデータや外部APIの応答を展開している
  • HTTPクライアントとして外部サーバーにアクセスし、Content-Encoding: brのレスポンスを自動で展開している(スクレイピング、Webhook受信先へのアクセス、URLプレビュー生成など、接続先を自分で選べない処理は特に注意)
  • サーバー側で、Brotli圧縮されたリクエストボディを受け付けて展開している

Brotliを使っているつもりがなくても、フレームワークやライブラリが内部で展開していることは珍しくありません。「うちは関係ない」と判断せず、更新で潰しておくのが無難です。

TLS証明書のホスト名検証バイパス(CVE-2026-106069/CVE-2026-105483)

TLS接続では、相手の証明書が「接続しようとしているホスト名(またはIPアドレス)」に対して発行されたものかを確認します。今回、この確認をすり抜けられる問題が2件、Highとして修正されました。

  • CVE-2026-106069:ホスト名が、正規の書き方ではないもののIPアドレスとして「緩く」解釈できる形式だった場合に、検証が正しく行われない問題。Medium扱いのCVE-2026-106072(非正規形式のIPv4で、DNS名向けのSANがIPエンドポイントの認証に使われてしまう)とあわせて、「非正規形式のIPアドレスを拒否する」という1つの修正で対処されています。
  • CVE-2026-105483:IPアドレスが全角数字で書かれていた場合に検証をすり抜けられる問題。修正コミット名は「IP正規化のリグレッション修正」となっており、以前の変更で入り込んだ不具合と見られます。影響は26.xと24.xのみです。

悪用されると、本来は別のホスト向けの証明書で「正しい相手」になりすませる、つまり中間者攻撃の足がかりになり得ます。成立させるには、攻撃者が接続先のホスト名の指定に関与できることなど、一定の条件が要ると考えられますが、ユーザーが入力したURLやホスト名に接続する機能(Webhook、プロキシ、外部連携など)を持つアプリは優先的に更新したいところです。

dns.resolveのNUL文字切り詰め(CVE-2026-105482)

dns.resolve系の関数に、NUL文字(\0)を含む名前を渡すと、その位置で名前が切り詰められて問い合わせられてしまう問題です。修正では、入力にNULバイトが含まれていないかを検証するようになりました。

この種の問題が厄介なのは、アプリ側のチェックと実際の名前解決で、見ている文字列が食い違う点です。たとえば「許可リストに載っているドメインか」を文字列全体で判定したあと、実際には切り詰められた別の名前が解決される、といった形で、入力検証やSSRF対策をすり抜ける余地が生まれます。外部から受け取ったホスト名をそのままDNS解決に回している処理は要注意です。

Medium・Lowの脆弱性

深刻度は下がりますが、使っている機能によっては影響が大きいものもあります。

  • Keep-Aliveのレスポンス取り違え(CVE-2026-105481、Medium):再利用中のKeep-Aliveソケットに、リクエストを送る前からデータが届いていた場合、それを次のリクエストへのレスポンスとして処理してしまう問題。接続プールを使うHTTPクライアントで、別のレスポンスを受け取ってしまう恐れがあります。
  • スナップショット/SEAで乱数が重複(CVE-2026-106074、Medium):crypto.randomUUID()やcrypto.randomInt()が内部に持つ乱数キャッシュが、ユーザー作成の起動スナップショットやSingle Executable Application(SEA)に保存されてしまい、どのプロセスでも同じ値が繰り返し出てくる問題。スナップショットやSEAを使っていなければ影響しませんが、使っている場合はセッションIDやトークンが予測可能になり得るため、深刻度以上に注意が必要です。
  • ZipFileの不正データ返却(CVE-2026-106070、Low):26.xのZIP読み込み機能で、ヘッダー検証に失敗したあとも攻撃者が仕込んだ先頭バイトを返してしまう問題。26.xのみが対象です。
  • Permission Modelのバイパス2件(CVE-2026-106071、CVE-2026-106073、Low):--permissionで有効にする権限モデルで、ワイルドカード指定時に意図より広いファイルアクセスを許してしまう問題(26.xのみ)と、fs.realpathSyncで権限チェックが行われていなかった問題。Permission Modelを使っていなければ影響はありません。

ちなみにPermission Modelのバイパスは、2026年に入ってからのNode.jsセキュリティリリースで毎回のように見つかっています。サンドボックス代わりに頼るには、まだ発展途上の機能と考えておいたほうがよさそうです。

依存ライブラリの更新

公開済みの脆弱性に対応するため、同梱ライブラリも更新されています。

ライブラリ26.12.124.22.122.23.4
c-ares(DNS)1.34.91.34.91.34.9
OpenSSL—3.5.93.5.9
Undici(fetch実装)8.12.27.30.16.29.1
SQLite——3.53.4
ルート証明書NSS 3.131.1NSS 3.131.1NSS 3.131.1

ルート証明書については、インドの認証局eMudhraの中間CAが侵害された件への対応として位置づけられています。あわせて「ブロック対象の公開鍵を含む証明書チェーンを拒否する」修正も入っており、侵害された鍵につながる証明書はNode.js側で受け付けなくなります。このほか、V8のバックポートやX.509証明書の変換・整形処理の堅牢化も含まれています。

なお、v26.12.1には「ほとんどのESモジュールを同期的に読み込む」という以前の変更を取り消す修正も含まれています。セキュリティ修正ではありませんが、26.xを使っている場合はモジュール読み込みまわりの挙動が変わる可能性があるため、更新後のテストで確認しておくと安心です。

php2shellと深刻度を比べると

同じ週に対応を迫られたPHPのphp2shellと並べてみます。

観点PHP(php2shell)Node.js(10月リリース)
深刻度の評価CVSS v4.0で各9.2(Critical/緊急)最高でHigh(重要)。CVSSスコアは未公表
最も重い脆弱性PHPコアのリモートコード実行とされるもの2件(認証不要と報じられている)Brotli展開時の範囲外書き込み(リモートコード実行の恐れ)
攻撃の前提PHPが動くWebサーバーなら、アプリの作りに関係なく広く対象になり得る外部から来たBrotliデータの展開、外部指定のホストへのTLS接続やDNS解決など、特定の処理がある場合
公開の経緯修正版より先に情報が流出通常の協調公開(修正版と同時に公開)
悪用状況修正版公開直後の大規模攻撃が予想されていた公式発表では言及なし
対応の目安修正版が出たその日のうちに数日以内に計画的に

深刻度の評価、攻撃が成立する条件の広さ、公開の経緯のどれを取っても、php2shellのほうが一段上です。php2shellが「今夜中に当てる」レベルだったのに対し、Node.jsの今回分は「数日以内に計画的に当てる」くらいの温度感が妥当でしょう。

それでも、まったく侮れない理由

ただし「php2shellより軽い」は「軽い」という意味ではありません。比べる相手が悪すぎただけで、Node.js単体で見れば十分に重いリリースです。

  • リモートコード実行の恐れがある:メモリの範囲外書き込みは、攻撃者にサーバーを乗っ取られ得る種類の欠陥です。しかもBrotliの展開はNode.js本体の機能で、サポート中の3ライン全部が対象です。
  • 「攻撃者のサーバーにつなぐだけ」で届き得る:Brotli圧縮されたレスポンスを自動で展開するHTTPクライアントなら、攻撃者が用意したURLにアクセスさせるだけで不正なデータを読み込ませられる可能性があります。Webhook、URLプレビュー、クローラー、AIエージェントのWeb閲覧など、外部のURLに取りに行く処理は今どき珍しくありません。
  • TLSの検証バイパスは「気づけない」:サーバーが落ちるわけでもエラーが出るわけでもなく、偽の相手を本物として信用してしまうタイプの問題です。被害が起きても発覚しにくく、APIキーや認証情報の盗聴につながり得ます。
  • 修正の差分はすでに公開されている:協調公開とはいえ、修正版が出た時点で、差分から攻撃手法を割り出す作業は誰にでも始められます。「まだ攻撃報告がない」は「安全」とイコールではありません。
  • Node.jsは「使っている自覚がない場所」にも入っている:Webサーバーだけでなく、CIやビルドツール、社内の自動化スクリプト、Electronアプリ、サーバーレス関数など、棚卸しから漏れやすい場所に散らばっています。PHPより更新漏れが起きやすいとも言えます。

特に、外部から圧縮データを受け取るAPIサーバーや、ユーザー指定のURLに接続する機能を持つサービスは、「数日以内」を待たず優先度を上げて対応しましょう。

対応手順

1. 動いているバージョンを確認する

本番サーバーだけでなく、CI、ビルド用コンテナ、開発者のローカル環境もあわせて確認します。同梱ライブラリのバージョンはprocess.versionsで一覧できます。

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

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

2. 修正版へ更新する

使っているインストール方法に合わせて更新します。以下はnvmを使っている場合の例です。

# 使っているラインに合わせて、いずれかを実行
nvm install 26.12.1
nvm install 24.22.1
nvm install 22.23.4

# 更新後に確認
node -v

3. 見落としやすい場所を潰す

環境確認すること
Dockerコンテナベースイメージ(node:24など)を最新に取り直して再ビルド・再デプロイ。node:24.22.0のようにパッチ番号まで固定している場合は書き換えが必要
サーバーレス・PaaS実行環境のNode.jsはサービス側の更新を待つことになる。各サービスの対応状況を確認し、ランタイムのバージョンを選べる場合は切り替え
OSのパッケージディストリビューション提供のNode.jsは、修正の取り込み時期がNode.js本家とずれることがある。各ディストリのセキュリティ情報を確認
SEA・スナップショットCVE-2026-106074の影響を受けるため、修正版のNode.jsで作り直して配布し直す必要がある
Electronなど組み込み型Node.jsを内蔵するアプリは、そのアプリ側のアップデートが必要
EOLのNode.js(20.x以前)公式修正は出ない。サポート中のラインへの移行を進めるか、移行までの間は商用の延長サポートの利用を検討

npmでUndiciを直接インストールして使っている場合、そちらはNode.js本体の更新とは別物です。Node.jsに同梱されたUndiciとは別に、パッケージ側のセキュリティ情報も確認しておきましょう。

まとめ

Node.jsの2026年10月セキュリティリリースは、High 4件を含む計10件の修正です。中でもBrotli展開時の範囲外書き込みはリモートコード実行の恐れがあり、TLS証明書のホスト名検証バイパスやDNS解決時のNUL文字問題も、外部入力を扱うサービスにとっては見過ごせません。深刻度でも攻撃条件の広さでもphp2shellほどではありませんが、まったく侮れない内容であり、「定例だから後回し」にしてよいものではありません。

やるべきことは、バージョンの棚卸し、v26.12.1/v24.22.1/v22.23.4への更新、コンテナやSEAの作り直し、そしてEOLのNode.jsの移行計画です。PHPの対応で手一杯の週かもしれませんが、Node.jsもこの数日のうちに片付けておきましょう。


本記事は、Node.js公式のセキュリティリリース告知および各バージョンのリリースノート(2026年10月22日7時・日本時間時点の情報)をもとに整理したものです。公式告知には各脆弱性の詳しい技術解説やCVSSスコアが掲載されておらず、影響を受けやすい利用ケースなどの説明の一部は、告知のタイトルと修正コミットの内容から筆者が読み取ったものです。今後、詳細が公開されて評価が変わる可能性があるため、実際の対応にあたっては必ずNode.js公式の最新情報をご確認ください。

参考情報