2026年10月21日、PHPの重大な脆弱性(通称PHP2Shell)の修正版が出たのと同じ日に、Node.jsも10件の脆弱性(悪用されうるセキュリティ上の欠陥)を直す修正版を出しました。

Node.js(ノードジェイエス)は、JavaScriptというプログラミング言語をサーバーやパソコンで動かすソフトです。Next.js(Webサイトを作る道具)で作ったサイトや、Claude Codeのようにnpm(プログラムの部品を配る仕組み)で入れる道具の土台にもなっています。この記事では、今回のNode.jsの脆弱性で何をすればいいかを、Node.jsの公式発表をもとに整理します。10月23日時点の情報です。

直す版は3つ

修正版は、系統ごとに次の3つです。系統とは、24や22のような最初の数字のまとまりのことです。

使っている系統

この版以降に上げる

26

26.12.1

24

24.22.1

22

22.23.4

20や25のように、サポートが終わった系統には修正版が出ません。Node.jsの公式発表は、サポートが終わった版は今回の欠陥の影響を受けると書いています。公式には、更新以外の回避策も示されていません。

いちばん重いのは圧縮データの欠陥

10件のうち、公式が重大度Highとしたのは4件です。中でも注意が要るのが、CVE-2026-111497(脆弱性に付く世界共通の番号)です。

Brotli(ブロトリ)は、Webでよく使われるデータの圧縮形式です。Node.jsには、Brotliで圧縮されたデータを元に戻す(展開する)仕組みが入っています。細工した圧縮データを展開させると、メモリの決められた範囲の外に書き込んでしまう、というのが今回の欠陥です。公式の発表は、外からプログラムを動かされる(リモートコード実行)おそれがあるとしています。

Vercel(Webサイトの公開サービスの会社)の告知によると、研究者は修正前の版で、Node.jsで動くアプリと同じ権限で命令を実行できることを示しています。

ほかのHighの3件は、TLS(通信を暗号化する仕組み)で相手のサーバーを確かめる処理をすり抜けられる欠陥が2件と、DNS(ドメイン名を住所に変換する仕組み)の名前の扱いの欠陥が1件です。

自分は対象か

Brotliの欠陥が問題になるのは、攻撃者の用意した圧縮データを展開する場面です。Node.jsが自分から展開するわけではなく、アプリや、アプリが使っている部品が展開したときに問題になります。Vercelの告知では、次の2つの経路が挙がっています。

  • 外から届くリクエスト(サーバーへ送られるデータ)の中身が、Brotliで圧縮されていて、それを展開するサーバー
  • 外部のサーバーからデータを取ってきて、その応答がBrotliで圧縮されていたときに展開するアプリ

2つ目は気づきにくい経路です。たとえば、利用者が入力したURLのページを取りに行ってプレビューを作る機能や、外部サービスとのデータのやりとりを中継する機能がこれにあたります。

パソコンで開発に使っているだけのNode.jsは、急ぎ度は低めです。Claude Codeを使うために入れた人の多くはこれにあたります。ただ、知らないサイトのデータを取りに行くツールを動かすこともあるので、次の更新のついでに上げておくのが無難です。

バージョンの確かめ方と上げ方

ターミナル(文字でパソコンに指示を出す画面)で次を打つと、いま使っているバージョンが出ます。

node -v

この記事を書く前に私のMacで試したら、v24.3.0と出ました。系統は24でサポート中ですが、修正版の24.22.1よりずっと前の版でした。

上げ方は、Node.jsをどう入れたかで変わります。覚えていなければwhich nodeと打ち、出てきた場所に.nvmが入っていればnvm、homebrewが入っていればHomebrewです。

# nvm(複数のNode.jsを切り替える道具)で入れた場合
nvm install 24
nvm alias default 24
node -v

# Homebrew(Mac用のソフト管理の道具)で24を入れている場合
brew upgrade node@24

Homebrewでnodeという名前のまま入れている場合、brew upgrade nodeを打つと、そのときいちばん新しい系統に上がります。10月23日時点では26です。24のままにしたいなら、上のようにnode@24を使います。

公式サイトのインストーラーで入れた場合は、Node.jsのダウンロードページから新しい版を入れ直します。

サーバーやDockerで忘れがちなこと

サーバーで動かしている場合は、Node.jsを更新したあとにアプリを再起動しないと、古い版のまま動き続けます。

Docker(アプリを箱に詰めて動かす仕組み)を使っている場合は、もう1段の注意が要ります。箱の中のNode.jsは、サーバー本体を上げても古いままです。元になるイメージ(箱のひな形)を取り直して、箱を作り直す(再ビルドする)必要があります。

docker build --pull --no-cache -t myapp .

myappは自分のアプリの名前に置き換えます。--pullはひな形を取り直す指定です。Dockerfile(箱の作り方を書いたファイル)のFROMの行で24.3のように細かい版まで書いている場合は、取り直しても上がらないので、そこも書き換えます。

自社のサイトやツールを外注している場合は、Node.jsを使っているか、修正版に上げたかを制作会社に確かめてください。

VercelのようにNode.jsの面倒を見てくれるホスティング(サイトを置いて公開するサービス)では、22と24の修正版は会社側が順に入れていくとしています。ただし20を指定しているプロジェクトは修正版が出ないので、22か24に設定を変えて作り直す必要があります。20については別の記事にまとめました。

PHP2Shellと比べてどうか

同じ日に出たPHP2Shellと比べると、Node.jsの脆弱性は、国内でサービスが一斉に止まるような騒ぎにはなっていません。10月23日時点で、公式の発表には実際に悪用されているかどうかは書かれていません。

ただ、修正版が出ると、修正の差分から欠陥の中身を逆算されます。研究者がコマンドの実行を示している以上、公開しているサーバーは数日のうちに上げておきたいところです。

複数のサーバーの版をまとめて確かめるなら、Claude Codeに一覧を作らせる手もあります。PHPで試した手順が参考になります。