React2Shell悪用キャンペーン UAT-10608が766台のNext.jsホストから認証情報を大量窃取
目次
2025年12月に発覚したReact Server Componentsの脆弱性CVE-2025-55182(React2Shell、CVSS 10.0)は、最初から実際の攻撃に使われていた。4ヶ月後の現在、Cisco Talosの調査によって大規模な認証情報(クレデンシャル)窃取キャンペーン(一連の組織的攻撃活動)の全容が明らかになった。
少なくとも766台のNext.jsホストが侵害され、DBの接続情報、SSHプライベートキー、AWS/Azure/GCPのシークレット、Stripe APIキー、GitHubトークン、さらにはOpenAI・Anthropicのキーまで盗まれている。
UAT-10608の攻撃チェーン
Cisco Talosが「UAT-10608」として追跡する攻撃グループ(グループの正式な帰属は未確認)は、完全に自動化された多段階のクレデンシャル収集フレームワークを運用していた。
攻撃の流れはシンプルだ。
graph TD
A[公開Next.jsアプリを自動列挙] --> B[CVE-2025-55182で<br/>細工済みPOSTリクエスト送信]
B --> C[ドロッパーが<br/>ハーベストスクリプトを展開]
C --> D[多段フェーズで<br/>クレデンシャルを自動収集]
D --> E[NEXUS Listener C2へ<br/>HTTPで返送]
- 公開されているNext.jsアプリケーションをターゲットとして自動列挙
- CVE-2025-55182を悪用した細工済みHTTP POSTリクエストで初期侵害
- ドロッパーが本体のハーベストスクリプトを取得・実行(
nohup経由、/tmp/配下にランダムなドット付きファイル名で配置) - 多段階のフェーズでシステム全体のクレデンシャルを自動収集
- NEXUS Listener C2サーバー(攻撃者の指揮統制サーバー)にHTTPでデータを返送
CVE-2025-55182はReact Server Componentsの「Flight」プロトコルにおける安全でないデシリアライゼーション(不正なデータ復元処理)に起因する。細工されたHTTP POSTリクエストを1回送るだけでRCEが成立し、認証は一切不要。「デフォルト設定のNext.jsを普通に動かしているだけで攻撃される」という条件の緩さが被害を広げた要因だ。
この脆弱性については2025年12月の初報で詳しく扱ったが、当時は主に「パッチを当てろ」という内容だった。今回のキャンペーン報告で、パッチ未適用のホストに対して何が起きていたかが具体的になった。
収集データのフェーズ構成
ハーベストスクリプトは以下のフェーズを順番に実行していく。
| フェーズ | 収集対象 |
|---|---|
| environ / jsenv | 環境変数(.envファイル含む) |
| ssh | SSHプライベートキー・authorized_keys |
| tokens | パターンマッチによるトークン類の抽出 |
| history | シェルコマンド履歴 |
| cloud_meta | AWS/GCP/Azureのメタデータエンドポイント |
| k8s | Kubernetesサービスアカウントトークン |
| docker | コンテナ設定ファイル |
| cmdline / proc_all | 実行中プロセスのコマンドライン |
データはHTTPリクエストでC2に逐次送信される。
http://<C2_IP>:8080/h=<HOSTNAME>&l=<PHASE>&id=<ID>
フェーズ名がクエリパラメータに入っており、収集の進捗がリアルタイムで記録される構造になっている。
NEXUS Listener: C2の実体
攻撃側のC2インフラの中核は「NEXUS Listener(v3が観測)」と呼ばれるWebベースの管理インターフェースだ。
- パスワード認証付きのGUI
- 侵害済みホストの統計ダッシュボード
- 盗んだデータをホスト・フェーズ別に検索できるデータベース
Ciscoが発見したNEXUS Listenerの一つは認証が設定されておらず、統計エンドポイント /stats が外部から丸見えだった。そこから読み取れた数字は、スキャン済みシステム数91,505台、成功率64.6%、確認された侵害済みサーバー59,128台。
「766台」はCiscoが直接確認した数で、全体像はその80倍近い規模だった可能性がある。
766台から何が盗まれたか
Ciscoが確認した766台分のデータでも、被害の内訳は具体的だ。
| 項目 | 侵害台数 | 割合 |
|---|---|---|
| DBクレデンシャル | 約701台 | 91.5% |
| SSHプライベートキー | 約599台 | 78.2% |
| AWSクレデンシャル | 約196台 | 25.6% |
| Stripe APIキー | 約87台 | 11.4% |
| GitHubトークン | 約66台 | 8.6% |
| 収集ファイル総数 | 10,120件 | — |
SSHキーはED25519とRSA両形式のPEM秘密鍵で、authorized_keysエントリとセットで取得されている。これは内部ネットワークへの横展開(ラテラルムーブメント)に直結する。Stripe本番キーは不正請求・返金操作に、AWSキーは広いIAM権限があればクラウドインフラ全体の乗っ取りにつながる。
さらに、AIプラットフォームのキー(OpenAI、Anthropic)、決済・通知系(SendGrid、Brevo、Telegram Bot Token)、Webhook Secretなど、Next.jsアプリケーションが一般的に利用するあらゆるサービスの認証情報が収集されていた。
侵害を検出するためのシグナル
UAT-10608の活動を示す具体的な痕跡として、以下が挙げられている。
ネットワーク系IOC(侵害指標)
144.172.102.88172.86.127.128144.172.112.136144.172.117.112
上記IPへのポート8080向けアウトバウンド接続が発生していれば、ハーベストスクリプトが稼働中または稼働済みの可能性が高い。
システム上の痕跡
/tmp/配下にランダムなドット付きファイル名のプロセスが存在するnohupの予期せぬ呼び出し- アプリケーションコンテナからの異常なアウトバウンドHTTP/HTTPS接続
Snortルール ID 65554 がCVE-2025-55182向けに公開されている。
対処と認証情報のローテーション
侵害が疑われる場合のアクションを整理する。
パッチ適用は大前提として、Next.jsが未対応バージョンであれば今すぐ更新する(影響バージョンとパッチバージョンの詳細は最初のReact2Shell記事を参照)。
それ以上に重要なのはクレデンシャルのローテーションだ。2025年12月4日以降にインターネット公開状態だったNext.jsアプリケーションが対象になる。
- データベースのパスワードとユーザー名をすべて変更する
- SSHキーペアを更新し、古い公開鍵を
authorized_keysから削除する - AWS・Azure・GCPのアクセスキーを無効化し、新規発行する
- Stripe、SendGrid等の外部サービスキーをすべてローテーションする
- GitHubのPersonal Access Tokenを無効化する
.envファイルやコードベースにハードコードされたシークレットを全量棚卸しする
AWSについては、EC2インスタンスでIMDSv2が無効になっていると cloud_meta フェーズでIAM一時認証情報が取得される。IMDSv2の強制適用は必須対応として扱うべきだ。
Next.jsの設定面では、NEXT_PUBLIC_ プレフィックスを意図しない変数につけていないかの確認も忘れずに。このプレフィックスが付いた環境変数はクライアントにバンドルされる仕様のため、シークレット類には使ってはならない。
CVE-2025-55182はまだ「現在の脅威」
発覚から4ヶ月、パッチも公開済みなのに59,000台超が侵害されているという事実は重い。攻撃グループはパッチの適用遅延を計算に入れたうえで自動化スキャンを走らせており、「発覚後すぐにパッチを当てた」以外の選択肢はない。
Unit 42の分析では、Next.js/Reactのインスタンスが世界で968,000台以上確認されており、パッチ未適用のものが残っている限りキャンペーンは継続する。
今回の調査で特筆すべきは、PoC(概念実証コード)の公開とほぼ同時期に、これほど完成度の高い自動収集フレームワークが稼働していた点だ。単発のRCEではなく「侵害後の全データ収集」まで一貫して自動化されていた。SSHキーまで持ち出されていれば、Next.jsアプリの修正だけでは不十分で、インフラ全体の見直しが必要になる。
発覚から4ヶ月の時系列
| 日付 | 出来事 |
|---|---|
| 2025年12月4日 | CVE-2025-55182(React2Shell)公開、同日に攻撃活動を確認 |
| 2025年12月5日 | CISAがKEVカタログに追加、修正期限を12月12日に設定 |
| 2025年12月9日 | CISA、侵害兆候のチェックを推奨 |
| 2025年12月10日 | 当ブログで初報を公開(影響バージョン、チェック手順、パッチ適用先を整理) |
| 2025年12月11日 | 追加のDoS脆弱性(CVE-2025-55184)とソースコード露出(CVE-2025-55183)が公開。初回修正が不完全だったため再パッチが必要に |
| 2025年12月22日 | 初報記事を更新。Difyへの影響を追記 |
| 2026年3月〜4月 | Cisco Talos、UAT-10608によるキャンペーンの全容を公開 |
CISAが12月12日に設定した修正期限を守れなかったホストが大量に残った。初報で「シークレットのローテーションを強く推奨」と書いたが、4ヶ月後に蓋を開けてみれば、パッチ未適用のホストからDBパスワード・SSHキー・クラウドシークレットが大規模に持ち出されていた。初報時点で対応したかどうかが被害の分水嶺になっている。
関連記事
- Next.js / Reactの脆弱性「React2Shell」対応メモ — 2025年12月の初報。CVE番号の整理、影響バージョン、チェック手順、パッチ適用先の一覧など。CISAのKEVカタログ追加やDifyへの影響もカバーしている
- Mintlify脆弱性はReact2Shellとは別物:フレームワークの責任と実装者の責任 — 同時期に発覚したMintlifyの脆弱性との違いを解説。React2Shellが「フレームワーク側の問題」であるのに対し、Mintlifyは「実装者側の問題」だったという話