Node.jsの2026年11月のセキュリティ更新|26.13.1・24.22.3・22.23.5で直ったHTTP/2・TLSの脆弱性と、修正前後で変わった挙動
Node.jsが11月11日に26.13.1・24.22.3・22.23.5のセキュリティ更新を公開
Node.jsプロジェクトは2026年11月11日(米国時間)、サポート中の3つの系列にセキュリティ更新を公開しました(Node.jsの公式ブログ)。修正版は26.13.1、24.22.3、22.23.5で、日本時間では12日未明に配布が始まりました。
公式ブログが挙げる脆弱性は16件で、深刻度「High」が7件、「Medium」が6件、「Low」が3件です。深刻度Highの7件は、Node.jsで動かすHTTP/2とTLS(HTTPSの暗号化通信)のサーバーに関わるもので、外部から送られた通信でサーバーのプロセスが止まる、別の接続のメモリの中身が相手に届く、といった内容です。HTTPの解析に使う部品llhttpなど、同梱の依存の更新も含みます。
この記事では、系列と使い方ごとに当てはまる脆弱性を整理し、修正前の版(26.13.0・24.22.2・22.23.4)と修正版を手元で動かして、上げると挙動が変わる3つの点を確かめました。最後に、Homebrew、Docker、Voltaでの上げ方をまとめます。
要点
26.13.1・24.22.3・22.23.5へ上げる
公式ブログと、修正前後の版を手元で動かした結果です。
Highの7件
HTTP/2とTLSのサーバー
外部からの通信でプロセスが止まる、別の接続のメモリが届く、などの内容です。
サーバー以外の使い方
プロキシ、https.Agent、権限モデル
HTTPSのリクエストを送る側や、--permissionで動かす場合のMediumとLowもあります。
手元で変わった挙動
プロキシのパスワードがエラー文で伏せられる
ほかに、https.Agentの接続の分け方と、権限モデルのワイルドカードの許可の範囲(24系・22系)が変わりました。
配布の状況
HomebrewとDockerの公式イメージに修正版
2026年11月13日7時37分(日本時間)の時点で、どちらも3系列の修正版が出ています。
使っているNode.jsが修正版かは、node -vで確かめる
まず、動かしているNode.jsの版を確かめます。サーバーやCIで使っている版も、同じコマンドで確かめられます。
node -v
26系(Active LTS)
26.13.1以降
26.13.0以前が今回の修正の対象。16件のうち15件が当てはまります(ワイルドカードの許可の1件は26.12.1で修正済み)。
24系(Maintenance LTS)
24.22.3以降
24.22.2以前が今回の修正の対象。16件すべてが当てはまります。
22系(Maintenance LTS)
22.23.5以降
22.23.4以前が今回の修正の対象。16件のうち11件が当てはまります。
件数は公式ブログの「Impact」の記載から数えました。22系に当てはまらない5件は、HTTP/2のCVE-2026-123863・123874・123828・123868と、TLSのCVE-2026-126051です。公式ブログはワイルドカードの許可の件(CVE-2026-106071)の対象に26系も挙げていますが、26系では2026年10月のセキュリティ更新(26.12.1)で先に直っているので、26系の件数から除きました。
2026年11月13日の時点で、各系列のリリースノートと公式ブログの一覧には食い違いがあります。リリースノートはLowの1件をCVE-2026-123873(ヒープスナップショットの書き出し先の確認)として載せ、22.23.5のリリースノートは公式ブログが24系と26系だけとする4件も載せています。この記事の件数と表は公式ブログの「Impact」に合わせ、26系の件数だけはCVE-2026-106071を除きました。
公式ブログは、サポートが終わった系列は常に影響を受けると書いています。20系はNode.jsのリリース予定のとおり2026年4月30日にサポートが終わっていて修正版が出ないので、22系以降へ移します。
Highの7件はHTTP/2・HTTPS・TLSのサーバー、MediumとLowはクライアントと権限モデルにも当てはまる
自分のアプリが当てはまるかは、Node.jsで何を動かしているかで分かれます。公式ブログの説明を、使い方ごとにまとめました。CVE番号のあとの()内は、公式ブログに書かれた対象の系列です。
| 使い方 | 主な脆弱性(深刻度) | 起きること |
|---|---|---|
| node:http2でHTTP/2のサーバーを動かす | High 4件: CVE-2026-123865・123866(22・24・26系)、123863・123874(24・26系)。Medium 3件: 123875(22・24・26系)、123828・123868(24・26系) | プロセスが止まる、メモリと接続が解放されない、別の接続の応答の中身が相手に届く。respondWithFile()でファイルを返す場合の2件を含む |
| node:httpsでHTTPSのサーバーを動かす | High 1件: CVE-2026-123864(22・24・26系) | ほかの接続のメモリ(TLSの秘密鍵を含む)がリクエストの本文に入り、本文を返す・保存するルートから相手に読まれる。リクエストの本文を受け取り終える前にres.flushHeaders()を呼び、あとで中身のあるres.end()を呼ぶハンドラーが条件 |
| TLSのサーバー(HTTPSを含む)でSNICallback・OCSPRequest・newSession・resumeSessionのフックか、addContext()を使う | High 1件: CVE-2026-126051(24・26系) | 外部からの接続でプロセスが止まる |
| ホスト名ごとにクライアント証明書の条件を変える(mTLS) | High 1件: CVE-2026-123872、Medium 1件: 123867(どちらも22・24・26系) | 許可されたホスト名で認証したクライアントが、TLS 1.2の接続のやり直し(再ネゴシエーション)でホスト名を変えるなどして、条件の厳しいホスト名に入れる |
| HTTPSのリクエストを送る、環境変数でプロキシを使う | Medium 2件: CVE-2026-123877・123871(22・24・26系) | 別の証明書の条件で確かめた接続が使い回される。プロキシのパスワードがエラー文に出る |
| --permissionで読み書きできる場所を絞る | Low 2件: CVE-2026-106071(22・24・26系。26系は10月の26.12.1で修正済み)、123829(22・24・26系。macOSとWindows) | 許可していないファイルを読み書きできる、許可していないファイル名が分かる |
ほかに、zlibで圧縮しながらparams()を呼ぶ場合のLow 1件(CVE-2026-123862、22・24・26系)があります。暗号化しないHTTP/1.1(node:http)だけのサーバーは、HTTPSのHigh 1件(CVE-2026-123864)の対象外と公式ブログに書かれていますが、HTTPの解析に使うllhttpの更新は3系列すべてに入っているので、同じく上げます。
修正版で、プロキシのエラー文・https.Agent・権限モデルのワイルドカードの許可が変わった
修正前の版と修正版を手元で動かし、上げると挙動が変わる3つの点を確かめました。確かめたのは、修正で変わる挙動のうち、サーバーを攻撃せずに観察できるものです。
プロキシのパスワードが、エラー文で伏せられるようになった(CVE-2026-123871)
Node.jsは、環境変数NODE_USE_ENV_PROXY=1を付けて起動すると、HTTP_PROXYなどに書いたプロキシを使って通信します。プロキシのURLの書き方が正しくないとERR_PROXY_INVALID_CONFIGというエラーで止まり、修正前の版ではこのエラー文にURLのユーザー名とパスワードがそのまま入っていました。エラー文はログやクラッシュの報告に残るので、そこからパスワードが漏れます。空白を含む正しくないURLにダミーのパスワードを入れて、両方の版で起動しました。
$ NODE_USE_ENV_PROXY=1 HTTP_PROXY='http://alice:S3cretPass@proxy example.com:8080' \
node -e "console.log('started')"
# 26.13.0(表示されたエラーのうち、メッセージの行)
Error [ERR_PROXY_INVALID_CONFIG]: Invalid proxy URL: http://alice:S3cretPass@proxy example.com:8080
# 26.13.1(表示されたエラーのうち、メッセージの行)
Error [ERR_PROXY_INVALID_CONFIG]: Invalid proxy URL: http://[redacted]@proxy example.com:8080
24.22.2と22.23.4でもパスワードが出て、24.22.3と22.23.5では[redacted]に伏せられました。修正前の版でこのエラーを出したことがある場合は、ログにプロキシのパスワードが残っていないかを確かめ、残っていたらそのパスワードを変えます。
https.Agentが、caを省いた接続とca: []の接続を分けるようになった(CVE-2026-123877)
https.Agentは、同じ相手への接続を使い回すために、接続先と証明書の設定から「キー」を作ります。修正前の版では、信頼する認証局を指定しない(caを省く)リクエストと、ca: []を渡したリクエストが同じキーになり、前者で確かめた接続やTLSのセッションを後者が使い回せました。caを省くと既定の認証局を信頼し、ca: []を渡すと既定の認証局を使いません。2つのキーを比べた結果です。
const https = require('https');
const agent = new https.Agent({ keepAlive: true });
const base = { host: 'example.com', port: 443, servername: 'example.com' };
console.log(agent.getName({ ...base }) === agent.getName({ ...base, ca: [] }));
// 26.13.0・24.22.2・22.23.4: true(同じキー)
// 26.13.1・24.22.3・22.23.5: false(ca: [] 側のキーに「a0」が入る)
修正版では、同じAgentで証明書の条件が違うリクエストを送っても、接続が分かれます。証明書の条件ごとにAgentを分けていたアプリは、この修正で挙動が変わりません。
権限モデルのワイルドカードの許可で、許可していないファイルを読み書きできなくなった(CVE-2026-106071)
権限モデル(--permission)は、Node.jsのプロセスが読み書きできる場所を、--allow-fs-readなどで許可した範囲に絞る機能です。公式ブログによると、--allow-fs-read=/etc/passwd.*のようなワイルドカードの許可が、/etc/passwdの読み取りまで許していました。--allow-fs-writeのワイルドカードも同じです。作業フォルダーにpasswdとpasswd.txtを置き、passwd.*だけを許可してpasswdを読みました。
$ node --permission --allow-fs-read="$PWD/perm/passwd.*" \
-e "require('fs').readFileSync('$PWD/perm/passwd', 'utf8'); console.log('read')"
# 24.22.2
read
# 24.22.3
Error: Access to this API has been restricted. Use --allow-fs-read to manage permissions.
code: 'ERR_ACCESS_DENIED',
22.23.4でも読めて、22.23.5ではERR_ACCESS_DENIEDになりました。--allow-fs-write="$PWD/permw/out.*"だけを許可してpermw/outへ書いた場合も、24.22.2と22.23.4は書けて、24.22.3と22.23.5はERR_ACCESS_DENIEDでした。26系は26.12.1で先に直っているので、26.13.0と26.13.1は読み書きともERR_ACCESS_DENIEDでした。修正版へ上げると、ワイルドカードの許可に頼って別のファイルを読み書きしていたコードはERR_ACCESS_DENIEDで止まるので、そのファイルを許可に足します。
修正前(26.13.0・24.22.2・22.23.4)
- プロキシのエラー文にパスワードが出る
- caを省いた接続とca: []の接続が同じキー
- passwd.*の許可でpasswdを読み書きできる(24.22.2・22.23.4)
修正版(26.13.1・24.22.3・22.23.5)
- パスワードは[redacted]に伏せられる
- 2つの接続は別のキーになる
- passwdの読み書きはERR_ACCESS_DENIEDになる
Homebrew・Docker・Voltaで修正版へ上げる
2026年11月13日7時37分(日本時間)の時点で、主な配布経路には3系列の修正版が出ていました。
Homebrew
node(26.13.1)、node@24(24.22.3)、node@22(22.23.5)が修正版です。brew upgrade nodeのように、使っている名前を指定して上げます。
Docker(公式イメージ)
node:26とnode:ltsはnode:26.13.1、node:24はnode:24.22.3、node:22はnode:22.23.5と同じイメージを指していました。手元のイメージを取り直して(docker pull)、ビルドし直します。Dockerfileでnode:24.22.2のように版を固定している場合は、修正版の番号に書き換えます。
Volta
volta install node@26.13.1のように版を指定します。この記事の検証でも、Voltaで各版を取得しました。Voltaは開発元のREADMEで保守の終了(unmaintained)を告知し、miseへの移行を勧めています。
上げたあとは、node -vで版を確かめます。同梱の部品の版はnode -p process.versionsで表示でき、修正版ではHTTPの解析に使うllhttpが3系列とも9.4.4になっていました。2026年10月のセキュリティ更新で変わった挙動は、10月の更新の記事で扱っています。
参考資料
- Wednesday, November 11, 2026 Security Releases(Node.jsの公式ブログ)
- Node.js 26.13.1、24.22.3、22.23.5のリリースノート
- 修正のコミット「http: redact proxy credentials in invalid proxy URL errors」
- 修正のコミット「https: isolate Agent TLS policy keys」
- Homebrewのnode、Docker Hubのnode公式イメージ
- Wednesday, October 21, 2026 Security Releases(Node.jsの公式ブログ、26.12.1の修正)
- Node.js Release(各系列のサポート期間)
- Node.jsの2026年10月のセキュリティ更新|24.22.1などで変わったTLS・DNS・権限チェックの挙動を、修正前の版と比べて検証(この記事の関連記事)
検証環境
- macOS 27.0.1(Apple Silicon)、Volta 2.0.2
- Node.js 26.13.0・26.13.1・24.22.2・24.22.3・22.23.4・22.23.5
- 検証日: 2026年11月13日
この記事は、AIが調査と下書きを担当し、上記の環境で実際に動かして結果を確かめ、下書きとは別の担当が公開前に本文と出典を確認しています。制作と訂正の方針は編集・訂正方針で公開しています。










