WordPress wp2shell 対応|更新確認とアクセスログ点検の手順

  • URLをコピーしました!
目次

はじめに

2026 年 7 月 17 日、WordPress のセキュリティリリース 6.8.6、6.9.5、7.0.2 が公開されました。未認証のリモートコード実行(RCE)につながる攻撃チェーン「wp2shell」への対応で、WordPress.org は自動更新システム経由の強制更新を有効化しています。日本では直後に三連休(7/18〜7/20)に入ったため、更新の適用状況を確認できないまま週明けを迎えた運用者も少なくないと思われます。

その後、状況は動きました。攻撃チェーンの詳細と概念実証(PoC)コードが公開され、CISA の KEV カタログへの登録を経て、国内でも IPA と JPCERT/CC が注意喚起を行っています。パッチ公開から 2 週間が経過した現在も、攻撃の試行は継続して観測されています。

つまり現時点の関心事は「更新すべきかどうか」ではなく、管理下のすべてのサイトに更新が実際に届いたか、そして更新が届く前に侵害を受けていないかへ移っています。

この記事でわかること
  • wp2shell を構成する 2 件の CVE の役割分担と、バージョン別の影響範囲
  • 強制自動更新が実際に適用されたかを確認する手順
  • アクセスログから初期侵入の痕跡を点検する際の着眼点
  • 公開 PoC が残す痕跡と、侵害の可能性を判断する材料
  • WAF による暫定遮断をいつ解除するかの判断基準
  • CVSS スコアだけで優先度を決めた場合に生じるずれ

結論から述べると、当面の焦点は 2 点です。1 つは、強制更新が届かない構成が存在しうるため、バージョンを実測で確認すること。もう 1 つは、更新完了後も更新前の期間について、/batch/v1へのリクエストや管理者アカウントの追加が発生していないかを確認することです。更新はあくまで脆弱なコードの解消であり、更新前に侵入を許していた場合の痕跡までは消してくれません。

この方向性は、国内の公的機関の見解とも一致しています。

参考: WordPress の脆弱性対策について(IPA)
「自動更新によってバージョンアップされているかどうかを確認し」
https://www.ipa.go.jp/security/security-alert/2026/alert20260722.html

wp2shell の要点整理(更新対象と影響範囲)

wp2shell は単一の脆弱性ではなく、性質の異なる 2 件の欠陥を連鎖させた攻撃手法の呼称です。この構造を押さえておくと、後述するバージョン別の影響範囲やスコアのばらつきが理解しやすくなります。

2 件の CVE の役割分担

CVE-2026-60137 は、WP_Queryauthor__not_inパラメーターにおける SQL インジェクションです。この処理は WordPress 6.8 系から存在しますが、6.8 系の標準構成では外部から当該パラメーターへ値を渡す経路がなく、悪用にはプラグインやテーマ側が未信頼の値を渡す実装であることが前提となります。

CVE-2026-63030 は、REST API のバッチエンドポイント /batch/v1におけるルート混同です。バッチ内のサブリクエストと、それを処理するハンドラーの対応がずれることで、本来のバリデーションや権限チェックを迂回できます。WordPress 6.9 で作り込まれたもので、この欠陥が「認証を必要とする SQL インジェクション」を「未認証で到達可能な SQL インジェクション」へ変えた点が要点です。

単体では限定的な 2 件が、連鎖することで未認証 RCE に至るという構造のため、対応の優先度は「どちらの CVE の影響を受けるか」ではなく「両方の影響を受けるか」で判断することになります。

参考: GHSA-ff9f-jf42-662q(WordPress Security Advisory)
“WordPress versions 6.9 and higher are vulnerable to a REST API batch-route confusion weakness”
(WordPress 6.9 以降は REST API のバッチルート混同の脆弱性の影響を受けます)
https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-ff9f-jf42-662q

バージョン別の影響範囲と更新先

GitHub Security Advisory およびリリースノートに基づき、バージョンごとの影響を整理します。

WordPress のバージョンCVE-2026-60137CVE-2026-63030wp2shell による未認証 RCE更新先
6.8 未満対象外対象外成立しない最新の安定版
6.8.0〜6.8.5影響あり対象外成立しない6.8.6
6.9.0〜6.9.4影響あり影響あり成立する6.9.5
7.0.0〜7.0.1影響あり影響あり成立する7.0.2
7.1 Beta 1 まで影響あり影響あり成立する7.1 Beta 2

複数サイトを管理している場合、対応の優先順位は 6.9 系・7.0 系が先で、6.8 系がその次になります。ただし 6.8 系を「対応不要」と読み替えないよう注意が必要です。6.8 系でも SQL インジェクション自体は残るため、プラグインやテーマの実装次第で悪用の余地が生じます。

永続オブジェクトキャッシュに関する条件

RCE の成立条件には、あまり触れられていない前提があります。Cloudflare の報告によれば、コード実行に至る経路は、サイトが永続オブジェクトキャッシュを使用していない場合に到達可能とされています。WordPress の標準構成にはこのキャッシュが存在しないため、既定のインストールは条件を満たします。

注意が必要なのは、この条件の読み替え方です。Redis や Memcached を永続オブジェクトキャッシュとして前段に置いている構成は、この特定の経路から外れる可能性があります。ただし、これは副次的な効果であって修正ではなく、SQL インジェクションである CVE-2026-60137 の影響は残ります。データベースの読み出しによる管理者パスワードハッシュの窃取といった被害は、キャッシュの有無にかかわらず成立しうるため、「キャッシュを使っているから対応は不要」という判断にはつながりません。

構成によって RCE の成立可否が分かれる点は、複数サイトを管理している場合の優先順位付けには使えます。しかし更新の要否そのものは、この条件では変わりません。

2026 年 8 月 1 日時点の状況

パッチ公開直後は攻撃の再現性が不明でしたが、その後の 2 週間で前提が大きく変わりました。時系列で整理します。

日付出来事
7 月 17 日修正版 6.8.6・6.9.5・7.0.2 公開、強制自動更新の有効化
7 月 18〜19 日攻撃チェーンの技術詳細が公開、国内ホスティング事業者が暫定遮断を告知
7 月 20 日実際の悪用が複数のセキュリティ企業により確認される
7 月 21 日CISA が両 CVE を KEV カタログへ登録(是正期限 7 月 24 日)
7 月 22 日IPA が注意喚起を公開
7 月 23 日JPCERT/CC が Weekly Report で取り上げる
7 月 31 日パッチ公開から 2 週間後も、攻撃試行の観測が継続していることが報告される

IPA の注意喚起は、KEV カタログへの掲載に言及したうえで、実証コードが公開されており今後悪用が拡大する可能性を指摘しています。JPCERT/CC も、複数のセキュリティ企業が悪用を確認していると伝えています。

この記事の初版公開時点では「侵害の有無を判定するための具体的な IoC は公表されていない」と記載していましたが、その後の状況変化を受けて記述を改めます。 公開 PoC が残す痕跡については、後述の「公開 PoC が残す痕跡から侵害を判断する」で扱います。

なお、攻撃の仕組みそのものについては、GMO Flatt Security による解説記事( https://blog.flatt.tech/entry/wp2shell_wordpress )が修正差分まで踏み込んで整理しており、本記事では仕組みの再解説は行いません。本記事は、更新後の運用者が実施する確認作業に絞って扱います。

強制自動更新が「実際に届いたか」の確認手順

WordPress.org は今回、対象バージョンに対して自動更新システム経由の強制更新を有効化しました。ただし、この仕組みが到達しない構成も存在するため、通知や前提ではなく実測でバージョンを確認することを推奨します。ここでは、管理画面・WP-CLI・外部からの 3 経路と、自動更新を抑止する設定の洗い出し方を整理します。

管理画面・WP-CLI・HTTP レスポンスからのバージョン確認

もっとも確実なのは、サーバー内部で実際のファイルを読む方法です。WP-CLI が利用できる環境であれば、次のコマンドでバージョンを取得できます。

# 現在のバージョンを表示
wp core version

# データベースリビジョン等を含めて表示
wp core version --extra

# 更新可能なバージョンがあるかを Version Check API で確認
wp core check-update

wp core check-updateが「Success: WordPress is at the latest version.」を返せば、少なくとも当該ブランチの最新版が適用されています。複数サイトを 1 台のサーバーに収容している場合は、--pathでドキュメントルートを指定してループ処理すると一覧化できます。

for d in /var/www/*/public_html; do
  printf '%s\t' "$d"
  wp core version --path="$d" --skip-plugins --skip-themes
done

更新の適用に加えて、コアファイルが改変されていないかも同時に確認しておくと、後続のログ点検の判断材料になります。WP-CLI には、WordPress.org が公開するチェックサムと現在のファイルを照合するコマンドが用意されています。

wp core verify-checksums
wp core verify-checksums --locale=ja

参考: wp core verify-checksums(WP-CLI Command)
“Verifies WordPress files against WordPress.org’s checksums”
(WordPress のファイルを WordPress.org のチェックサムと照合します)
https://developer.wordpress.org/cli/commands/core/verify-checksums/

日本語環境では、--locale=jaを指定しないと差分として報告される場合があります。また、このコマンドはコアファイルのみを対象とするため、wp-content配下に設置されたファイルの検知には使えない点に注意してください。「チェックサムが一致した」ことはコアの完全性を示すのみで、侵害がなかったことの証明にはなりません

管理画面から確認する場合は、ダッシュボードの「更新」画面で現在のバージョンと更新の有無を確認します。

外部から確認する方法としては、HTML の generatorメタタグ、readme.html、REST API のルートエンドポイント(/wp-json/)などがありますが、いずれもバージョン情報を隠蔽するプラグインやテーマの設定で出力を抑止できます。外部からバージョンが見えないことは、更新済みであることを意味しません。管理下のサイトについては、外部確認で済ませず内部で実測することを推奨します。

自動更新を無効化していたサイトで確認すべき点

自動更新は、wp-config.phpの定数、mu-plugins のフィルター、ファイル書き込み権限、バージョン管理システムの検出など、複数の要因で抑止されます。いずれかに該当するサイトでは、今回の強制更新が届いていない可能性があります。

参考: Upgrading WordPress(WordPress Advanced Administration Handbook)
“To completely disable all types of automatic updates, core or otherwise”
(コアを含むすべての種類の自動更新を完全に無効化するには)
https://developer.wordpress.org/advanced-administration/upgrade/upgrading/

主な抑止要因は次のとおりです。

設定・条件影響範囲確認場所
AUTOMATIC_UPDATER_DISABLEDtrueコアを含むすべての自動更新が無効wp-config.php
WP_AUTO_UPDATE_COREfalseコアの開発版・マイナー・メジャー更新が無効wp-config.php
DISALLOW_FILE_MODStrueファイル変更全般が禁止され、更新も抑止wp-config.php
automatic_updater_disabledフィルターすべての自動更新が無効mu-plugins・プラグイン
allow_minor_auto_core_updatesfalseマイナー更新(セキュリティリリース)が無効mu-plugins・プラグイン
.git.svn等の検出バージョン管理下と判定され自動更新が抑止ドキュメントルートおよび親ディレクトリー

複数サイトを管理している場合、まず設定ファイルを横断的に検索して該当サイトを絞り込む方法が扱いやすくなります。

# wp-config.php 側の定数を確認
grep -rnE "AUTOMATIC_UPDATER_DISABLED|WP_AUTO_UPDATE_CORE|DISALLOW_FILE_MODS" \
  /var/www/*/public_html/wp-config.php

# mu-plugins 側のフィルターを確認
grep -rnE "automatic_updater_disabled|allow_minor_auto_core_updates|auto_update_core" \
  /var/www/*/public_html/wp-content/mu-plugins/

該当したサイトは、強制更新の対象外となっている前提で扱い、バージョンを個別に実測することを推奨します。更新が適用されていない場合は、wp core updateによる手動更新か、管理画面からの更新で対応します。

なお、レンタルサーバーやマネージドホスティングでは、WordPress 本体の設定とは別に、コントロールパネル側で自動更新の可否を制御している場合があります。ホスティング側で無効化されていると、wp-config.phpに何も定義されていなくても更新が届きません。自社管理外の環境については、提供元の告知と管理画面の設定をあわせて確認することをおすすめします。

アクセスログで初期侵入痕を点検する

更新が完了しても、更新前の期間に攻撃を受けていた可能性は残ります。ここでは、Web サーバーのアクセスログから初期侵入の痕跡を探す際の着眼点を整理します。

点検を始める前に、まずログの保全を行うことを推奨します。レンタルサーバーでは、アクセスログの保持期間が数日から数週間に設定されていることがあり、調査を進める間に対象期間のログが失われる可能性があります。ローテーション設定を確認し、7 月 17 日以降のログを別領域へ退避してから作業に入ると安全です。

対象となる 2 つのリクエスト形式とサブディレクトリー設置時の注意

wp2shell の攻撃チェーンは、REST API のバッチルート /batch/v1へのリクエストを起点とします。このルートには複数の到達経路があり、片方だけを検索すると見落とします。

WordPress の構成ログに現れるパス
パーマリンクが有効/wp-json/batch/v1
rest_routeパラメーターを使用/?rest_route=/batch/v1
サブディレクトリーに設置/<設置先>/wp-json/batch/v1

/wp-json/配下だけを検索対象にすると、クエリ文字列経由のリクエストが漏れます。WordPress をサブディレクトリーに設置している場合は、そのプレフィックスも検索対象に加えます。

_method / X-HTTP-Method-Override による POST 隠蔽への対応

バッチルートは POST を受け付けるエンドポイントですが、ログ検索を「メソッドが POST のリクエスト」に限定すると取りこぼす可能性があります。WordPress の REST API は、HTTP メソッドの上書きに対応しているためです。

参考: Global Parameters(WordPress REST API Handbook)
“This can be passed either via a _method parameter or the X-HTTP-Method-Override header”
(これは _method パラメーターまたは X-HTTP-Method-Override ヘッダーのいずれかで渡せます)
https://developer.wordpress.org/rest-api/using-the-rest-api/global-parameters/

したがって、検索はメソッドを限定せず、パスとクエリ文字列を軸に行うことを推奨します。Nginx や Apache の combined 形式を対象とした例を示します。

# バッチルートへのリクエストを、メソッドを限定せずに抽出
grep -aiE "batch/v1" /var/log/nginx/access.log*

# クエリ文字列経由の到達経路を個別に確認
grep -aiE "rest_route=(/)?batch/v1" /var/log/nginx/access.log*

# メソッド上書きの併用が記録されていないか確認
grep -aiE "_method=|X-HTTP-Method-Override" /var/log/nginx/access.log*

X-HTTP-Method-Overrideはリクエストヘッダーのため、標準の combined 形式には記録されません。ヘッダーをログに含めていない環境では、この経路の有無は判断できない点を前提に扱う必要があります。

ログだけでは成否が判定できない理由(207 Multi-Status)

バッチ API は、複数のサブリクエストの結果をまとめて返す仕様上、バッチ全体の応答に 207 Multi-Status を用い、個々のサブリクエストの結果は JSON 本文に格納します。アクセスログのステータスコードが 207 であっても、内部のサブリクエストが成功したか失敗したかは判別できません

なお、国内のホスティング事業者の一部は、パッチ公開の直後にサーバー側でバッチエンドポイントへの通信を遮断しています。こうした環境では、攻撃試行が到達していても応答が 403 として記録されるため、ステータスコードの読み方が変わります。

403 が記録されている

事業者側またはご自身の WAF で遮断された試行と考えられます。遮断された記録が残っていること自体は、攻撃者が到達を試みた事実を示します

207 が記録されている

遮断されずに WordPress 本体まで到達しています。更新完了時刻との前後関係を確認することを推奨します

404 が記録されている

WordPress をサブディレクトリーに設置している場合など、パスが一致していない可能性があります

ただし、事業者側の遮断がいつから有効になったかは告知の日付に依存します。パッチ公開日から遮断開始日までの間は、遮断がかかっていない期間として扱うことを推奨します。

実務上の判断としては、次のように整理すると扱いやすくなります。

  • 該当リクエストが 1 件も記録されていない: 少なくともログの保持期間内に、この経路からの試行はなかったと判断できる
  • 該当リクエストが記録されている: 成否は不明。更新完了時刻との前後関係を確認し、更新前のものであれば追加調査の対象とする
  • レスポンスボディまでログに保持している: JSON 本文から個々のサブリクエストの結果を確認できる場合がある

公開 PoC が残す痕跡から侵害を判断する

アクセスログの点検で /batch/v1へのリクエストが見つかった場合、次に確認するのは WordPress 側に変更が加えられていないかです。ここでは、公開されている検証用実装が残す痕跡を手がかりに、侵害の可能性を判断する方法を整理します。

前提として押さえておきたいのは、この攻撃チェーンで確実に成立するのは SQL インジェクションによるデータベースの読み出しであるという点です。

参考: wp2shell lab & detector(GitHub)
“unauthenticated, no-plugin, stock-core SQL injection giving full database read”
(プラグイン不要・標準構成で成立する、未認証のデータベース全体読み出しを伴う SQL インジェクション)
https://github.com/dinosn/wp2shell-lab

つまり、コード実行に至らなかった場合でも、wp_userswp_optionsの内容が読み出されている可能性は残ります。管理者パスワードのハッシュが窃取されていれば、オフラインでの解析を経て後日ログインを試みられることも考えられます。侵害確認は、ファイルの改ざんだけでなく認証情報の観点からも行うことをおすすめします。

見覚えのない管理者アカウントの確認

公開されている検証用実装の一部には、SQL インジェクションを起点として管理者アカウントを作成し、その後 Web シェルを設置する流れを実演するものがあります。この実装が作成するアカウントには、ユーザー名が w2s_で始まり、メールアドレスのドメインが wp2shell.localであるという特徴が報告されています。

この文字列が管理者一覧に存在する場合、公開実装が無改変で実行された痕跡である可能性が高いと考えられます。 WP-CLI が利用できる環境では、次のコマンドで登録日時とあわせて確認できます。

# 管理者権限を持つユーザーを、登録日時つきで一覧表示
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

WP-CLI を利用できない場合は、管理画面の「ユーザー」一覧を登録日時の順に並べ替えるか、データベースを直接参照します。テーブル接頭辞は環境によって異なるため、wp-config.php$table_prefixを確認したうえで読み替えてください。

SELECT ID, user_login, user_email, user_registered
FROM wp_users
ORDER BY user_registered DESC
LIMIT 20;

確認の着眼点は次のとおりです。

  • 2026 年 7 月 17 日以降に登録された、心当たりのないアカウントがないか
  • メールアドレスのドメインが、運用しているドメインと無関係なものになっていないか
  • 本来は購読者や寄稿者であるべきアカウントが、管理者へ昇格していないか

心当たりのないアカウントが見つかった場合、すぐに削除しないことを推奨します削除すると登録日時などの調査材料が失われ、侵入経路や侵害範囲の特定が難しくなります。まずアクセスログとデータベースを保全し、その上で対応を検討する順序が安全です。

プラグインとファイルの確認

Web シェルの設置は、独立したファイルとして配置される場合と、プラグインの形を取る場合があります。プラグイン一覧に想定外のものが含まれていないかを確認します。

# 導入済みプラグインの一覧を、状態とバージョンつきで表示
wp plugin list --fields=name,status,version,update

# 個別プラグインのファイル整合性を確認
wp plugin verify-checksums <プラグイン名>

コアファイルについては、前章で扱った wp core verify-checksumsで照合できます。ただし、このコマンドはコアファイルのみを対象とするため、wp-content配下に新規で置かれたファイルは検知できませんwp-content/uploadsのような本来 PHP ファイルが存在しないはずのディレクトリーに、PHP ファイルが置かれていないかを個別に確認することをおすすめします。

# アップロードディレクトリー配下の PHP ファイルを、更新日時つきで列挙
find wp-content/uploads -type f -name "*.php" -printf "%TY-%Tm-%Td %TH:%TM  %p\n"

正規のプラグインが動作のために PHP ファイルを配置しているケースもあるため、検出された結果がそのまま侵害を意味するわけではありません。更新日時が 7 月 17 日以降に集中している場合は、優先して内容を確認する対象になります。

痕跡が見つからない場合の解釈

ここまでの確認で何も見つからなかった場合の扱いには、注意が必要です。

w2s_wp2shell.localは、あくまで公開されている実装を無改変で実行した場合に残る既定の値です。攻撃者がユーザー名やメールアドレスを変更することは容易であり、実際に観測されている攻撃がすべてこの実装によるものとは限りません。また、Web シェルの設置方法も実装によって異なります。

したがって、次のように整理するのが実態に近い解釈です。

  • 該当する痕跡が見つかった: 侵害された可能性が高く、詳細な調査を行う段階
  • 該当する痕跡が見つからない: この実装による侵害は確認されなかった、という範囲の結論にとどまる

アクセスログに /batch/v1への到達が記録されており、かつ更新前の時刻であった場合は、痕跡が見つからなくても引き続き警戒することを推奨します。バックアップからの復旧を含めた判断が必要な段階では、復旧要件の考え方を関連記事『ランサムウェア対策の基本と全体像』で整理していますので、あわせて参照してください。

判断に迷う場合は、自力での復旧を試みる前に、ホスティング事業者のサポートまたはインシデント対応の専門事業者へ相談することをおすすめします。中途半端な削除は原因調査を困難にします。

WAF での暫定遮断と解除の判断基準

更新が完了していないサイトが残っている場合、暫定的にバッチエンドポイントへの未認証アクセスを遮断する方法があります。ただし、これは時間を稼ぐための措置であり、脆弱なコードそのものは残ります。

ホスティング事業者の告知の読み方

国内の主要なホスティング事業者は、パッチ公開の直後から個別に対応を告知しています。ただし告知の内容は事業者ごとに異なり、そのまま「対応済み」と読み替えられるとは限りません

エックスサーバーは 7 月 19 日付の告知で、暫定的な対策として対象サーバーにおいて /wp-json/batch/v1への通信を遮断したことを案内しています。ConoHa WING は 7 月 21 日付で、自動更新が有効な場合は順次適用される旨と、SiteGuard WAF が有効な場合の挙動を案内しています。

確認しておきたいのは次の点です。

  • 遮断対象として案内されている URL 形式が、/wp-json/batch/v1rest_route=/batch/v1の両方を含んでいるか
  • 遮断が有効になった日付が、パッチ公開日(7 月 17 日)からどれだけ離れているか
  • WAF の有効化が前提となっている場合、自分の契約で実際に有効になっているか

告知に一方の URL 形式しか記載されていない場合、もう一方が対象かどうかは告知からは判断できません。自身で遮断ルールを追加するか、事業者へ確認することを推奨します。遮断開始日より前の期間については、遮断がかかっていなかった前提でログを点検する必要があります。

Cloudflare を利用している場合の確認事項

Cloudflare は、日本時間 7 月 18 日未明(2026 年 7 月 17 日 17:03 UTC)に両 CVE に対応するマネージドルールを展開しており、無料プランを含むすべてのプランで、同社の WAF を経由しているトラフィックが対象となります。既定のアクションは Block です。

確認しておきたいのは、ルールが実際に有効になっているかという点です。マネージドルールセットに対して「すべてのルールを Block から Log へ変更する」といったルールセットレベルのオーバーライドを設定している場合、新しいルールも記録のみで通過します。あわせて、Security Events で該当ルールにマッチしたリクエストが発生していないかを確認しておくと、攻撃試行の有無を把握できます。

参考: Cloudflare WAF protects WordPress applications from two high-severity vulnerabilities
“they are not a substitute for patching”
(これらはパッチ適用の代替にはなりません)
https://blog.cloudflare.com/wordpress-vulnerabilities/

遮断ルールの設計上の注意点

自前で遮断ルールを実装する場合、次の点を満たしていないと迂回の余地が残ります。

  • URL デコードと正規化を行った後の値で判定する
  • 受信時の HTTP メソッドで対象を限定しない
  • サブディレクトリーに設置している場合は、そのパスも対象に含める
  • オリジンサーバーへの直接接続を制限し、WAF を迂回できない構成にする
  • 例外を設ける場合は、認証を検証できる利用者か、厳密に管理した送信元のみに限定する

Nginx での実装例を示します。rest_routeパラメーター側は ifディレクティブで判定していますが、returnのみを伴う用法であれば副作用は限定的です。

server {
    # パーマリンク経由の到達経路
    location ~* ^/wp-json/batch/v1 {
        return 403;
    }

    # クエリ文字列経由の到達経路
    if ($arg_rest_route ~* "^/batch/v1") {
        return 403;
    }
}

Apache(mod_rewrite)での実装例は次のとおりです。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^wp-json/batch/v1 - [F,L]
    RewriteCond %{QUERY_STRING} (^|&)rest_route=/batch/v1 [NC]
    RewriteRule ^ - [F,L]
</IfModule>

WAF そのものの検出方式や提供形態の違いについては、関連記事『WAF とは|仕組みと種類、選定のポイント』で整理しています。

更新完了後にルールを残すか外すかの判断

パッチ公開から 2 週間が経過した現在も、攻撃試行は継続して観測されています。Fortinet は 7 月 31 日付の Outbreak Alert で、直近 24 時間に 4,649 件、7 日間で 88,452 件の悪用試行を IPS で遮断したと報告しており、遮断数の多い国・地域として日本を挙げています

参考: WP2Shell RCE Outbreak Alert(FortiGuard Labs)
“FortiGuard Labs continues to detect exploitation attempts targeting the WP2Shell attack chain”
(FortiGuard Labs は WP2Shell 攻撃チェーンを狙った悪用試行を継続的に検知しています)
https://fortiguard.fortinet.com/outbreak-alert/wp2shell-rce

この数値は IPS が遮断した試行の件数であり、侵害に成功した件数ではありません。ただし、公開から 2 週間が経過してなお自動化された試行が続いていることは示しています

暫定遮断はバッチ API の正規利用を巻き込みます。ヘッドレス構成、モバイルアプリ連携、外部サービスとの API 連携などでバッチエンドポイントを使用している場合、遮断したままでは機能が停止します。この点を踏まえ、解除の判断は次の順序で行うことを推奨します。

  1. 管理下の全サイトが修正版へ更新済みであることを実測で確認する
  2. バッチ API を利用する連携機能の有無を洗い出す
  3. 連携がない場合は、当面は遮断を維持する
  4. 連携がある場合は遮断を解除し、ルールを Log 動作へ切り替えて可視性のみ残す

バッチ API を使用していない環境であれば、遮断を維持しても運用上の不利益はほとんどありません。遮断ルールを外す判断は、「更新が完了したか」ではなく「更新が完了したことを確認できたか」で行うことを推奨します。前章で扱ったバージョンの実測が、この判断の前提になります。

CVSS スコアだけで優先度を決めた場合の落とし穴

wp2shell は、脆弱性管理の運用そのものを見直す材料にもなります。この件では深刻度の評価が定まらないまま推移しており、スコアを機械的に閾値へ当てはめる運用では対応の優先度を見誤る余地があるためです。

評価が定まらないまま運用判断を迫られた

CVE-2026-63030 について、2026 年 8 月 1 日時点の NVD の記載を確認すると、状況が見えてきます。NVD 自身による評価は付与されておらず、掲載されているのは CISA-ADP による CVSS 3.1 の 7.5(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)のみです。分類は CWE-436(解釈の競合)で、影響評価は機密性のみを認め、完全性・可用性への影響はいずれも「なし」となっています。

コード実行に至る攻撃チェーンの起点でありながら、単体の評価では「情報が漏れる可能性のある解析上の問題」として算定されているわけです。ルート混同それ自体はリクエストの解釈がずれる欠陥であり、コード実行を直接引き起こすものではないため、この算定自体は不合理ではありません。

参考: CVE-2026-63030 Detail(NVD)
“NVD assessment not yet provided”
(NVD による評価は未提供)
https://nvd.nist.gov/vuln/detail/CVE-2026-63030

評価元によってスコアが割れている

一方、他の評価元は異なる数値を採用しています。2026 年 8 月 1 日時点で確認できる範囲を整理します。

評価元CVE-2026-63030 の扱い
NVD(NIST)未評価
CISA-ADP7.5(High、CWE-436)
WordPress(GitHub Security Advisory)Critical
一部のセキュリティベンダー・国内報道9.8(Critical)

同一の脆弱性に対して、未評価・High・Critical・9.8 が併存しています。どれを参照するかによって、社内の対応期限が数日単位で変わりうる状態です。実際、KEV への登録によって連邦機関には 7 月 24 日という期限が設定されましたが、これはスコアではなく悪用の事実に基づく判断でした。

脆弱性管理プロセスへの示唆

この件から導ける実務的な論点を整理します。

スコア閾値のみの運用では取りこぼしが生じる

「CVSS 9.0 以上を即時対応」という運用の場合、7.5 と評価された CVE-2026-63030 は即時対応の対象から外れます。連鎖を前提としたリスクは、単体スコアの閾値では捕捉できません

深刻度ラベルは評価元とセットで扱う

開発元の Advisory、CVE レコード、ベンダー独自評価は、それぞれ算定の前提が異なります。社内基準でどれを一次情報とするかを事前に決めておくと、判断のぶれを抑えられます

スキャナーの検出結果を CVE 単位で読まない

6.8 系は CVE-2026-60137 のみを検出しますが、これは RCE の影響下にあることを意味しません。逆に、CVE-2026-63030 のみを検出する構成では、SQL インジェクション側の未修正を見落とす可能性があります

悪用状況を優先度に組み込む

今回のように、公開から数日で PoC の公開と悪用報告が進む事例では、スコアよりも悪用の観測状況のほうが緊急度の判断材料として機能します

スコアは優先度を決めるための入力の 1 つであり、それ単体で運用判断を確定させるものではありません。連鎖を前提とした攻撃が一般化している以上、単体の数値と実際の攻撃成立条件を分けて評価する運用が現実的です。

まとめ

wp2shell への対応は、更新の適用でひと区切りとなりますが、運用者の作業はそこで終わりません。強制自動更新が届かない構成が存在し、更新前の期間には攻撃の機会が残っていたためです。パッチ公開から 2 週間が経過した現在も試行の観測は続いており、更新の到達確認、アクセスログの点検、管理者アカウントの棚卸しまでを一連の作業として扱うことをおすすめします。

  • 更新の適用は通知ではなく実測で確認
  • 自動更新は定数・フィルター・VCS 検出で抑止される。
  • 点検対象はバッチルートへの 2 つの到達経路
  • 管理者アカウントの棚卸しで侵害の痕跡を確認
  • 公開 PoC の痕跡が無くても安全の証明にはならない。
  • 攻撃試行は継続中のため WAF 遮断は当面維持
  • 単体の CVSS スコアでは連鎖のリスクを捕捉できない。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次