Node.jsの欠陥の根源はGoogle圧縮技術「Brotli」だった…PythonやEnvoy、Bunまで「HTTP to Shell」に拡大

Photo of author

By Global Team

Node.jsの「Node to Shell」脆弱性(CVE-2026-111497)の原因はBrotliの展開ライブラリで、深刻度は9.2点。

OpenAIが2月に欠陥を発見し、コードは修正されたものの、セキュリティパッチとして公開されず、8カ月間放置された。

pip-auditやDependabotなどの検査ツールでも検出できなかった。

主な内容

▶ Webサーバー開発で広く使われているNode.jsで10月21日に修正された脆弱性「Node to Shell」(CVE-2026-111497)は、Node.js自体の問題ではなく、Googleが開発したデータ圧縮技術Brotliの欠陥に起因すると、セキュリティ企業のAikido Securityが10月23日に明らかにした。

▶ 攻撃者が意図的に仕様に反するよう作成した圧縮データを展開する際、プログラムが許可されたメモリー領域の外にデータを書き込む不具合だ。

▶ ログインなしでサーバーを停止させたり、メモリーを読み取ったりでき、条件がそろえばリモートでコードを実行されるおそれがある。

▶ Google Brotliのバージョン1.0.3から1.2.0までが影響を受け、1.2.1で修正された。

Webサーバー開発に使われるJavaScript実行環境「Node.js」のロゴ。(写真:Wikimedia Commons)
Webサーバー開発に使われるJavaScript実行環境「Node.js」のロゴ。(写真:Wikimedia Commons)

WebサーバーソフトウェアのNode.jsで見つかった深刻なセキュリティ脆弱性は、Node.jsだけの問題ではなかった。

セキュリティ企業のAikido Securityは23日付の分析レポートで、Node.jsの脆弱性「Node to Shell」(CVE-2026-111497)は、Googleが開発したデータ圧縮技術Brotliの展開機能にある欠陥に起因すると発表した。

その後の調査で、Python向け圧縮ライブラリや、Web通信を中継するEnvoy、JavaScript実行環境のBunでも同じ欠陥が確認された。

Aikidoは、影響範囲がNode.jsを超えてHTTP通信ソフトウェア全般に広がったとして、この脆弱性を「HTTP to Shell」と命名した。韓国インターネット振興院(KISA)は23日、Node.jsのセキュリティアップデートを勧告した。

◆ 展開時にメモリー領域の外へ書き込む

Brotliは、Webページのテキストやプログラムコードの容量を小さくし、インターネット上で素早く送信できるようにする圧縮技術だ。受信側のサーバーやブラウザーは圧縮データを展開して元の内容に戻すが、この処理に欠陥があった。

展開プログラムは、受け取ったデータが定められた仕様に沿っていると想定して処理する。攻撃者が仕様を意図的に逸脱した圧縮データを送ると、プログラムがそれを検知できず、許可されたメモリー領域の外にデータを書き込んでしまう。

サーバーが異常終了したり、メモリー情報が漏えいしたりするほか、条件がそろえば攻撃者がリモートで悪意あるコードを実行できる。深刻度を評価するCVSS 4.0のスコアは9.2点で、最高ランクの「クリティカル」に該当する。

攻撃の方向は双方向だ。悪意あるクライアントが仕様を逸脱した圧縮データをサーバーに送ることも、悪意あるサーバーが応答として送り、接続したプログラムを攻撃することもできる。Impervaのレッドチームは、修正前のNode.js 24.22.0の正式ビルドでコード実行を実証した。

◆ Node.jsだけを修正しても不十分

Node.jsの開発チームは21日、Brotliの展開処理の欠陥を修正したバージョン22.23.4、24.22.1、26.12.1を公開した。しかし、欠陥がNode.jsに組み込まれたBrotliライブラリにあると判明し、影響範囲は拡大した。

Google Brotliはバージョン1.0.3から1.2.0までが影響を受け、1.2.1(旧バージョンでは1.1.1、1.0.10)で修正された。Aikidoによると、Python向けライブラリの「Brotli」と「brotlicffi」にも同じ脆弱性があり、それぞれ1.2.1、1.2.1.0で修正された。

これらのライブラリは、PythonのWeb通信ツールであるurllib3、aiohttp、httpxとともにインストールされ、自動的に圧縮データを展開する。そのため、開発者がBrotliを直接使用していなくても影響を受ける可能性がある。

Webサーバーとアプリの間の通信を中継するEnvoyでは1.40.0などの修正版が公開され、Bunでは1.4.4で修正された。サポートが終了したNode.js 20、23、25系には修正版がない。

Apache mod_brotliとNginxは、デフォルト設定ではBrotli形式のリクエストを展開しないため、対象ではない。攻撃対象となるのは、脆弱なバージョンで外部から届いた圧縮データを展開するケースであり、Brotliを使うすべてのWebサイトが危険というわけではない。

◆ 2月に修正されたのに、8カ月間放置

この欠陥は2月にすでに発見されていた。Aikidoによると、OpenAIが2月にBrotliの展開処理の欠陥を発見して報告し、Google Brotliのソースコードはその時点で修正された。しかし当時、この不具合は深刻なセキュリティ脆弱性として認識されていなかった。

修正コードが正式なセキュリティアップデートとして公開されなかったため、脆弱なバージョンはNode.jsやPythonライブラリなどに組み込まれたまま、8カ月間残っていた。OpenAIは、自社のセキュリティ支援事業「Patch the Planet」のサイトにBrotliに関する勧告を掲載した。

セキュリティ検査ツールもこの欠陥を見逃していた。Aikidoは23日時点で、脆弱性データベースにPythonパッケージへの影響情報が紐付けられていないため、「pip-audit」「Dependabot」「Safety」などのツールが警告を出せないと指摘した。

これらのツールは、開発者が使用するライブラリに既知の脆弱性がないかを自動で確認する。しかし、脆弱性が登録されていても、影響を受けるパッケージと紐付けられていなければ警告は表示されない。25日時点で実際の攻撃事例は報告されておらず、米国CISAの悪用が確認された脆弱性の一覧にも掲載されていない。

◆ 必要なのはライブラリを一つずつ探すこと

主要ソフトウェアの修正版は公開された。問題は、ほかのプログラムに組み込まれたBrotliだ。コンテナイメージやビルド済み実行ファイル、OSパッケージに同梱されたコピーは、それぞれ個別に更新する必要がある。

AikidoとUpwindは、外部に公開されているプロキシやリクエスト本文を展開するサービスを優先的に点検し、ソフトウェア部品表(SBOM)とイメージからBrotliのコピーをすべて探し出してバージョンを確認したうえで、パッチ適用後に必ず再起動するよう勧告した。再起動しなければ、実行中のプロセスは古いデコーダーを使い続ける。

すぐにパッチを適用できない場合は、暫定措置もある。プロキシやミドルウェアの段階で「Content-Encoding: br」が付いたリクエストを拒否し、外部から受け取るレスポンスもBrotli形式であれば、展開前に拒否する方法だ。

Pythonでは、Brotliのサポートが必須でなければBrotli・brotlicffiパッケージを削除すれば、gzipなどに切り替わる。リクエストヘッダーからbrだけを取り除く対策では不十分だ。悪意あるサーバーはリクエストとは無関係に、Brotli形式のレスポンスを送信できる。