Node.js 26.12.1など公開、Brotliの脆弱性でRCEのおそれ

Node.js 26.12.1など公開、Brotliの脆弱性でRCEのおそれ ニュース

Node.jsプロジェクトは2026年10月21日、セキュリティリリースを公開しました。修正版は v22.23.4、v24.22.1(Latest LTS)、v26.12.1(Latest Release)で、今回修正された中で最も高い重大度はHIGHです。10件の脆弱性のうち、Brotliデコーダの範囲外書き込み(CVE-2026-111497)は、リモートコード実行につながる可能性があると説明されています。node:zlib で信頼できないBrotliデータを展開しているアプリは、更新を急ぐ対象です。

v22.23.4・v24.22.1・v26.12.1 で直った10件

Node.js公式ブログの一覧を、重大度順に整理します。

Node.js 2026年10月のセキュリティリリースで修正された脆弱性(Node.js公式ブログより)
CVE 重大度 概要 対象系統
CVE-2026-111497 HIGH Brotliデコーダの範囲外書き込み。RCEの可能性(node:zlib) 26 / 24 / 22
CVE-2026-105482 HIGH NUL文字を含むホスト名が切り詰められ、別名のレコードが返る(dns.resolve*()、dns.reverse()) 26 / 24 / 22
CVE-2026-105483 HIGH 全角数字のIPv4に対し、IPアドレスSANのない証明書で認証される(tls.checkServerIdentity()) 26 / 24
CVE-2026-106069 HIGH 先頭ゼロ表記のIPv4(0127.0.0.1 など)で、接続先と異なるIPの証明書で検証される 26 / 24 / 22
CVE-2026-105481 MEDIUM keep-aliveソケットに、リクエスト前に届いた応答が有効な応答として扱われる 26 / 24 / 22
CVE-2026-106072 MEDIUM DNS SANのみの証明書で、非正規表記のIPv4(0177.0.0.1 など)が認証される 26 / 24 / 22
CVE-2026-106074 MEDIUM スナップショット/SEAに、randomUUID()・randomInt() のエントロピーキャッシュが保存され、プロセス間で同じ値が繰り返される 26 / 24 / 22
CVE-2026-106070 LOW ZIP検証失敗後に、攻撃者が制御するバイト列が返される(zlib.ZipFile) 26
CVE-2026-106071 LOW Permission Modelで、ワイルドカード指定が、プレフィックスより短いパスにも一致する 26
CVE-2026-106073 LOW fs.realpathSync() で読み取り権限のチェックが行われない(–permission) 26 / 24 / 22

Security NEXT の記事でも、CVEベースで10件、重要度の内訳は「High」4件、「Medium」3件、「Low」3件、「Critical」なしと伝えています。

Brotliの範囲外書き込みは、node:zlibで展開するアプリが対象

いちばん影響が大きいのは CVE-2026-111497 です。公式ブログの説明では、Brotliデコーダが、不正なブロック切り替えを「一時的な入力不足」として扱ったため、ストリーミングデコーダが8バイトの内部バッファに入力を追記し続け、範囲外書き込みが起きます。攻撃者が細工したBrotliデータを node:zlib で展開させると、クラッシュ、プロセスメモリの漏えい、リモートコード実行につながる可能性があるとされています。

対象は26.x・24.x・22.xのすべてです。公式ブログに個別の回避策の記載はなく、修正版への更新が求められます。アップロードされたファイルや、外部APIのレスポンス、プロキシ越しのコンテンツなどを、Brotliで展開しているコードがないか、優先して洗い出しておきたいところです。

ホスト名とIPの検証で、検証対象と接続先がずれる

HIGHの残り3件は、ホスト名やIPアドレスの検証と、実際の接続先がずれる問題です。

  • CVE-2026-105482:dns.resolve*() は、ホスト名をC文字列として c-ares に渡すので、attacker.example\0.trusted.example は attacker.example として解決され、エラーを出さずに、そのレコードを返します。ドメインのallowlistで検証したあとに、dns.resolve*() で解決するアプリでは、検証した名前と別の名前のレコードで動くおそれがあります。
  • CVE-2026-105483:tls.checkServerIdentity() は、全角数字などの非ASCII文字で書かれたIPv4をIPアドレスと認識せず、証明書のDNS名やCommon Nameと照合していました。DNS:127.0.0.1 などを含む証明書が、本来発行されていないIPエンドポイントに対して受け入れられるおそれがあります。公式ブログによると、CVE-2026-48618 の修正後のリグレッションで、対象は26.xと24.xです。
  • CVE-2026-106069:tls.checkServerIdentity() が従うWHATWG URLの規則では、先頭ゼロの8進表記の 0127.0.0.1 は 87.0.0.1 と解釈されますが、macOSなど一部のプラットフォームのOSリゾルバは、10進の 127.0.0.1 として接続します。検証対象と実際の接続先が食い違います。

MEDIUMの CVE-2026-106072 も同じ系統の問題で、悪用には、信頼されたCAが発行した数値DNS SANを持つ証明書と、glibcのように非正規表記を受け入れるリゾルバが必要とされています。

依存ライブラリとEOL版

今回のリリースでは、依存ライブラリも更新されています。c-ares・ca-cert(eMudhra Intermediate CA Compromise)・Undici は26・24・22の全系統、OpenSSL は24と22、SQLite は22のみです。

公式ブログは、EOL(サポート終了)のバージョンは常に影響を受けるとしており、サポート中の最新版への移行を勧めています。現在のバージョンは、次のコマンドで確認できます(コマンドは筆者の補足で、公式ブログの記載ではありません)。

node -p "process.versions.node"

Brotliを展開しているかで優先順位が変わる

ここからは筆者の見方です。10件を一度に読むと、どれから手を付けるか迷いますが、実際の優先順位は、アプリが何を使っているかで変わってきます。信頼できない入力をBrotliで展開するサービスは、いちばん先に更新を検討したいところです。ホスト名検証やTLSのIP検証を自前で組んでいるコードは、次に確認したいコードです。

一方、Permission Modelに関する2件(CVE-2026-106071と106073)は、どちらも --permission で起動し、--allow-fs-* で権限を絞っている環境が前提の問題です。まずは、本番で動いているNode.jsのバージョンを一覧にして把握するところから始めるのが現実的だと考えます。

参考にした公式情報・報道

2026年10月24日時点の情報です。

タイトルとURLをコピーしました