Node.js、同梱のBrotliデコーダーにおけるリモートコード実行の脆弱性を修正
Node.jsはバージョン22、24、26向けのセキュリティアップデートをリリースし、リモートコード実行につながる可能性のあるBrotliデコーダー内の高深刻度のバウンド外書き込みを修正しました。
英語の原文から自動翻訳されました。
Node.jsは10月21日、サポート対象の3つのリリースライン(22.x、24.x、26.x)に対して重要なセキュリティアップデートをリリースしました。最も重大な修正は、同梱されているBrotli解凍ライブラリの脆弱性に対応したもので、攻撃者が影響を受けるシステム上で任意のコードを実行する可能性があります。Node.js 20.xなどのライフサイクル終了(EOL)バージョンを実行している開発者は、これらの古いラインにはパッチが提供されないため、直ちにアップグレードする必要があります。
何が起きたか
Node.jsプロジェクトはこのリリースサイクルで10件の異なる欠陥を修正しましたが、主な懸念はCVE-2026-111497であり、これはBrotliデコーダーにおけるバウンド外書き込みの脆弱性です。このバグは、Node.jsが内部に出荷しているGoogleのBrotliライブラリの複製に存在するため、node:zlibモジュール経由またはfetch()レスポンスによる自動処理を通じてBrotliデータを解凍するすべてのアプリケーションに影響します。この脆弱性は不正な圧縮入力によってトリガーされ、デコーダーが割り当てられたメモリバッファを超えてデータを書き込む原因となります。
プロジェクトはこの欠陥を、リモートコード実行(RCE)の可能性を伴う高深刻度と評価していますが、実際の悪用は困難であると思われます。10月22日に公開された概念実証(PoC)では、意図的に弱体化させたテストビルドでのみコード実行が可能であることを示しました。標準的なビルドでは、エクスプロイトは完全なコード実行ではなく、クラッシュと限定的なメモリ読み取りを引き起こしました。10月22日の時点で、野外での積極的な悪用は報告されておらず、パッチ適用済みのバージョンではこれらのテストで使用された不正な入力を拒否するようになっています。
Brotliの問題に加え、今回のアップデートでは他の3つの高深刻度の脆弱性も対処されています。そのうち2つはTLS証明書のチェックに関するもので、攻撃者が非正規のIPアドレス形式や全角数字を使用することでバイパスでき、本来一致すべきでないホストに証明書が一致してしまう可能性があります。3番目の高深刻度の修正は、埋め込まれたNULLバイトを含むホスト名においてdns.resolveが切り詰めを行うのを防ぎます。残りの修正は、起動時スナップショットにおける乱数生成の問題や権限モデルのバイパスなど、中程度および低程度の深刻度の問題に対処しています。
仕組み
BrotliはGoogleが開発した圧縮アルゴリズムで、gzipよりも優れた圧縮率を提供するため、Webコンテンツで広く使用されています。Node.jsはシステムレベルのライブラリに依存するのではなく、Brotliソースコードのコピーを独自にバンドルしています。アプリケーションが圧縮データを受信すると、内部デコーダーがビットストリームを処理して元のコンテンツを再構築します。この脆弱性は、デコーダーが不正な入力における特定の境界ケースを適切に検証しなかったために生じ、バウンド外書き込みが発生しました。つまり、プログラムがアクセス許可されていないメモリ位置にデータを書き込んだため、メモリの破損や、攻撃者による悪意あるコードの注入・実行が可能になる場合があります。
修正には、Brotliプロジェクトからのアップストリームのパッチが含まれており、Node.jsはこれをコードベースに取り入れました。このパッチにより、より厳格な検証チェックが追加され、無効な入力に遭遇した際にデコーダーが早期かつ安全に失敗するようになり、メモリ破損を防ぎます。多くの他のソフトウェアプロジェクトも独自のBrotliコピーをバンドルしているため、エコシステム全体で同様のアップデートが必要となる可能性が高いです。同じ修正は10月21日にリリースされたBrotliバージョン1.2.1、1.1.1、および1.0.10にも含まれています。
主要な詳細
- 修正済みバージョン: Node.js 22.23.4、24.22.1、および26.12.1に必要なパッチが含まれています。
- EOL警告: Node.js 20.x以前はサポート対象外であり、この修正は受けません。移行が必要です。
- 攻撃ベクトル: リクエストボディや外部APIレスポンスなど、信頼できないソースからBrotliデータを解凍する場合、アプリケーションが危険にさらされます。
- 証明書ブロック: このアップデートでは、eMudhraの侵害された中間認証局鍵8件をブロックし、emSignルート3件を削除します。
- 依存関係の更新: undici、c-ares、OpenSSL(22.xおよび24.x)、SQLite(22.x)のバンドル版が更新され、その他の既知の脆弱性が修正されました。
- 回避策なし: Node.js内にはBrotliの欠陥に対する一時的な緩和策はありません。アップグレードのみが解決策です。
なぜ重要なのか
バックエンドエンジニアや技術リードにとって、このアップデートはサードパーティ製ライブラリのバンドルに伴うリスクを浮き彫りにします。コードはNode.jsチームによって書かれたものではありませんが、そのセキュリティ責任はランタイムのメンテナー、そして最終的にはそれをデプロイする開発者にあります。fetch()のような自動プロセスに脆弱性が存在するという事実は、圧縮ライブラリを明示的に使用していないアプリケーションであっても、Brotli圧縮データを返す外部サービスとやり取りする場合、リスクにさらされる可能性があることを意味します。
eMudhra証明書のブロックが含まれていることは、安全な通信におけるトラストストアの重要性も強調しています。Node.jsはデフォルトで失効チェックを行わないため、侵害された認証局鍵は明示的にブロックされるまで信頼されたままになります。このリリースは、セキュリティが単なるコードバグの修正だけでなく、安全な接続を支える暗号インフラの整合性を維持することでもあるという事実を思い出させるものです。
対応方法
- 現在のリリースラインに応じて、Node.js 22.23.4、24.22.1、または26.12.1へ直ちにアップグレードしてください。
- Node.js 20.x以前で実行されているすべてのアプリケーションを、サポートされているバージョンへ移行してください。
- カスタムデプロイメントや単一実行可能ファイルアプリケーションを確認し、パッチ適用済みバージョンで再ビルドされていることを保証してください。
- パッチ適用前の試行的な悪用を示唆する可能性のある、異常なクラッシュやメモリエラーについてログを監視してください。
- CI/CDパイプラインが、コンテナ化されたデプロイメント用に最新の修正済みベースイメージを取得するように設定されていることを確認してください。
- 即時のアップグレードが不可能な場合、不審な受信リクエストをブロックするためのネットワークレベルのファイアウォールルールの導入を検討してください。ただし、これによりアウトバウンドのfetch脆弱性から保護されるわけではありません。



