デイリー · 記事 02 · 9 分で読む
- セキュリティ
- オープンソース
Node.js、リモートコード実行の脆弱性などを修正するセキュリティリリースを公開
10月21日の公式発表・22日に入力経路と被害の条件を解説補強
要約・概要
Node.jsは10月21日、セキュリティ修正版22.23.4・24.22.1・26.12.1を公開しました。細工されたBrotliデータの展開からコード実行につながるおそれがあり、被害範囲はプログラムの権限に左右されます。
サービスが外から受け取った圧縮データを展開する瞬間、そのデータがサーバーへの侵入口になることがあります。Node.jsが10月21日に公開した修正版は、この処理から攻撃者のコード実行につながる欠陥を直したものです。架空の天気情報サービスを使って、入口と被害をたどります。
主な事実
Node.jsは、ブラウザーの外でJavaScriptのプログラムを動かす実行環境です。Node.jsプロジェクトは10月21日にセキュリティ情報を出し、サポート中の3系列の修正版22.23.4・24.22.1・26.12.1を公開しました。リモートコード実行につながるおそれがある欠陥はCVE-2026-111497です。CVEは公開された脆弱性ごとに付く固有の番号で、この欠陥はBrotli形式で圧縮されたデータを展開するコードにあります。今回の最高深刻度はHighです。公式セキュリティ情報
| 系列 | 修正版 | 公式リリース記録 |
|---|---|---|
| 22.x | 22.23.4 | 22.23.4リリース |
| 24.x | 24.22.1 | 24.22.1リリース |
| 26.x | 26.12.1 | 26.12.1リリース |
Node.jsのリリース計画では20.xは4月30日でサポートが終わった系列で、こうした系列には修正版がありません。公式情報は、サポート終了版がセキュリティリリースのたびに必ず影響を受けると書いています。公式セキュリティ情報
同じリリースには、DNS(サーバー名からIPアドレスを調べる機能)とTLS(HTTPS通信を暗号化し、相手サーバーの証明書を確かめる仕組み)に関する欠陥の修正と、c-ares・OpenSSL・Undiciなど同梱部品の更新も入っています。系列によって対象の欠陥は少しずつ違います。例えば、IPアドレスを全角数字で書くと証明書の検証をすり抜けるCVE-2026-105483は、24.xと26.xだけが対象です。

1. Node.jsはどこで動いているか
Webサービスでは、Node.jsが使われる場所はおもに2つです。サーバーでAPIの要求に答えるか、公開前にWebサイトのファイルを作るビルドツールとして動きます。架空の案内サイトで考えると、開発者がNode.jsでページを先にHTMLファイルにしておき、公開サーバーは完成したファイルを返すだけです。訪問者がページを開いてもNode.jsは動きませんが、ファイルを作るビルド環境にはNode.jsがあります。
| どこにあるか | 今回の修正版との関係 |
|---|---|
| 訪問者のブラウザー | 関係なし。ブラウザーは自前のエンジンでJavaScriptを動かす |
| 要求に答えるNode.jsサーバー | サーバー・コンテナー・管理型ホスティングのNode.jsを入れ替える |
| サイトのファイルを作るビルド環境 | ビルドツールが使うNode.jsを入れ替える |
猫と一緒に読み解く Q&A
- 猫の研究員
うちのサイトは静的ファイルを配るだけなんだけど、今回の更新は気にしなくていい?
ポケットノートビルド環境は入れ替えが必要だよ。訪問者の要求でNode.jsは動かなくても、そのファイルを作るビルドサーバーでは動いているからね。
2. 送信フォームがなくても届く圧縮データ
架空の天気情報サービスを考えてみます。自分のNode.jsサーバーが外部の天気提供サーバーに情報を要求し、戻ってきた圧縮データを展開して気温を表示します。BrotliはWebのデータを小さく送るための圧縮形式で、Node.jsには元の情報を読めるように展開する機能もあります。公式文書にも、外部のHTTP応答を受け取りBrotliで展開する例が載っています。公式の圧縮応答処理例
普段は気温の情報が届きます。しかし、攻撃者が応答の内容を操作でき、細工したデータが未修正のNode.jsの脆弱なBrotli処理まで届けば、そこが攻撃の入口になります。送られてくるのは、運営者が実行を依頼したプログラムではなく、アプリが読むつもりだったデータです。
この経路があるかは実装によって変わります。送信されたBrotliファイルを展開する機能、外部の圧縮応答を読む機能、ビルド中に外部データを取得して展開する処理を調べる理由です。あらゆるファイル送信やHTTP要求が自動的に今回の欠陥を動かすわけではありません。
猫と一緒に読み解く Q&A
- 猫の研究員
利用者の入力欄がないのに、攻撃者のデータはどこから入るの?
ポケットノートこの例では、自分のサーバーが別のサーバーから取得する応答が入口だよ。攻撃者が内容に影響でき、アプリが脆弱なBrotli処理で展開する必要があるから、フォームの有無だけでは判断できない。
- 猫の研究員
天気提供会社のデータを、攻撃者はどうやって変えるの?
ポケットノート提供サーバーが侵害されたか、アプリが攻撃者の運営するサーバーの応答を読む場面を仮定しているよ。すべての外部APIが操作されるという話ではなく、攻撃者が影響できるデータが入る経路を探すんだ。
3. データを読むだけで、なぜコード実行に?
メモリは、動いているプログラムが作業中の情報を一時的に置く場所です。展開処理は確保した範囲に結果を書かなければなりませんが、今回の欠陥はその外まで書いてしまう「範囲外書き込み」です。Node.jsはCVE-2026-111497がリモートコード実行、略してRCEを可能にすると説明しています。公式セキュリティ情報
作業台に「受け取ったデータの置き場」と「作業に必要な別のメモ」があると考えてください。自分の置き場だけに書けばメモは残りますが、境界を越えて上書きすると、そのメモを頼りにするプログラムも誤動作し得ます。実際のメモリにはデータのほかに実行を続けるための情報もあり、それが壊れることで、条件によっては攻撃者が実行を別の方向へ変えられます。MITREの範囲外書き込みの説明
危険は「気温の数字が間違って見える」だけにとどまらない場合があります。依頼した仕事はデータを読むことでも、欠陥を悪用すると攻撃者が望む別の仕事までさせられるおそれがある、ということです。大きなデータやメモリ不足がすべてRCEになるわけではなく、この記事では攻撃入力や成功条件を再現していません。
猫と一緒に読み解く Q&A
- 猫の研究員
データに「パスワードを送れ」と書けば、そのまま従うの?
ポケットノート文章を読んで命令として従う問題ではないよ。展開コードのバグで内部情報が誤って上書きされ、その影響で実行の流れが変わり得るという話なんだ。
- 猫の研究員
境界を越えたら、毎回乗っ取りに成功するの?
ポケットノート毎回ではないよ。プロセスが停止する場合もあり、コード実行の成否はメモリの状態や実行環境などの条件に左右される。
4. 攻撃が成功した場合の被害
RCEが成立すると、攻撃コードは通常、侵害されたプログラムの権限で動きます。Node.jsが読めるファイルや秘密情報、書き換えられるファイル、接続できるデータベースが被害範囲を左右します。サーバーの最高管理者権限や、会社の別のサーバーへの権限が自動的に手に入るという意味ではありません。
以下は想定される被害の例です。今回の脆弱性で特定のサービスに起きた事件や、実験で確認した結果ではありません。
| 運営者が直面すること | 可能になる条件 |
|---|---|
| サービス停止 | メモリ破壊でNode.jsプロセスが終了すると、要求処理に失敗したり再起動が必要になったりする |
| データ・接続情報の窃取 | 読める設定ファイルやAPIキーを読み出し外へ送れる場合。顧客情報の取得にはDBへの接続・読み取り権限も必要 |
| サイト改ざん | 記事・ページのファイル・DBを書き換える権限があれば、内容の変更や悪意ある情報の挿入につながり得る |
| ファイル暗号化・ランサムウェア | 悪意あるコードの実行に加え、対象ファイルへの書き込み権限があれば、暗号化して使えなくする被害も考えられる |
猫と一緒に読み解く Q&A
- 猫の研究員
ファイルをロックして金銭を要求する、ランサムウェアにもつながるの?
ポケットノート悪意あるコードが実行され、対象ファイルに書き込めるなら、想定される被害の一つだよ。RCEという名前だけで全ファイルをロックできたり、既に被害が起きたと分かったりするわけではない。
- 猫の研究員
DBの接続キーを読まれたら、失うのは秘密のファイル一つだけ?
ポケットノートそのキーで利用できる別サービスへ影響が広がることもある。侵害が疑われる場合は、パッチとあわせて秘密情報の交換、アクセス記録の調査、データ変更の点検が必要だよ。
5. 同じ24.xでも、最後の数字まで
架空のサーバーAが v24.22.0 を使っているとします。系列は同じ24.xでも、今回の修正版は24.22.1なので、サーバーAはまだ修正前です。
Linuxディストリビューションや管理型ホスティングは、修正を自社のパッケージに移すことがあります。これをバックポートといいます。その場合はバージョン番号だけでは判断しにくいので、提供元のパッケージ改訂番号とセキュリティ修正の履歴もあわせて見ます。
猫と一緒に読み解く Q&A
- 猫の研究員
じゃあ、全部のサービスを一番新しい26に上げないといけない?
ポケットノート今使っている系列の修正版に上げれば大丈夫。22・24・26のどれにも修正版が出ているし、大きなバージョンの移行は互換性のテストが先だから、別に計画したほうがいいよ。
6. 新しいバージョンが本当に動いているか
npm はアプリが使うパッケージを管理する道具です。今回の修正はNode.js本体とその中の同梱部品にあるので、npm update でアプリのパッケージを上げても反映されません。Node.jsの実行ファイルか、それを含むコンテナーイメージを入れ替える必要があります。
| 変えたもの | それだけでは分からないこと |
|---|---|
| アプリのnpmパッケージ | サーバーのNode.js実行ファイルが変わったか |
| 開発者のPCのNode.js | 本番のサーバーやコンテナーのNode.jsが変わったか |
| コンテナーの設定ファイル | 新しいイメージがビルドされ、実際にデプロイされたか |
| 管理画面で選んだ系列 | 動いているサービスに修正パッケージが反映されたか |
- Node.jsが動くサーバー・コンテナー・ビルド環境を一覧にします。
- それぞれの修正パッケージを入手し、アプリの互換性を試します。
- 実行ファイルやイメージを入れ替え、必要な再起動・再デプロイを行います。
- 動いているバージョンと実際の主要機能を再点検します。
最後の点検では、ログイン、API応答、外部とのHTTPS通信、圧縮された応答の処理など、今回の修正に関わる機能をひと通り動かしてみます。
猫と一緒に読み解く Q&A
- 猫の研究員
サーバーで実際に動いているバージョンは、どうやって調べるの?
ポケットノートサービスが動いているその場所で聞くんだ。コンテナーならその中で
node --versionを実行して、管理型ホスティングなら提供元の画面やデプロイ記録でNode.jsのバージョンを見る。手元のターミナルの番号は、そのターミナルが選んだNode.jsのものにすぎないよ。 - 猫の研究員
公式情報にRCEって書いてあったら、うちのサーバーはもう侵入されたってこと?
ポケットノートそうとは限らないよ。公式情報は欠陥と修正版を知らせるもので、実際に侵入があったかはログやアクセス記録を別に調べないと分からない。修正版を入れても、過去に何があったかまでは教えてくれないんだ。
まとめ
更新の前に覚えておきたいこと
今回の修正版は、Node.jsが実際に動いている場所に入って初めて効果があります。サーバー、コンテナー、ビルド環境を一つずつ洗い出し、それぞれを今使っている系列の修正版に上げましょう。20.xのようにサポートが終わった系列を使っているなら、今回は直すバージョンがないので、サポート中の系列へ移る計画から立ててください。
アプリと実行環境を分けて更新する考え方は、PHPセキュリティ修正の記事でも扱っています。
出典
- 公式セキュリティ情報nodejs.org
- 22.23.4リリースnodejs.org
- 24.22.1リリースnodejs.org
- 26.12.1リリースnodejs.org
- リリース計画github.com
- 公式の圧縮応答処理例nodejs.org
- MITREの範囲外書き込みの説明cwe.mitre.org