Skip to main content

トレンドマイクロ、PHPの重大な脆弱性「PHP2Shell」への支援・対応策を発表

Return to TrendAI™ セキュリティブログ
脆弱性とエクスプロイト

「Node2Shell」の原因となったBrotliの脆弱性:修正対象と見落としやすい組み込み先

ネットワークWebエクスプロイトとゼロデイ

Key Takeaways

  • Brotliの展開ライブラリに見つかった脆弱性(CVE-2026-111497、CVSS 4.0スコア9.2、深刻度「緊急」)により、細工された圧縮データを処理するとメモリ破損が生じるおそれがあります。影響を受けるのはBrotli 1.0.3〜1.0.9、1.1.0、1.2.0です。Brotli自体に加え、Node.js、Bun、Envoy、Istio、.NET、Pythonパッケージでも修正版が公開されています。
  • この脆弱性は、クライアントとサーバのどちら側でも悪用される可能性があります。圧縮されたリクエストを受け付ける未修正のサーバは、不正なクライアントから攻撃を受けるおそれがあります。同様に、圧縮されたレスポンスを受け付ける未修正のクライアントは、不正なサーバから攻撃を受けるおそれがあります。
  • 10月22日に概念実証(PoC)コードが公開されました。Imperva(10月22日、arm64)とELLIO(10月25日、x86-64)は、それぞれ検証環境において、Node.js 24.22.0の公式ビルドでコードを実行できることを実証しました。リクエストボディを通じた実行に加え、Impervaの検証では、取得したレスポンスを通じた実行にも成功しましたが、毎回成功したわけではありません。米国サイバーセキュリティ・インフラストラクチャセキュリティ庁(CISA)は10月27日、この脆弱性を「悪用が確認された脆弱性(KEV)」カタログに追加しました。ELLIOは10月26日に脆弱性を悪用するリクエストを記録したと報告していますが、同社の検証では、そのペイロードは機能しなかったとみられます。10月28日時点で、被害者のシステムへの侵害が確認されたという公表情報はありません。
  • Brotliは、ランタイム、プロキシ、コンテナイメージなどのソフトウェアに組み込まれています。依存関係の一覧に表示されないことも多いため、利用が明らかな箇所だけを修正しても十分ではありません。
  • すぐに修正できない場合は、管理下にないデータに対するBrotliの展開処理を無効にしてください。
  • TrendAI™をご利用のお客さまは、利用可能なソリューションについて、当社のナレッジベース記事をご参照ください。詳細は、後述の「TrendAI™による支援」で説明しています。

経緯

2026年10月21日、Node.jsは、同梱するBrotliデコーダの境界外書き込みに対する修正を含むセキュリティ更新を公開しました。Node.jsによると、圧縮ストリーム内の不正なブロック切り替えが、形式エラーではなく、一時的に入力データが不足している状態として扱われていました。その結果、デコーダは攻撃者が送り込んだバイト列を小さな内部バッファに追加し続け、バッファの末尾を超えて書き込んでいました。GoogleのCVEレコードでは、このメモリ破損により、メモリ内の機密情報の漏洩、プロセスのクラッシュ、場合によっては任意コードの実行が生じる可能性があると説明しています。GoogleはCVSS 4.0で9.2(緊急)と評価しており、Node.jsは深刻度を「高」としています。Microsoftは.NETについて、CVSS 3.1で8.1と評価しています。CVEレコードでは、CWE-787(境界外書き込み)に分類され、CVSS 4.0のベクターはAV:N/AC:L/AT:P/PR:N/UI:Nとされています。ログインやユーザの操作を必要とせず、ネットワーク経由で脆弱なコードに到達できますが、対象がBrotliのデコードを行う場合に限られます。

Googleは10月21日、Brotliの修正版である1.0.10、1.1.1、1.2.1を公開しました。EnvoyとIstioは、それより前の10月中に、この脆弱性を明示せずに修正版を公開しており、Bunもその後、独自に修正を提供しました。OpenAIは、同社のCodex Securityチームがこの脆弱性を発見し、BrotliのメンテナおよびBrotliを利用する下流プロジェクトに報告したと述べています。Node.jsのアドバイザリでは、OpenAI Codex SecurityのKhai Tran氏とSylvie Mayer氏の貢献が記されています。

10月22日に公開されたPoCコードについて、作成者がコードの実行を報告したのは、意図的に保護を弱めたビルドに対してのみでした。その後、リスクを裏付ける具体的な事実が明らかになっています。10月22日、Impervaのレッドチームは、Linux arm64向けのNode.js 24.22.0公式イメージに対し、デバッガや計測用の変更を加えたバイナリを使わずにコードを実行したと報告しました。攻撃を再現できた経路は2つあります。Express 5(body-parser 2.x)が展開するBrotli圧縮のリクエストボディと、Node.js組み込みのfetch()が読み込むBrotli圧縮のレスポンスです。コードの実行には複数回の試行が必要でした。Impervaの結果は、同社が検証した構成に限られ、すべてのNode.jsビルドやアプリケーションを検証したわけではありません。Node.js 24.22.1では、同じ入力は拒否されます。

10月25日、ELLIOも、x86-64上で、変更を加えていないNode.js 24.22.0の公式ビルドをデフォルト設定のまま使用し、コードを実行できたと報告しました。検証対象は、zlibで展開処理を行うシンプルなnode:httpサーバ、公式のnode:24.22.0-slimコンテナイメージ、Express 5.3.0、Koa 3です。このエクスプロイトは特定の1つのビルドに依存していました。同じオフセット値をNode.js 22.23.3や26.12.0に対して用いても、1万回の試行で成果は得られませんでした。また、検証環境での試行の大半では、シェルを取得できず、ワーカープロセスがクラッシュしました。

10月26日、ELLIOは、単一の送信元IPアドレスから、x86-64上のNode.js 24.22.0に対する脆弱性悪用リクエストを記録したと報告しました。リクエストのボディは、約23 MBのBrotli圧縮データでした。このリクエストは公開済みのPoCコードを再利用し、最終段階に独自の処理を加えたものでしたが、ELLIOの検証では、その処理は機能しませんでした。10月27日、米国サイバーセキュリティ・インフラストラクチャセキュリティ庁(CISA)は、この脆弱性をKEVカタログに追加し、米国の連邦文民機関に対する対応期限を11月10日としました。10月28日時点で、TrendAI™は、テレメトリにおいて侵害の成功が確認された事例を観測していません。また、被害者のシステムへの侵害が確認されたという公表情報もありません。

この脆弱性には、「Node2Shell」や「HTTP2Shell」など、複数の通称が付けられています。いずれもCVE-2026-111497を指しています。

影響を受ける対象

攻撃者が制御するデータを未修正のBrotliデコーダに渡すソフトウェアは、いずれもこの脆弱性の影響を受ける可能性があります。具体的には、次のようなものが該当します。

  • Node.jsやBunのアプリケーションなど、Content-Encoding: brが指定されたリクエストボディを受け付けるWebサーバやAPI。Impervaは、Express 5.0.0および5.3.0と、body-parser 2.0.0、2.0.1、2.3.0で攻撃を再現しましたが、それらの間にあるすべてのリリースを検証したわけではありません。ELLIOも、Express 5.3.0、およびKoa 3と@koa/bodyparser 6の組み合わせで攻撃を再現しています。Node.jsのHTTPサーバが影響を受けるのは、アプリケーションまたはライブラリがBrotli圧縮されたボディを展開する場合に限られます。ただし、脆弱なコードはNode.jsランタイム内にあるため、Expressやbody-parserを更新しても、この脆弱性は修正されません。
  • 管理下にないサーバからコンテンツを取得し、自動的に展開するクライアントやバックグラウンドジョブ。Pythonでは、Brotliまたはbrotlicffiパッケージがインストールされていると、urllib3(したがって、それを利用するrequestsも)、httpx、aiohttp、Scrapyが自動的に読み込みます。そのため、アプリケーションがこれらのパッケージを明示的にインポートしていなくても、影響を受ける可能性があります。Node.jsではコードの実行が実証されていますが、同じデコーダのコードをコンパイルして利用するPythonパッケージでは、コードの実行は実証されていません。
  • EnvoyやIstioなど、Brotliの展開処理を行うように設定されたプロキシやサービスメッシュ。
  • 外部から受け取ったBrotli圧縮ファイルを処理するあらゆるソフトウェア。

Brotliは直接の依存関係としてではなく、ランタイム、コンテナのベースイメージ、プロキシなどに組み込まれて導入されるため、多くの組織は、その利用自体を把握していない可能性があります。また、脆弱性の公開直後に依存関係をスキャンした場合も、見逃していた可能性があります。当初、主要な脆弱性データベースにはPythonパッケージが登録されておらず、pip-auditなどのツールで問題が報告されなかったためです。現在は対象に含まれているため、再スキャンを推奨します(GitHubアドバイザリGHSA-9v8h-qqgm-4m35)。

セキュリティリサーチャーは、.NET、PHP、Rubyのビルド、データベース、アーカイブツールなど、ほかのソフトウェアにもBrotliが同梱されていると報告しています。Microsoftは10月25日、.NET 8、9、10、11の修正版(8.0.33、9.0.22、10.0.14、11 RC3)を公開しました。.NET Frameworkは影響を受けません。アプリケーションが影響を受けるのは、ASP.NET Coreのリクエスト展開やHttpClientの自動展開など、Brotliの展開処理を利用する場合に限られます。PHPは10月26日、Brotli 1.2.1を同梱したWindows向けの更新済みビルド(8.2.35-1、8.3.36-1、8.4.27-1、8.5.12-1)を公開しました。PHPのソースコードのリリースには変更がありません。PHPのbrotli拡張機能は、0.21.1で修正されています。

プロジェクト 修正済みバージョン
Node.js 22.23.4, 24.22.1, 26.12.1
Bun 1.4.4
Envoy 1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12
Istio 1.29.9, 1.30.6, 1.31.2
Brotli(上流のCライブラリ) 1.0.10, 1.1.1, 1.2.1
Python Brotliパッケージ 1.2.1
Python brotlicffiパッケージ 1.2.1.0
.NET 8.0.33, 9.0.22, 10.0.14, 11 RC3
PHPのWindows向けビルド 8.2.35-1, 8.3.36-1, 8.4.27-1, 8.5.12-1
PHPのbrotli拡張機能 0.21.1
表1. プロジェクトごとの修正済みバージョン: サポートが終了したNode.jsのリリース系列(18.x、20.x、23.x、25.x)には、修正は提供されません。Istio 1.29は[10月15日](https://istio.io/latest/news/security/istio-security-2026-007/)にサポートが終了しましたが、1.29.9には修正が含まれています。

この脆弱性が重要な理由

脆弱なコードは、多くのチームが自ら選んで導入したり、管理対象として追跡したりしているものではありません。ほかの処理に先立って実行される部分にあり、リクエストを送信できる人やレスポンスを返せる人であれば、誰でも到達できます。修正自体は2月の時点でBrotliのソースコードに含まれていました(2月27日にコミット)が、修正版のリリースもアドバイザリもなかったため、下流プロジェクトの多くは約8か月間、その修正を取り込んでいませんでした。コードの公開、検証環境での実証、悪用の試行の記録、KEVカタログへの掲載がそろった今、対応に残された猶予はすでに尽きています。

組織が今すぐ取るべき対策

  1. Brotliの利用箇所を把握する。 サーバ、関数、ビルドエージェント、コンテナイメージ全体で、Node.jsとBunのバージョンを洗い出してください。EnvoyとIstioのバージョン、およびBrotliの展開処理が有効かどうかを確認し、Python環境にBrotliやbrotlicffiパッケージがないかを調べてください。Node.jsを同梱する開発者向けツールやコマンドラインツールも対象に含めます。Windowsでは、PHPのビルドと、ASP.NET Coreのリクエスト展開やHttpClientの自動展開を利用する.NETアプリケーションも対象に含めてください。ソフトウェア部品表(SBOM)やコンテナイメージのスキャンで見つかるものもありますが、すべてを検出できるわけではありません。
  2. 修正を適用し、再デプロイする。 修正版に更新し、コンテナイメージや同梱型の実行ファイルを再ビルドしてください。旧ビルドで稼働しているすべてのサービス、ワーカー、レプリカを再起動します。サポートが終了したNode.jsのリリース系列からも移行してください。
  3. 修正が完了するまで、信頼できないデータに対するBrotliのデコードを無効にする。 プロキシやボディパーサが展開処理を行う前に、Content-Encoding: brが指定されたリクエストを拒否してください。EnvoyとIstioでは、リクエストとレスポンスの両方でBrotli展開フィルタを無効にし、HTTPクライアントによるBrotliの自動展開も停止します。EnvoyやIstioのフィルタを無効にすると、圧縮されたバイト列はそのまま転送されるため、下流のサービスがBrotliをデコードする場合、そのサービスは引き続き影響を受けます。また、Accept-Encodingからbrを削除するだけでは、サーバがBrotli圧縮データを送信するのを防げません。Gzipとdeflateは有効のままでも構いません。
  4. コンテンツ配信ネットワーク(CDN)やWebアプリケーションファイアウォール(WAF)の設定だけに頼らない。 CDNでBrotliによるレスポンス圧縮を無効にしても、リクエストの展開やクライアント側の展開処理は停止しません。サイズ制限やWAFルールでも、すべてのデコード経路をカバーすることはできません。
  5. 「チェッカー」の利用に注意する。 出所が不明な、この脆弱性のPoCコード、スキャナ、チェッカーは信頼せず、実行する場合は隔離した検証環境に限ってください。
  6. 攻撃の兆候を監視する。 次の事象は、侵害が確定した証拠ではなく、調査の優先順位を判断するための手掛かりとして扱ってください。Node.js、Bun、Envoy、Istioのプロセスで発生する予期しないクラッシュ、SIGSEGVシグナル、再起動ループ(特に圧縮されたリクエストやレスポンスを処理した直後)、通常とは異なるContent-Encoding: brトラフィックのパターンや外向きのHTTPリクエストによるデータ取得後のデコーダエラー、異常に大きなBrotli圧縮のリクエストボディ(記録された悪用リクエストは約23 MB)、外部公開サービスから生成された予期しない子プロセスなどです。修正済みのNode.jsビルドは、悪用に用いられた入力を400レスポンスとエラーコードERR__ERROR_FORMAT_BLOCK_SWITCHで拒否します。そのため、パッチ適用後のアプリケーションログにこのエラーが記録されていれば、調査すべき悪用の試行を示す手掛かりになります。ELLIOは、送信元IPアドレス(94.154.43.7)とペイロードのハッシュ値(SHA-256: 7fcbdaaecd4419e2930927844f3b772668204737a4e7602a2290c991c93c5c4b)を公開しています。また、AS44620から、ユーザエージェントnode2shell-check/1.0を使用するスキャナが観測されたと報告しています。これらは単一の事象に関する指標であり、汎用的な検知指針ではありません。

TrendAI™による支援

この脆弱性を修正するには、パッチの適用が必要です。以下の機能やサービスは、影響を受けるシステムの特定、更新を展開する間の追加の防御、脆弱性が悪用された兆候の調査を支援します。ルール名と詳細については、TrendAI™のナレッジベース記事KA-0024830(https://success.trendmicro.com/en-US/solution/KA-0024830)(英語)をご参照ください。

  • 影響を受ける資産を把握する。 TrendAI Vision One™ Cyber Risk Exposure Management(CREM)は、影響を受けるバージョンが稼働する資産を「Exposure Overview」に表示します。各資産に重要度を割り当てるため、インターネットに公開されたサービスのうち、特に重要なものから優先してパッチを適用できます。
  • 制約を踏まえ、ネットワークとホストに防御を追加する。 TrendAI Vision One™ TippingPoint™のフィルタ48101、TrendAI Vision One™ Network Detection and Response(NDR)のルール6040、およびTrendAI Vision One™ Endpoint Security(Server and Workload Protectionを含む)とTrendAI™ Deep Securityの侵入防御ルール1012761は、脆弱性を悪用するトラフィックを検知します。ただし、いずれもBrotliの展開処理は行わず、圧縮されたバイト列のみを検査します。パッチ適用までの補完策として利用し、パッチの代わりにはしないでください。
  • 侵害の兆候を調べる。 TrendAI Vision One™は、Node.jsプロセスがコマンドシェルを起動した場合や、予期しない外向きの接続を行った場合に、「Observed Attack Techniques」として検知します。また、TrendAI Vision One™ Container Securityは、コンテナ内のNode.jsによる不審な子プロセスの生成や外向きの接続を警告します。これらは、前述の「攻撃の兆候を監視する」で挙げた、脆弱性悪用後の挙動に対応します。
  • 既知の攻撃インフラへのアクセスを遮断する。 TrendAI™ Web Reputation Servicesは、この活動に関して報告された攻撃者のIPアドレスへのアクセスをブロックします。
  • 自社環境で脅威ハンティングを行う。 TrendAI Vision One™ Threat Intelligenceには、この脆弱性の背景とハンティングの指針をまとめた記事があります。また、TrendAI Vision One™ Agentic SIEM and XDRのXDR Data Explorerを利用して、エンドポイントのプロセス活動を検索し、外部公開サービスのNode.jsプロセスがシェルやダウンロードツールを起動していないかを調べられます。
  • 専門家に対応を委ねる。 自社でこれらの対応を行う体制がない場合、TrendAI Vision One™ Services – Managed Detection and Response(MDR)により、TrendAI™のアナリストが24時間365日、検知、調査、対応を提供します。攻撃対象になったかどうかを確認したい組織は、TrendAI™の侵害評価を依頼できます。侵害を受けた疑いがある場合は、TrendAI™のインシデント対応窓口にお問い合わせください。

TrendAI™をご利用のお客さまでご不明な点がある場合は、担当営業にお問い合わせください。その他のご相談は、https://www.trendaisecurity.com/ja/contactからメールで受け付けています。

参考記事:

Brotli Flaw Behind 'Node2Shell': What to Patch and Where It Hides

翻訳:与那城 務(Platform Marketing, TrendAI™ Research)