【ITニュース解説】Node.js Bundled a Decoder That Wrote Past Its Eight-Byte Buffer
2026年10月28日に「Dev.to」が公開したITニュース「Node.js Bundled a Decoder That Wrote Past Its Eight-Byte Buffer」について初心者にもわかりやすく解説しています。
ITニュース概要
Node.jsのBrotliデコーダーに脆弱性が見つかった。不正な圧縮データを受信すると、プログラムが確保したメモリ範囲を超えてデータを書き込み、システムが不安定になったり情報漏洩したりする危険がある。影響を受けるNode.jsバージョンは26.x, 24.x, 22.x。速やかに最新版にアップデートし、対策することが重要だ。
ITニュース解説
Node.jsで最近発見された深刻なセキュリティ脆弱性(CVE-2026-111497)について解説する。この脆弱性は、Node.jsが内部で利用している「Brotli」というデータ圧縮形式のデコーダに存在し、特にWebアプリケーションを開発・運用するシステムエンジニアにとって重要な情報となる。
まず、「Brotli」について説明する。BrotliはGoogleが開発したオープンソースのデータ圧縮アルゴリズムで、Webコンテンツの転送速度を向上させるために広く利用されている。私たちがWebサイトを閲覧する際、Webサーバーから送られてくるHTML、CSS、JavaScriptなどのファイルは、しばしばBrotliのような形式で圧縮されており、受信側でデコード(解凍)されて元のデータに戻される。Node.jsには、このBrotli形式のデータをデコードするための機能が「node:zlib」モジュールを通じて組み込まれている。これにより、Node.jsアプリケーションは外部の依存ライブラリを追加することなく、圧縮されたデータ(例えば、Webサーバーからのレスポンスや、ユーザーからのリクエストボディ)を簡単に処理できる。
今回の脆弱性は、このBrotliデコーダの内部処理に起因する。具体的には、デコーダが不正に作成されたBrotliデータを処理する際に問題が発生した。Brotliデータは複数の「ブロック」に分割されており、それぞれのブロックには、次に続くデータがどのようにエンコードされているかを指示する「ブロックヘッダー」が含まれている。本来、デコーダは、仕様で許されていない不正なブロックヘッダーの値を受け取った場合、エラーとして処理を停止し、フォーマットが不正であることを報告すべきである。
しかし、脆弱性のあるデコーダは、このような不正なブロックヘッダーを受け取った際に、エラーとして停止せず、「一時的にもっと入力データが必要だ」と誤って判断してしまった。この誤った判断により、デコーダは処理を継続し、入力データを要求し続けた。デコーダの内部には、ブロックヘッダーのような少量のデータを一時的に保持するための、わずか8バイトの小さなバッファが設けられている。このバッファは、数バイトの追加データがあればヘッダーの解析が完了するという前提で設計されていた。しかし、デコーダがエラーを誤って一時的な入力不足と判断し処理を続けたため、8バイトのバッファにそれ以上のデータが書き込まれてしまった。
この現象は「バッファオーバーフロー」、より専門的には「Out-of-Bounds Write(範囲外書き込み)」と呼ばれる深刻な問題である。プログラムが確保したメモリ領域(この場合は8バイトのバッファ)を超えてデータを書き込んでしまうと、予期せぬメモリ領域が上書きされてしまう。これにより、プログラムのクラッシュ、不正な動作、さらには攻撃者が任意のコードを実行できるなど、非常に危険な状況が生じる可能性がある。この脆弱性は、ソフトウェアの弱点を分類する共通脆弱性タイプ一覧(CWE)において「CWE-787: Out-of-bounds Write」と「CWE-252: Unchecked Return Value」(関数が返したエラーコードを適切にチェックしなかったこと)の二つのタイプに分類されている。後者の「戻り値の未チェック」が、エラーを一時的な状態と誤認した根本原因をより正確に表している。
この脆弱性の影響を受けるバージョンは、Google Brotliライブラリの1.0.3から1.2.0までとなる。Node.jsにおいては、v26.x、v24.x、v22.xといった主要なサポートバージョンが影響を受ける。Node.js開発チームは、これらのバージョン向けに修正済みのビルド、具体的にはv26.12.1、v24.22.1、v22.23.4を提供している。サポート期間を終えた古いNode.jsバージョンも影響を受けるため、すべてのNode.jsユーザーは速やかに最新の修正バージョンへアップグレードすることが強く推奨される。
攻撃者は、この脆弱性をどのように利用できるのだろうか。この脆弱性は「リモートの認証されていない攻撃者」によって悪用される可能性がある。つまり、攻撃者はインターネット経由で、ターゲットとなるシステムに特別な認証なしに攻撃を仕掛けられるということだ。具体的な攻撃経路としては、アプリケーションが外部から受け取るBrotli圧縮されたデータが挙げられる。例えば、ユーザーからのHTTPリクエストボディがContent-Encoding: brで圧縮されている場合や、アプリケーションがユーザー指定のURLから取得したBrotli圧縮されたHTTPレスポンスを処理する場合などである。プロキシサーバー、CDN(コンテンツデリバリーネットワーク)、あるいは外部のサービスからのデータを受け取るWebhookレシーバーなども、悪意あるBrotliデータを処理してしまう可能性があるため、攻撃対象となりうる。
この脆弱性の深刻度は、共通脆弱性評価システム(CVSS)4.0のスコアで9.2(最高10.0)と非常に高く評価されている。これは「クリティカル」な脆弱性であり、機密性(Confidentiality)、完全性(Integrity)、可用性(Availability)の全てに「高」レベルの影響があると判断されている。ネットワーク経由で攻撃が可能であり、攻撃に特別な権限やユーザーの操作は不要である。ただし、「特定の前提条件」が必要であり、それはターゲットとなるサービスが悪意あるBrotliデータをデコードする処理を実行することである。この前提条件が満たされた場合、デコーダはサービスの最も重要な処理パス(リクエスト処理など)の途中に位置するため、システム全体に深刻な影響を及ぼすことになる。
この脆弱性は、OpenAI Codex Securityの研究者であるKhai Tran氏とSylvie Mayer氏によって発見された。近年、自動化された脆弱性発見ツールや分析エージェントが注目を集めており、このような低レベルのデコーダのエラーパスに潜むバグは、そうしたツールによって発見されやすいタイプのものである。
Node.jsの今回のセキュリティリリースでは、このBrotliデコーダの脆弱性以外にも、DNSに関する問題、TLS(Transport Layer Security)のホスト名検証に関する問題、乱数生成の問題など、合計で10個のセキュリティアドバイザリが公開された。これらの脆弱性もすべて、同じNode.jsのランタイムアップデートによって修正されるため、システム管理者は、これらの複数の問題を一括で解決するために、速やかにNode.jsをアップグレードする必要がある。
システムエンジニアにとって重要なことは、単にアップデートを適用するだけでなく、自身の運用するサービスが「信頼できないBrotliデータをデコードするパス」をどのように持っているかを把握することである。どのようなサービスがBrotliデータを処理しており、その中でどのデータが外部(第三者)から供給されているものなのかを特定する「インベントリ(棚卸し)」の作業が不可欠となる。今回の脆弱性のように、メモリを安全ではない方法で処理するデコーダのバグは今後も発生する可能性があるため、そのようなリスクパスを把握し、システムの監視体制を強化することが、持続的なセキュリティ対策として極めて重要となる。例えば、異常なクラッシュループが発生した場合に、適切なアラートが発せられるような監視体制は必須である。このBrotliデコーダのケースは、PHPの以前のRCE(リモートコード実行)脆弱性と同様に、広く利用されている基盤技術が抱える問題であり、迅速なパッチ適用と、自身のシステムにおけるデータ処理の実態把握の重要性を改めて示している。