WordPress 7.1.2、Critical脆弱性を修正|「条件付き」の中身を読む

[最終更新]

Googleで優先するソースとして追加するボタン

5日前に「もう7.1.1になっているでしょうか」と書いたばかりでした。そのバージョンが、今回の修正対象に入っています。ログインも要らず、狙った相手に操作させる必要もなく、影響はおよそ10年分のリリースに及びます。ただし、公式が付けたCriticalという評価には、「条件がそろえば」という但し書きが添えられています。


WordPress.orgは2026年9月22日、WordPress 7.1.2を公開した。修正はページテンプレートの解決処理にある未認証のパストラバーサル1件で、識別子はCVE-2026-87902(GHSA-7hp8-65ch-5whp)、CVSS v4.0のスコアは9.2である。有効なテーマの直下にpage-で始まるディレクトリがあり、サーバー上の読み取り可能なPHPファイルを悪用できる場合に、リモートコード実行に至る。

後者の例として、register_argc_argvが有効な環境でのpearcmd.phpが挙げられている。影響は4.7.0から7.1.1までで、修正は4.7系までの各ブランチに提供された。報告者はRobert Ressl氏。

From: 文献リンクUnauthenticated path traversal in page-template resolution leading to conditional RCE

【編集部解説】

5日前、WordPress 7.1.1を扱った記事を「お使いのWordPressは、もう7.1.1になっているでしょうか」という問いで締めました。その7.1.1が、今回の影響範囲に入っています。

7.1.1まで上げたサイトも、もう一度更新が必要です。

7.1.2で修正されたもの

WordPress.orgは日本時間9月22日23時すぎ、WordPress 7.1.2を公開しました。修正は1件だけです。変更されたファイルもwp-includes/template.phpの1つに限られます。

報告したのはRobert Ressl氏です。

1件だけでも、公式の深刻度はCriticalです。ログインは要りません。ログイン中の誰かに操作させる必要もありません。影響は4.7.0から7.1.1まで、およそ10年分のリリースに及びます。

修正は、4.7系まで各ブランチに提供されています。6.9系なら6.9.9、6.8系なら6.8.10というように、使っている系列の修正版に上げれば、メジャーバージョンを飛び越えずに済みます。ただし公式は、積極的にサポートしているのは最新版だけだとあらためて書いています。

「条件付き」の中身

アドバイザリの題名には、条件付きのリモートコード実行とあります。この「条件」は、公式のアドバイザリに具体的に書かれています。

1つ目は、テーマ側の条件です。有効な子テーマか親テーマの直下に、名前がpage-で始まるディレクトリ(page-templatesなど)があることです。公式は該当する例として、旧デフォルトテーマのTwenty TwelveとTwenty Fourteen、そしてサードパーティ製のNeve、Hestia、Sydneyを挙げています。

公式が該当例として挙げたデフォルトテーマは、Twenty TwelveとTwenty Fourteenです。今回、7.1.2の開発リポジトリに含まれるデフォルトテーマを確認した範囲では、直下にpage-で始まるディレクトリがあったのは、この2つでした。使っているテーマは、名前や制作時期で判断せず、子テーマと親テーマの両方を実際に確かめてください。

2つ目は、サーバ側の条件です。読み込ませる先として、読み取り可能なPHPファイルがサーバ上に必要です。よく知られているのが、PEARのpearcmd.phpを経由してコード実行へ移る手口で、これはPHPの設定register_argc_argvが有効な場合に成立します。公式は、PHPの公式Dockerイメージと、PHP 8.5未満を使う既定のcPanel構成がこれに当たるとしています。

条件の1つ目は、ファイルを読み込ませる入口が開くかどうか。2つ目は、読み込ませた先でコードを動かせるかどうかです。両方がそろったときに、最悪の結果に届きます。

原因は、細部にありました。ページを表示するとき、WordPressは表示に使うテンプレートの候補を並べます。7.1.1までは、URLから来るページ名をデコードした値が、検証を経ずに候補のファイル名に組み込まれていました。同じ関数の数行上では、ページテンプレートの指定がvalidate_file()という検証を通っています。守りの仕組みは、すぐ隣にありました。

9.2と8.1、2つの数字

この脆弱性には、2つの深刻度が付いています。

WordPressのアドバイザリはCVSS v4.0で9.2、Criticalです。一方、Wordfenceによる評価はCVSS 3.1で8.1、Highです。

食い違って見えますが、対象は同じ脆弱性です。違うのは、CVSSの版と評価者です。v4.0には「攻撃要件」という独立した項目があり、WordPressはこれを「あり」と評価しました。Wordfenceのv3.1評価では、「攻撃の複雑さ」が「高」です。ただし、2つの版は採点する項目も計算の仕方も異なります。この2つの項目を一対一に対応させたり、点数差をそれだけで説明したりはできません。

どちらの数字も、条件付きであることを織り込んだうえでの値です。数字だけを見比べて、どちらかを過大、過小と読む必要はありません。

修正公開から5時間

Patchstackは続報で、公開後の動きを報告しています。

最初の試行が同社の記録に残ったのは、日本時間9月23日2時44分。7.1.2の公開から5時間たっていません。使われたリクエストは、修正で塞がれたのとまったく同じエンコードの形をしていました。同社は、独自に見つけたのではなく、修正の差分から組み立てたものだと見ています。

ただし、観測されたのは偵察の段階です。読み込ませる先はWordPressコアの通常のファイルで、それ自体は攻撃者に何も与えません。読み込みが成功したかどうかを判定するためのものです。同社は、コード実行に使える標的を狙う動きはまだ見えていないとしています。本稿が9月23日に確認した時点では、同社が公表した最新の活動は9月22日19時51分(UTC、日本時間23日4時51分)で、記述は偵察の段階にとどまっていました。これは1社の観測で、状況は動きえます。

7.1.1の記事では、脆弱性を見つける速度が上がっていることを取り上げました。今回見えたのは、公開された修正を読み解く速度です。修正が公開されることは、攻撃する側にとっても手がかりになります。更新が日常の運用に組み込まれているかどうかが、そのまま差になる局面です。

直し方に込められた設計

修正の中身にも、読むべきところがあります。

7.1.2の変更は二段構えです。一段目は、デコードしたページ名にもvalidate_file()を通すもので、報告された穴はこれで塞がります。

二段目として、テンプレートを探す関数locate_template()に新しい確認が加わりました。見つけたパスに「..」が含まれる場合、実際の保存先を解決し、それがテーマや、WordPress同梱の互換用ディレクトリといった、許可された場所から外れるファイルは読み込みません。どの経路から来た候補であっても、最後にこの関門を通ることになります。

Patchstackはこの二段目を、報告された1本の経路だけでなく、テンプレートの解決という処理そのものを1つの問題の類型として扱った判断だと評価しています。1本の穴を塞ぐだけでなく、同じ形の穴が別の場所に開いていても効く柵を足した。10年分のブランチに同じ修正を届ける作業とあわせて、守る側の地道な設計が見える変更です。

日本の読者にとって

確かめたいことは、順に3つです。

1つ目は、バージョンです。7.1系なら7.1.2、それより古い系列なら、その系列の修正版になっているかを確認してください。自動のバックグラウンド更新が有効なサイトでは、更新が自動で始まります。ただ、制作や保守を外部に委託しているサイトでは、自動更新の設定そのものが契約や運用方針で変わります。エックスサーバーがwp2shellの際に顧客のWordPressを更新した件で見たとおり、更新を誰が押すのかは一律ではありません。

2つ目は、テーマです。有効なテーマ(子テーマなら親テーマも)の直下に、page-で始まるディレクトリがあるかどうか。長く運用しているサイトで、Twenty TwelveやTwenty Fourteenをもとにしたデザインが残っていないか。これは更新までの間に、自分のサイトが最悪の条件にどれだけ近いかを知る手がかりになります。対策そのものではありません。

3つ目は、ログです。Patchstackは、pagenameというパラメータに二重にエンコードされた「..」(%252e%252e)が含まれるリクエストや、pagenameとpage_idが同時に指定されたリクエストを、探すときの目印として挙げています。通常のページのURLに対して、本来返るはずのないコアのファイルの出力が返っていれば、読み込みが成功していた可能性があります。更新前の期間のログは、その目で見直す価値があります。

速さが両側でそろった先に

修正版が4.7系まで一斉に並び、その数時間後には偵察が始まる。守る側も攻める側も、速度の水準が一段上がっています。

その中で、差を生むのは最後の一歩です。修正はすでに届いています。あとは、それが各サイトで実際に当たるかどうかです。

お使いのWordPressは、7.1.2、あるいはお使いの系列の修正版になっているでしょうか。

【関連記事】

【解説】WordPress 7.1.1|脆弱性を見つける側が入れ替わった
5日前に公開した7.1.1の解説。今回の記事が呼応する、脆弱性を見つける速度の変化を扱っている。

WordPress、守る場所は管理画面からAPIへ|wp2shellが示したもの
攻撃面が管理画面からAPIへ移ったことを論じた記事。守るべき場所の変化を設計の側から読み解く。

エックスサーバー、wp2shell対応で顧客のWordPressを更新
事業者が顧客のWordPressコアを更新した一件。更新を誰が押すのかを、契約と運用の側から扱っている。

【編集部後記】

公開から5時間たたないうちに、偵察のリクエストが飛び始めました。使われたのは、修正で塞がれたのとまったく同じエンコードの形です。差分を読めば、どこが穴だったかは分かってしまいます。

修正が公開されることは、直す側の合図であると同時に、探す側への地図でもある。その両義性を引き受けながら、それでも公開して直すという選び方を、WordPressは続けています。お使いのサイトは、もう当たっているでしょうか。


【用語解説】

リモートコード実行(RCE)
遠隔から、対象のサーバー上で任意のプログラムを動かされること。Web上の脆弱性としては最も深刻な部類に位置づけられる。

パストラバーサル
本来触れないはずのファイルへ、経路をさかのぼって到達する攻撃。今回は、読み込むテンプレートのファイル名を通じて成立した。

ローカルファイルインクルージョン(LFI)
サーバー内にあるファイルを、意図せず読み込ませる脆弱性。読み込ませた先のPHPが動く場合、コード実行につながることがある。

未認証
ログインなどの本人確認を一切経ずに攻撃が成立する性質。IDやパスワードを持たない第三者でも悪用できる。

CVSS
脆弱性の深刻度を0.0から10.0で表す指標。版によって採点する項目や計算方法が異なる。今回はv4.0で9.2、v3.1で8.1と、版ごとに値が違う。

CVE
脆弱性に振られる世界共通の識別番号。今回はCVE-2026-87902。

PEAR
PHPの古いパッケージ管理の仕組み。同梱のpearcmd.phpが、条件によってはコード実行の足がかりに使われる。

register_argc_argv
PHPの設定項目の一つ。有効な場合に、今回の手口の一部が成立する。

バックポート
新しいバージョンで施した修正を、サポート対象の古いバージョンにも適用すること。今回は4.7系まで及んだ。

ページテンプレート
WordPressが、ページの表示に使うPHPファイル。テーマの中に置かれる。

【参考リンク】

WordPress 7.1.2 Release(外部)
7.1.2の公式リリース告知。修正の内容、報告者Robert Ressl氏への謝辞、4.7系までのバックポート方針を記している。

Version 7.1.2|WordPress Documentation(外部)
HelpHubのバージョン情報ページ。4.7系までのブランチ別修正版の一覧と、今回変更された唯一のファイルが確認できる。

GHSA-7hp8-65ch-5whp(外部)
GitHubのセキュリティ勧告。CVSSベクター、4.7から7.1.1までの影響範囲、テーマとサーバの前提条件を記載する。

WordPress.org(外部)
WordPressの公式サイト。最新版と、使っている系列ごとの修正版の入手先。更新の要否もここで確認できる。

【参考記事】

WordPress 7.1.2 Security Release: Unauthenticated LFI to RCE(外部)
原因となったコードの位置、テーマとサーバの前提条件、二段構えの修正が持つ意味を、原文を引きながら詳しく解説する。

CVE-2026-87902: Attackers Started Probing WordPress Sites Hours After the Patch(外部)
公開当日に観測された偵察の続報。使われたリクエストの特徴と、ログから探すときの目印を、具体的な文字列で挙げている。

WordPress Issues Patch for Critical Flaw That Can Enable Code Execution on Some Servers(外部)
The Hacker Newsの報道。9月17日の7.1.1で更新したばかりのサイトも、今回の対象に含まれる点を伝えている。

Changeset 63792|WordPress Trac(外部)
7.1.2の変更差分そのもの。validate_file()の追加と、新設された関数によるパスの確認が、原文のコードで追える。

Googleで優先するソースとして追加するボタン
投稿者アバター
山本 達也 代表社員
合同会社デジタルの窓口 代表。ウェブ解析士。生成AI・サイバーセキュリティ・ 宇宙開発領域を中心に執筆。

おすすめ記事