WordPressの開発版リポジトリで、かなり重い脆弱性の告知が出ました。認証されていない攻撃者が、ページテンプレートの解決処理を悪用して、テーマの外にあるローカルのPHPファイルを読み込ませられるという内容です。条件がそろうとリモートコード実行、つまりサーバー上で任意のコードを動かされるところまで行きます。しかも影響範囲は古い系統まで広く、実運用のサイト管理者が気にしないわけにいかない種類の話です。
GitHubのWordPress/wordpress-developに載った今回の告知は、WordPressの get_page_template() に関する問題を扱っています。get_page_template() は、ページを表示するときにどのテンプレートファイルを使うかを探す関数です。通常なら、有効なテーマの中から該当するPHPファイルを見つけて表示に使います。ところがこの脆弱性では、認証なしの攻撃者がその解決処理を細工し、アクティブなテーマディレクトリの外にある、読み取り可能なローカル .php ファイルを選んで読み込ませられるとされています。
ここで厄介なのは、「ただファイルが見える」だけで終わらない点です。告知では、サーバー環境と有効なテーマの条件がそろえば、RCE、つまり遠隔からコード実行にまでつながると明記されています。単なる情報漏えいではなく、サーバーを操作される側に回る可能性がある、かなり深刻なタイプです。
成立条件もかなり具体的です。まず、有効な子テーマか親テーマのトップレベルに、名前が page- で始まるディレクトリが必要だとされています。たとえば page-templates のような名前です。告知では、これが旧来の Twenty Twelve と Twenty Fourteen に影響し、さらに Neve、Hestia、Sydney といった第三者テーマにも見られるとしています。つまり「古い標準テーマだけの問題」とは言い切れません。
もう一つの条件は、読み込ませたいローカルのPHPファイルがサーバー上に存在し、Webサーバーのアカウントから読めることです。ここで例として挙げられているのが pearcmd.php を使う PEAR→RCE の流れです。register_argc_argv が On のときに使えるとされ、公式の PHP Docker image が影響を受けるほか、PHP 8.5 より前を使うデフォルトの cPanel 構成も該当すると説明されています。つまり、WordPress単体の欠陥というより、WordPressのテンプレート探索と、周辺のPHP実行環境が噛み合って事故になる話です。
影響を受けるWordPressの版も広く、4.7.0 から 7.1.1 までの多数の系統が並んでいました。修正版は 7.1.2 とされ、そのほか古い枝にも後方移植されています。告知の書き方を見る限り、これは新しい系列だけを直して古い利用者を切り捨てる扱いではなく、かなり広いサポート範囲に対して一斉に手当てした形です。発見者は Robert Ressl と記載され、責任ある開示として報告されたことも明らかにされています。
この件でまず感じるのは、攻撃の起点が「認証なし」であることの重さです。管理画面に入られたとか、投稿権限を奪われたとかではなく、サイトに普通にアクセスできる外部の人間が、表示の仕組みを使ってサーバー内部へ寄り道できる。こうした脆弱性は、実際にはかなり見つけにくいことが多いのですが、ひとたび条件がそろうと、守る側が想定していた境界を一気に飛び越えます。ログを見ても、最初はただのページ要求に見えるかもしれない。そこが厄介です。
さらに印象的なのは、脆弱性の「成立条件」が妙に現実的なことです。page- で始まるディレクトリ名があるテーマ、という条件は、開発者がテンプレートを整理するために普通に置きそうな構成です。しかも Twenty Twelve や Twenty Fourteen のような古い標準テーマだけでなく、Neve、Hestia、Sydney のような実際に使われている第三者テーマにも触れている。つまり、古いものを捨てていれば安全、ではなく、いまも残っている現場の都合がそのまま攻撃面になっているわけです。
私が少し気になるのは、WordPress側の修正だけでなく、PHP側の環境条件まで絡む点です。pearcmd.php と register_argc_argv の組み合わせのように、別の仕組みが「遠隔コード実行の踏み台」として使われると、アプリケーションの修正だけでは防ぎきれない場面が出ます。つまり、サイト運営者は「WordPressを更新したから大丈夫」で終わらせず、PHPイメージやホスティング設定、テーマ構成まで見直さないといけない。ここは運用負担としては地味ですが、実は一番効きます。
今回の告知で評価したいのは、修正が 7.1.2 だけで終わっていないことです。4.7.0 までさかのぼる多数の系統に backport しているので、古いサイトほど放置されやすいという現実にちゃんと目を向けている。オープンソースの世界では、最新に追従していない導入先が大量に残るのは珍しくありません。そこを切り捨てずに修正を配るのは、被害の総量を減らすうえでかなり意味があります。
ただ、これは逆に言うと、古い系統を使い続けるリスクが改めて可視化されたとも読めます。WordPressは長く使われるぶん、テーマやプラグイン、PHPランタイム、ホスティングの癖が積み重なりやすい。ひとつの脆弱性が、その積み重なりを経由して別の脆弱性の入口になる。今回のように、テンプレート探索の不備が「ローカルのPHPファイルを選ばせる」ことにつながり、それが周辺環境次第でRCEになる構図は、まさにその典型です。便利さの裏で、層が増えるほど攻撃の組み合わせも増える、という現実がよく出ています。
もうひとつ大事なのは、影響の説明がかなり丁寧で、条件がはっきり書かれていることです。安全側の人間からすると、この手の説明は「危険だ」という抽象論よりずっと役立ちます。どのテーマ構造がまずいのか、どのPHP構成が危険か、どの版が修正版かが見えるからです。逆に言えば、条件がそろっていない環境でも安心しきらず、テーマのディレクトリ名やPHP設定を見直すきっかけにすべきだと思います。WordPressの更新はもちろん前提ですが、それだけでは終わらない種類の警告です。
参考: Unauthenticated path traversal in page-template resolution leading to conditional RCE