
wp2shell(CVE-2026-63030)WordPress侵害の検出とクリーンアップ — 一括実行可能、デフォルトで読み取り専用
1つまたは複数のWordPressサイトに残されたwp2shell(CVE‑2026‑63030)侵害の痕跡を検出・除去します。
wp2shellは、WordPress 7.0.2 / 6.9.5 / 6.8.6(2026‑07‑17)で修正された認証前リモートコード実行の脆弱性です。公開PoCは1日以内に登場し、約48時間以内に大規模な悪用に発展しました。パッチ適用で穴は塞がりますが、パッチ適用前に悪用されたサイトはすでに侵害されており、更新しても攻撃者の永続化(バックドア)は除去されません。
このツールは、その永続化を検出・除去します。単一の依存関係の少ないBashスクリプトで、デフォルトでは読み取り専用で動作し、一度に数千サイトをスキャンできます。
⚠️ これは防御用のツールです。エクスプロイトコードは一切含まれていません。
--cleanを実行する前に、サイトのスナップショットを取得してください。
攻撃後の段階で、wp2shellツールは通常、次の2つの永続化アーティファクトを残します。このツールは両方を検出します。
user_login = wpsvc_<hex> / wp2_<hex> / w2s_<hex>、または攻撃者ドメインのメールアドレス(@wp2shell.*、@shellcode.*、@wordpress-svc.internal、@wordpress-noreply.net、@x.lol)で、administratorロールを持ちます。(注: @system.localは一部のマネージドホストでは正当なプレースホルダー管理者メールであり、意図的にIOCとしては扱われません。)wp-content/plugins/<plausible-name>-<6hex>/<same>.php: 偽のAuthor: WordPress.org Communityヘッダーを持つ小さな(約1.3 KB)PHPファイルで、トークンの背後に隠されており、?c=<command>インターフェースを公開します。また、より一般的なケースも検出します: wp-content/配下にある、$_GET['c']をコマンド/evalシンクに流し込む小さなPHPファイルです。
curl -fsSLO https://raw.githubusercontent.com/InstaWP/wp2shell-scan/main/wp2shell-scan.sh
chmod +x wp2shell-scan.sh
必要なもの: bash、find、grep、およびmysql/mariadbクライアント。WP‑CLIが存在する場合はそれを使用します(ユーザー削除がよりクリーン)が、必須ではありません。ウェブシェルの検出にはデータベースは一切不要です。
# Scan ONE site (read-only)
./wp2shell-scan.sh --path /var/www/example.com
# Scan EVERY WordPress install under a base directory (bulk)
./wp2shell-scan.sh --base /var/www
./wp2shell-scan.sh --base /home # shared hosting
# Auto-detect common layouts (/var/www/*, /home/*/public_html, ...)
./wp2shell-scan.sh
# Machine-readable
./wp2shell-scan.sh --base /var/www --json > report.json
# CLEAN — quarantine + remove backdoors, rotate wp-config salts (logs everyone out)
./wp2shell-scan.sh --base /var/www --clean --yes
# Vet a BACKUP / SNAPSHOT / TEMPLATE dump before restoring it (see warning below)
./wp2shell-scan.sh --sql /path/to/backup.sql
削除されたアーティファクトは、(完全に削除せず)隔離ディレクトリへ移動されるため、証拠を保持できます。終了コードは、侵害を検出した場合(スキャン)またはクリーンアップを実行した場合(clean)は1、問題がない場合は0です。cron/CIでの利用に便利です。
[COMPROMISED] /var/www/example.com — 2 backdoor admin(s), 2 webshell(s)
admin: ID=41 wpsvc_2e1487df8abb <[email protected]> (2026-07-19 06:41:48)
webshell: .../wp-content/plugins/security-headers-manager-8d1d21/security-headers-manager-8d1d21.php
[clean] /var/www/other-site.com
----------------------------------------------------------------
scanned=812 clean=811 compromised=1 cleaned=0
本番サイトをクリーンアップしても、バックアップはクリーンになりません。 サイトが侵害されている間に取得したバックアップ、スナップショット、またはステージング/ブループリントテンプレートには、依然として攻撃者の管理者アカウントが含まれています。それを復元(またはそこから新規サイトをプロビジョニング)すると、即座に再感染します。私たちはこれを痛い目で学びました。影響を受けたすべての本番サイトをクリーンアップした後も、感染したテンプレートスナップショットからプロビジョニングされていたため、新規サイトに次々とバックドアが出現し続けたのです。
ダンプを復元する前に検証してください:
./wp2shell-scan.sh --sql /path/to/backup.sql
./wp2shell-scan.sh --sql backup1.sql --sql backup2.sql.gz # repeatable, .gz supported
いずれかのダンプが汚染されていれば終了コードは1になります。その場合: 復元しないでください — まず本番サイトをクリーンアップし、その後新しいバックアップを取得し、侵害を受けていた期間中に作成されたスナップショットやテンプレートを削除・置き換えてください。
--cleanは管理者アカウントとウェブシェルを削除し、ソルトをローテーションします。ただし、以下は依然として必要です:
wp core verify-checksums)。?c=コマンドの値が記録されています。/wp-json/batch/v1、?rest_route=/batch/v1、%2fエンコードを含む)。CDNがRESTパスを素通しする可能性がある場合はオリジンでブロックしてください。不正な管理者:
SELECT u.ID,u.user_login,u.user_email,u.user_registered
FROM wp_users u JOIN wp_usermeta m ON u.ID=m.user_id
WHERE m.meta_key='wp_capabilities' AND m.meta_value LIKE '%administrator%'
ORDER BY u.user_registered DESC;
ウェブシェルプラグイン:
find wp-content/plugins -maxdepth 1 -type d -regextype posix-extended -regex '.*-[0-9a-f]{6}$'
grep -rl "\$_GET\['c'\]" wp-content/plugins/
CLEANUP-WITH-CLAUDE.mdには、Claude Code(または同等の能力を持つコーディングエージェント)を単一サイトで同じ検出・クリーンアップ手順に沿って実行させ、各破壊的ステップの前に人間の確認を挟むための、コピペですぐ使えるプロンプトがあります。
MIT — LICENSEを参照してください。現状のまま提供され、いかなる保証もありません。InstaWPのチームによって、実戦のインシデント対応中に開発・検証されました。