XML-RPCは、WordPressが採用している規格の1つです。異なるシステム間の通信を標準化し、WordPressを含む様々なアプリケーション(ブログプラットフォームやデスクトップアプリなど)がWordPressサイトと情報をやり取りする役目を担います。

XML-RPCはWordPress最初のリリース当初からあり、非常に有用な役割を果たしました。XML-RPCがなければ、WordPressはインターネット上で孤立し、日の目を見ていなかったかもしれません。

ただし、xmlrpc.phpには欠点もあります。xmlrpc.phpはWordPressサイトに脆弱性をもたらす可能性があり、現在はWordPress REST APIが代わりの役割を果たしています。

xmlrpc.phpとは何か、なぜ無効化する必要があるのか、そして使用中のWordPressサイトで実行されているかどうか確認する方法を解説します。

xmlrpc.phpとは

XML-RPCは、WordPressと他のシステム間の通信を可能にするための規格です。転送技術にHTTP、エンコーディング技術にXMLを採用しており、通信を標準化する役目を担います。

WordPressが登場したのは2003年ですが、XML-RPCはそれ以前から存在していました。WordPressのフォーク元のブログソフト「b2」の時点で、すでにXML-RPCに対応済みでした。実際のコードは、サイトのルートディレクトリにあるxmlrpc.phpというファイルに格納されています。そして、XML-RPCがほとんど時代遅れになっているにもかかわらず、未だにxmlrpc.phpが同梱され続けています。

WordPressは当初、XML-RPCをデフォルトで無効化していました。ところが、WordPressモバイルアプリが設置済みのWordPressと通信できるようにするため、バージョン3.5以降はデフォルトで有効化されています。

バージョン3.5以前のWordPressでモバイルアプリを使用するには、アプリからの投稿機能を利用するために、サイト上でXML-RPCを有効化する必要がありました。WordPressモバイルアプリは、それ自体がWordPress自体を実行しているのではなく、WordPress側のxmlrpc.phpと通信して機能する、本体とは別のアプリです。

XML-RPCは、モバイルアプリだけではなく、WordPressと他のブログプラットフォーム間の通信を可能にするためにも使われていました。トラックバックピンバックを可能にしたり、Jetpackプラグインが、WordPress.com外に設置したサイトとWordPress.comとを連携させたりするのに使用されていました。

ところが、REST APIがWordPress本体に実装されてからは、xmlrpc.phpファイルはこの通信に使われなくなりました。REST APIはWordPressのデスクトップアプリやモバイルアプリ、他のブログプラットフォーム、WordPress.com(Jetpackプラグイン用)、その他のシステムやサービスとの通信に使用されています。REST APIが対応するシステムの範囲は、xmlrpc.phpで可能だった範囲よりもはるかに広がり、より柔軟性があります。

すでにXML-RPCに代わり、REST APIが利用できるため、サイトに同梱のxmlrpc.phpは無効化されるべきです。ここからは、無効化すべき理由をさらに詳しく解説していきます。

xmlrpc.phpを無効化すべき理由

WordPressサイトでxmlrpc.phpを無効化すべき主な理由は、xmlrpc.phpがセキュリティ脆弱性をもたらし、攻撃の標的になる可能性があるためです。

XML-RPCがWordPress外部との通信に必要なくなった今、有効化しておく理由はありません。無効化してサイトの安全性を高めることが賢明です。

では、xmlrpc.phpはセキュリティ上問題があるうえに、もう不要となったのに、なぜ未だにWordPressから完全に削除されていないのでしょうか?

これは、WordPressが後方互換性を重視しているためです。適切にサイト管理をしていれば、プラグインテーマだけでなく、WordPressを常に最新の状態に保つことが不可欠であることはすでにご存知でしょう。ところが、WordPressバージョンを更新しない方針のサイトや、更新したくても技術的に困難なサイトがなかなか無くなりません。REST API導入以前のバージョンのWordPressが未だに存在するため、xmlrpc.phpへのアクセスが必要なのです。

ここからは、具体的な脆弱性の内容をご紹介します。

XML-RPCピンバックによるDDoS攻撃

xmlrpc.phpによって利用できる機能に、ピンバックとトラックバックがあります。これは、対象サイトが他のブログやサイトからリンクされると、被リンクサイトのコメントとして表示する通知です。

従来はXML-RPC規格がこの通信を行っていましたが、現在はREST APIが代用します。

サイトでXML-RPCが有効化されていると、ハッカーがxmlrpc.phpを悪用してサイトにDDoS攻撃を仕掛け、短時間に膨大な数のピンバックを送信する可能性があります。サーバーに過度な負荷がかかってしまい、サイトが停止してしまう可能性があります。

XML-RPCによるブルートフォース攻撃

xmlrpc.phpはリクエストを行うたびに、認証用のユーザ名とパスワードを送信します。これはセキュリティ上、非常に懸念のある仕様です。REST APIでは、より安全なOAuthによって認証しており、ユーザー名やパスワードの代わりにトークンを送信する仕組みです。

xmlrpc.phpはリクエストごとに認証情報を送信するので、ハッカーがこの認証情報を使ってサイトへの侵入を試みる可能性があります。このような総当たり攻撃によって、ハッカーがコンテンツを挿入したり、コードを削除したり、データベースに損害を与えたりできてしまうかもしれません。

もし攻撃者が、異なる組み合わせのユーザー名とパスワードで大量のリクエストを送れば、そのうち正しい組み合わせを割り出し、サイトに侵入できてしまう可能性があります。

そのため、外部システムとの通信にREST APIを使用する最新バージョンのWordPressを実行している場合は、xmlrpc.phpの無効化が必要です。不要な機能によって、サイトを脆弱にする必要はありません。

xmlrpc.phpが設置済みのWordPressサイトで動作しているか確認する方法

まずは、現在使用中のWordPressサイトでxmlrpc.phpが実行されているかどうか確認しましょう。

WordPress本体にPHPファイルが同梱されているため、XML-RPCが有効かどうかにかかわらず、PHPファイル自体は存在しています。

サイトでxmlrpc.phpが有効化されているかどうか確認するには、XML-RPC Validator Web Appを使用してください。このサイトでは、指定したサイトでxmlrpc.phpが有効化されているどうか確認できます。

XML-RPC Validator Web App
XML-RPC Validator Web App

kinsta.com」と入力すると、xmlrpc.phpが無効化されていることが確認できます。サイトを調査し、xmlrpc.phpが有効になっていた場合は、次のセクションでご紹介する手順に従って、xmlrpc.phpを無効化しましょう。

xmlrpc.phpを無効化する方法

xmlrpc.phpを無効化する方法は、3つあります。

それぞれ個別に見てみましょう。

プラグインでxmlrpc.phpを無効化

専用のプラグインをインストールするのが、xmlrpc.phpを無効化する最も簡単な方法です。Disable XML-RPCプラグインは、xmlrpc.phpを完全に無効化します。使い方は以下の通りです。

実際のサイトでの設定方法を見ていきます。このサイトは元々xmlrpc.phpが有効になっていました。以下のスクリーンショットは、XML-RPC Validator Web Appでのテスト結果です。

筆者ウェブサイトのXML-RPC確認
筆者ウェブサイトのXML-RPC確認

WordPress管理画面の「プラグイン」からプラグインをインストールし、有効化します。

これだけでXML-RPCが無効化されました。

筆者ウェブサイトの2度目のXML-RPC確認
筆者ウェブサイトの2度目のXML-RPC確認

XML-RPCピンバックのみプラグインで無効化

xmlrpc.phpの機能のうちピンバックは不要だが、他の機能は必要という場合は、Disable XML-RPC Pingback プラグインがおすすめです。ピンバック以外のXML-RPCの機能を引き続き使用することができます。

このプラグインも、Disable XML-RPCプラグインと同様、インストールして有効化するだけで動作します。

XML-RPCとREST APIをプラグインで制御

xmlrpc.phpとREST APIの設定をより細かく制御するには、REST XML-RPC Data Checkerプラグインがおすすめです。

プラグインをインストールして有効化したら、管理画面メニューの「設定」>「REST XML-RPC Data Checker」を開き、「XML-RPC」タブをクリックします。

REST XML-RPC Data Checker
REST XML-RPC Data Checker

この設定ページから、xmlrpc.phpのどの機能を有効化するか、またはすべてを無効化するか、細かく設定できるようになってます。

REST APIも同様に、専用のタブから制御できるようになっています。

プラグインなしでxmlrpc.phpを無効化

プラグインを増やしたくない場合は、フィルターや.htaccessファイルにコードを追加することでも、xmlrpc.phpを無効化できます。

フィルターでxmlrpc.phpを無効化

フィルターでxmlrpc.phpを無効化するには、xmlrpc_enabledフィルターを使用します。プラグインを作成し、以下の関数をプラグインに追加して、サイト上で有効化してください。

add_filter( 'xmlrpc_enabled', '__return_false' );

上記のコードはテーマのfunctions.phpファイルに追加しても動作しますが、このような設定をテーマで行うのは非推奨のため、可能であればプラグインで行いましょう。

または、FTPまたはcPanelサイトのサーバーに接続して、Apacheホスティングで利用可能な.htaccessファイルに設定追加することもできます。

.htacessファイルでxmlrpc.phpを無効化

.htaccessファイルに以下のコードを追加すれば、xmlrpc.phpの無効化を設定できます。

<Files "xmlrpc.php">
  Require all denied
</Files>

万が一問題が発生した場合に備え、事前に現在のファイルをコピーしておいてください。

ホスティング会社に依頼してxmlrpc.phpを無効化

ホスティングによっては、攻撃が検出されると自動でxmlrpc.phpを無効化し、通常の応答に代わり403エラーを表示して、攻撃を阻止する機能が用意されていることもあります。

Kinstaでは、特に設定しなくてもデフォルトでxmlrpc.phpをブロックしているため、心配いりません。もし何か不具合がある場合は、カスタマーサポートへお問い合わせください。

もし自分でxmlrpc.phpの無効化を設定しなければならない場合、今回ご紹介した方法のいずれかを選び、設定してください。その際、事前にホスティングのサポートに連絡し、設定に必要な要件を満たしているか確認することをおすすめします。

xmlrpc.phpを有効化したほうがいい場合

以下のような状況では、xmlrpc.phpが必要、または完全に無効化しない方が良い場合があります。

  • REST APIを無効化している(非推奨だが、状況によってはやむを得ない)が、WordPressサイトと他のシステム間での通信が必要な場合。
  • WordPressをバージョン4.4以降に更新できず、REST APIが利用できない場合。ホスティング側で制限がかかっているか(ホスティング会社の乗り換えが必要)、テーマやプラグインの非互換性(別の製品で代用するか更新が必要)のいずれかが原因であることが多い。
  • WP REST APIに非対応で、XML-RPCのみで利用できる外部アプリケーションを使用し続けたい(長期的には、該当のアプリケーションを更新するか、REST API互換のアプリケーションへの乗り換えをおすすめ)。

上記のいずれも、XML-RPCを有効化しておくリスクを考慮すると、重要性の低い、望ましくないものです。

XML-RPCがWordPressに残っている唯一の理由は後方互換性のためなので、古いシステムを使用していて、どうしても必要な場合にのみ使用するようにしてください。サイトを常に最新の状態に保ち、最新技術を使って動作させるには、xmlrpc.phpを無効化することをおすすめします。

まとめ

XML-RPCは、WordPressが外部システムやアプリケーションと通信するための手段として、WordPressが誕生する前に規格化されました。ただし、本質的なセキュリティの欠陥があり、サイトが攻撃に対して脆弱になるおそれがあります。

REST APIがあれば、サイトが他のアプリケーションと通信できるようになった今、xmlrpc.phpを安全に無効化することができます。今回の記事でご紹介した手順に従ってxmlrpc.phpを無効化し、サイトのセキュリティを強化しましょう。

Rachel McCollin

Rachel McCollin has been helping people build websites with WordPress since 2010. She's a huge fan of self-hosted WordPress and wants to help as many people as possible create an awesome website with it.