# Node.js・npmの脆弱性 2026年10月:しくみと対策(Brotli・TLS・Next.js・npmワーム) # Node.js and npm vulnerabilities, October 2026: how they work and what to do > 株式会社Bekito(Bekito Inc.、東京)による解説。人が読むページ(日本語・英語、動く図つき): https://bekito.co.jp/security/nodejs/ 。このファイルはAIエージェント・LLM向けの同じ内容のテキスト版です。2026年10月22日18時(日本時間)時点。 > Explainer by Bekito Inc. (Tokyo). Human-readable page (Japanese and English, with animated diagrams): https://bekito.co.jp/security/nodejs/ . This file is the same content as plain text for AI agents and LLMs. As of 18:00 JST, 22 October 2026. ## 要点 (Key points) - Node.jsは2026年10月21日のセキュリティリリースで10件を修正(高4件・中3件・低3件)。修正版は 22.23.4・24.22.1・26.12.1。 - 最も重いのは CVE-2026-111497:同梱のBrotliデコーダーが出力バッファの外へ書き込む(命令実行のおそれ)。fetch() は Content-Encoding: br の応答を自動で解凍するため、悪意あるサーバーにつなぐだけで起きる恐れがある。 - TLS証明書の名前確認のすり抜け(CVE-2026-106069、CVE-2026-105483、CVE-2026-106072)と、dns.resolve のNUL文字の切り捨て(CVE-2026-105482)も修正。 - サポート切れ(修正なし):Node.js 18(2025-04-30終了)、20(2026-04-30終了)、23(2025-06-01終了)、25(2026-06-01終了)。 - 10月22日時点で、Node.jsの10件はCISA KEVに入っておらず、公開された攻撃コードも見つかっていない。NVDとJVN iPediaにはまだ登録されていない。npx is-my-node-vulnerable もまだ対応していない。 - Next.js・Reactは10月14日に重大な脆弱性を修正(next 16.4.1・15.5.28)。use cache の命令実行(CVSS v4 9.5)、画像の最適化でのSVG処理による命令実行 CVE-2026-96889(9.5、原因はlibrsvgの解放後使用、sharp 0.35.5以上で回避、JPCERT/CCが実証コードの公開を確認)、Server ActionsのDoS(8.2)。 - npmではワーム型のサプライチェーン攻撃が続く:2026年8月4日の「Shai-Hulud」再来(400以上のパッケージ/Elastic、1,300以上の版/シンガポールCSA)、10月8日のTensorlake(tensorlake@0.5.144)。10月13日にはnpm「信頼済み公開」の不備(1,500以上のパッケージが対象、悪用未確認)が公表。 - 守りの基本:ロックファイル+npm ci、インストールスクリプトを止める(npm 12は既定で停止、npm 11以前は ignore-scripts=true)、公開直後の版を待つ(min-release-age、npm 11.10以降)。 - Node.js fixed ten flaws on 21 October 2026 (4 high, 3 medium, 3 low). Fixed in 22.23.4, 24.22.1 and 26.12.1. - Worst: CVE-2026-111497, an out-of-bounds write in the bundled Brotli decoder (may allow code execution). fetch() automatically decompresses Content-Encoding: br responses, so connecting to a malicious server may be enough. - Also fixed: TLS certificate hostname bypasses (CVE-2026-106069, CVE-2026-105483, CVE-2026-106072) and dns.resolve truncating at NUL (CVE-2026-105482). - End-of-life (no fixes): Node.js 18, 20, 23, 25. - As of 22 October: none of the ten is on CISA KEV, no public exploit found; not yet in NVD or JVN iPedia; is-my-node-vulnerable not yet updated. - Next.js/React fixed critical flaws on 14 October (next 16.4.1 / 15.5.28), including CVE-2026-96889 (SVG image optimisation RCE via librsvg; sharp >= 0.35.5 mitigates; JPCERT/CC reports public PoC). - npm worms continue: Shai-Hulud returned on 4 August 2026; tensorlake@0.5.144 on 8 October; the Trusted Publishing flaw was disclosed on 13 October. - Basics: lockfile + npm ci, block install scripts, wait out brand-new versions (min-release-age). ## Node.js 2026年10月21日の10件 (The ten Node.js CVEs) - CVE-2026-111497 High(26・24・22):Brotliデコーダーの範囲外書き込み。DecodeBlockTypeAndLength で、ブロックの種類を1つと宣言したストリームが切り替えを試みると出力バッファの外へ書き込んでいた。修正(Brotli本家コミット 0ed4268a)で BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH として早期に拒否。zlib.brotliDecompress*()、createBrotliDecompress()、fetch() から到達。Brotli本家も1.2.1・1.1.1・1.0.10を同日公開。 / Brotli decoder out-of-bounds write. - CVE-2026-105482 High(26・24・22):dns.resolve* がNUL文字を含む名前を手前で切る(example.com\0.trusted.corp が example.com として解決)。修正後は ERR_INVALID_ARG_VALUE。 / dns.resolve truncates at NUL. - CVE-2026-106069 High(26・24・22):数字の形のホスト名を正規化してから証明書と照合していたが、OSの名前解決は元の文字列を別のアドレスとして解釈できた(例:0127.0.0.1 を8進数として 87.0.0.1 と読む)。 / TLS hostname bypass when the host loosely resolves to an IP. - CVE-2026-105483 High(26・24):全角数字のIPアドレスで名前確認をすり抜け。 / Full-width digit IP bypass. - CVE-2026-105481 Medium(26・24・22):keep-aliveの接続が、リクエスト前に書かれた応答を処理する。 / Keep-alive socket processes a pre-request response. - CVE-2026-106072 Medium(26・24・22):正規でない形のIPv4で、証明書のDNS名がIPアドレスの相手を認証。 / DNS SAN authenticates IP endpoint for non-canonical IPv4. - CVE-2026-106074 Medium(26・24・22):crypto.randomUUID()・randomInt() の乱数キャッシュが起動スナップショットやSEAに保存され、同じ値をくり返す。 / Entropy caches saved into snapshots/SEAs. - CVE-2026-106070 Low(26):ZipFile がヘッダー確認失敗後に攻撃者のデータを返す。 / ZipFile returns attacker bytes. - CVE-2026-106071 Low(26):権限モデルのワイルドカードで過剰な権限。 / Permission Model wildcard over-grant. - CVE-2026-106073 Low(26・24・22):権限モデルを fs.realpathSync ですり抜け。 / Permission Model bypass via fs.realpathSync. - 同じリリースで:秘密鍵が漏れたと報告されたeMudhra/emSignの中間証明書8枚を拒否、OpenSSL 3.5.9、c-ares 1.34.9、undici 6.29.1/7.30.1/8.12.2、SQLite 3.53.4(22系)、NSS 3.131.1。Node.js 26.12.1 に同梱のnpmは11.20.0のまま。 / Same release: eMudhra intermediates blocked; dependency updates; bundled npm still 11.20.0. ## 系列とサポート (Release lines) - 26:最新、2026年10月28日にLTS、2029-04-30まで。修正版 26.12.1。 - 24:LTS(保守期間へ)、2028-04-30まで。修正版 24.22.1。 - 22:保守LTS、2027-04-30まで。修正版 22.23.4。 - 25・23・20・18:サポート終了、修正なし。 - Node.js 27から、すべての系列がLTSになる新しいリリースの方式(毎年10月に分岐、36か月)。 ## Next.js・React(2026年10月14日) (Next.js and React) - GHSA-673q-mjm6-r5xr / React GHSA-xqc2-xf4c-x3h3:Critical 9.5。next 16.0.0〜16.4.0。use cache の関数が複数の型付き配列を返すとき、ログインなしで命令実行。回避策なし。react-server-dom-webpack/parcel/turbopack は 19.0.9・19.1.10・19.2.9・19.3.1 で修正。 - CVE-2026-96889 / GHSA-2464-fhr4-w9xw:Critical 9.5(Next.js)。next 10.0.0〜15.5.27、16.0.x〜16.4.0。画像の最適化(/_next/image)でSVGを処理するときの命令実行(glibcのLinux)。原因はlibrsvgの解放後使用(入れ子のXIncludeで重複したエンティティ名)。sharp 0.35.5(librsvg 2.63.2)以上で回避。JPCERT/CC Weekly Report 2026-10-21 が実証コードの公開を確認。 - GHSA-p3m5-59mp-jv5r / React GHSA-h3gv-c5rc-p453:High 8.2。next 13.0.0〜15.5.27、16.0.0〜16.4.0。Server Actionsを持つApp RouterのアプリでCPUを使い切りサーバーが止まる。Pages Routerのみは対象外。 - 9月22日(ImageResponseの命令実行、16.3.6で修正)、9月30日(SSRF CVE-2026-94483、キャッシュ汚染など、16.3.8・15.5.27で修正)にも修正あり。 ## npmのワーム型攻撃 (npm worms) - しくみ:乗っ取られたパッケージの新しい版を入れると、preinstall・postinstall スクリプトが自動で動き、PC・CIにあるnpm・GitHub・クラウドの鍵、SSHの鍵、.env、AIコーディングツールの設定を盗んで外へ送る。盗んだnpmの鍵で被害者が管理する別のパッケージにも感染版を公開し、それを入れた別の開発者へ広がる。 - tensorlake@0.5.144(2026-10-08 01:12 UTC公開):preinstall が lib/setup.mjs を実行しBunで本体を起動。指令サーバーの場所はイーサリアムのスマートコントラクトから取得、偽のGitHub Actionsのワークフローを仕込み、「gh-token-monitor」の常駐(Windowsのタスク、Linuxのサービス、macOSのLaunchAgent)を残す。鍵を無効化する前に常駐を消すこと(Socket)。正規のリリースの仕組みから公開されたため provenance も正しく付いていた。 - 2026年8月4日の波(Shai-Hulud「Here We Go Again」):keyv 6.0.0、cacheable 2.5.1、flat-cache 6.1.24、file-entry-cache 11.1.6、cache-manager 7.2.10 など。2要素認証のないnpmの鍵を使って次々と公開。Claude CodeやVS Codeの設定にフックを書き足して居座る。 - npm「信頼済み公開」の不備(2026-10-13公表):公開元のGitHubリポジトリを名前だけで照合していたため、名前の変わった・消えたリポジトリの名前を取り直すと公開権限を得られた。1,500以上のパッケージが対象、悪用は未確認。GitHubは10月2日に、未使用の設定を48時間で失効させる対策。 ## いますぐやること (What to do now) 1. Node.jsを 22.23.4・24.22.1・26.12.1 以降へ。20以前と25は22・24・26へ移行。Dockerはベースイメージを取り直して作り直し、コンテナ内で node -v を確認。 2. next を 16.4.1 か 15.5.28 へ、sharp を 0.35.5 以上へ、React Server Componentsのパッケージを 19.0.9・19.1.10・19.2.9・19.3.1 へ。OSのlibrsvgも更新。確認:npm ls next sharp react-server-dom-webpack 3. npmの入れ方を固める:package-lock.json をコミットし npm ci、npm 12でインストールスクリプトを既定で停止(npm install-scripts approve で個別に許可、strict-allow-scripts=true で未確認を失敗に)、npm 11以前は ignore-scripts=true、min-release-age=<日数>(npm 11.10以降、緊急の修正も待たされる点に注意)、公開する側はnpmの鍵に2要素認証と npm trust list の確認。 4. 乗っ取られた版を入れていないか、ロックファイルとビルドログで tensorlake@0.5.144 や8月の感染版を探す。見つかったら端末を隔離し、常駐を先に消してから npm・GitHub・クラウド・AIツールの鍵をすべて入れ替え、「chore: update config」という覚えのないコミットを探す。 5. npm audit だけでは、乗っ取られたばかりの新しい版を入れる瞬間は防げない。 ## Bekitoのサーバー (Bekito's own servers) Bekitoのサーバーで動くNode.jsは、すべて10月21日の修正版(22.23.4・24.22.1)に更新済み(2026年10月22日に確認)。会社のWebサイトのAPIはnpmの外部パッケージを使わずNode.jsの標準機能だけで作られている。製品のビルドは npm ci で行っている。 All Node.js on Bekito's servers runs the 21 October fixed releases (checked 22 October 2026). The company website's API uses no npm packages; products are built with npm ci. ## 出典 (Sources) - https://nodejs.org/en/blog/vulnerability/october-2026-security-releases (2026-10-21) - https://nodejs.org/en/blog/release/v22.23.4 ・ https://nodejs.org/en/blog/release/v24.22.1 ・ https://nodejs.org/en/blog/release/v26.12.1 - https://github.com/nodejs/Release#release-schedule - https://github.com/google/brotli/releases - https://nextjs.org/blog/nextjs-security-update-october-14-2026 - https://nextjs.org/blog/september-2026-security-release - https://github.com/lovell/sharp/security/advisories/GHSA-wq5f-xc86-pv6w - https://www.jpcert.or.jp/wr/2026/wr261021.html - https://www.socket.dev/blog/tensorlake-compromise - https://www.elastic.co/security-labs/threat-command/shai-hulud-chaindrop-npm-supply-chain - https://www.csa.gov.sg/alerts-and-advisories/advisories/ad-2026-009/ - https://www.helpnetsecurity.com/2026/10/13/slugfest-npm-trusted-publishing-flaw/ - https://github.blog/changelog/2026-10-02-unvalidated-npm-trusted-publishing-configurations-now-expire/ - https://github.com/npm/cli - https://github.com/nodejs/undici/security/advisories ## 関連 (Related) - PHPの脆弱性「php2shell」: https://bekito.co.jp/security/php/ (テキスト版: https://bekito.co.jp/security/php/llms.txt) - Bekitoがサービスを守るしくみ: https://bekito.co.jp/security/ (テキスト版: https://bekito.co.jp/security/llms.txt) - 日本のサイバー被害ダッシュボード: https://bekito.co.jp/security/japan/ - 問い合わせ: https://bekito.co.jp/#contact / hello@bekito.co.jp