Hushfort

xmlrpc.php とは何ですか? WordPress で無効化するには?

執筆:Eureka Studio · 更新日

要点

XML-RPC を使うと、アプリは xmlrpc.php からログインできます。これは wp-login.php を隠しても塞がらない別の入口です。Jetpack や WordPress モバイルアプリを使っていなければ、無効にしても安全です。.htaccess でファイルをブロックするか、xmlrpc_enabled フィルターを追加するか、ピンバックを残したまま XML-RPC のログインを閉じるプラグインを使います。その後、結果をテストしてください。

手順

  1. 1手順 1

    xmlrpc.php が応答するか確認する

    yoursite.com/xmlrpc.php にアクセスします。「XML-RPC server accepts POST requests only.」と表示されたら、入口は開いています。

    yoursite.com/xmlrpc.php の応答: XML-RPC server accepts POST requests only
  2. 2手順 2

    なぜ問題なのかを理解する

    Hushfort の攻撃面スキャンは、実際に試してみます。開いているサイトでは、隠したログインパスを迂回してパスワードを試せること、そして system.multicall で 1 回のリクエストに数百回の試行を詰め込めることを報告します。

    Hushfort「概要」の攻撃面スキャン: XML-RPC が開いており system.multicall も開いている。さらに REST ユーザー一覧と投稿者スキャンでユーザー名 demo-admin が漏れている
  3. 3手順 3

    どこまで閉じるかを選ぶ

    「Hushfort → 攻撃面の強化」を開き、「攻撃面の強化を有効化」をオンにします。XML-RPC は最初「ログインを無効化し、ピンバックは維持 (推奨)」になっており、ほとんどのサイトに適しています。「完全に無効化」は最も厳格ですが、Jetpack と公式モバイルアプリが使えなくなります。「変更を保存」を押します。

    攻撃面の強化がオンで、XML-RPC が「ログインを無効化し、ピンバックは維持 (推奨)」に設定されている
  4. 4手順 4

    XML-RPC 経由のログインが拒否されることをテストする

    「概要」に戻り、「再スキャン」を押します。XML-RPC の行が「ログインは無効です。パスワードの試行は拒否され、ピンバックは引き続き機能します。」になっていれば成功です。

    修正後の攻撃面スキャン: XML-RPC、REST ユーザー一覧、投稿者スキャン、サイトマップの投稿者一覧がすべて塞がれている

なぜ重要なのか

XML-RPC は、WordPress を遠隔操作するための古いインターフェースです。REST API が登場する前は、デスクトップのエディターやモバイルアプリはこれを使って投稿を公開していました。今もすべての WordPress サイトに /xmlrpc.php として含まれており、リクエストごとにユーザー名とパスワードを受け付けます。

つまりこれは第二のログイン口です。wp-login.php を隠しても影響しません。ログインフォームだけを監視するログイン制限のコードには見えません。しかも system.multicall を使えば、1 回の HTTP リクエストに数百回のパスワード推測を詰め込めます。リクエスト数を数える制限には、500 回の試行が 1 回にしか見えません。

これは机上の空論ではありません。このレイヤーを作ったのは、ログインページをすでに隠していたのに、XML-RPC 経由でパスワードの試行を受け続けたあるストアがきっかけでした。

XML-RPC を使っていますか? 次のどれにも当てはまらなければ、おそらく使っていません:

  • サイトを Jetpack に接続している。
  • WordPress 公式モバイルアプリから投稿やコメントの管理をしている。
  • 古いデスクトップのブログツールや、(アプリケーションパスワードではなく) WordPress のユーザー名とパスワードを求めて代わりに投稿するサービスを使っている。
  • 他のブログからのピンバックを活用している。

わからなければ、ログインだけを閉じてピンバックは残しましょう。パスワード推測のリスクはなくなり、無害な部分はそのまま残ります。後からいつでも厳しくできます。

よくある間違い

  • ログインを隠して終わりにする。 パスワードの推測が xmlrpc.php に移るだけです。
  • 確認せずにファイル全体をブロックする。 Jetpack と WordPress 公式モバイルアプリは XML-RPC 経由で接続します。使っている場合は、ログイン用のメソッドだけを閉じるか、慎重にテストしてください。
  • テストせずにスイッチを信用する。 方法によっては、XML-RPC の一部が応答し続けます。結果は必ず実際のリクエストで確認してください (ステップ 4、またはサイトが何を公開しているかを確認する方法を参照)。
  • キャッシュ層を忘れる。 CDN のルールですでに xmlrpc.php をブロックしているなら、WordPress 側の設定には何の効果も見えません。それで問題ありません。どの層が働いているかを把握しておけば十分です。

プラグインを使わない方法

方法 1: xmlrpc_enabled フィルター。 小さな必須プラグイン (wp-content/mu-plugins/no-xmlrpc-login.php) か、子テーマの functions.php に次を追加します:

<?php
add_filter( 'xmlrpc_enabled', '__return_false' );

これでログインが必要な XML-RPC のメソッドが無効になります。ピンバックはログインを必要としないため、引き続き機能します。これだけでは system.multicall は削除されず、ファイルもリクエストに応答し続けます。multicall メソッドも削除するには:

<?php
add_filter( 'xmlrpc_methods', function ( $methods ) {
    unset( $methods['system.multicall'] );
    return $methods;
} );

方法 2: サーバーでファイルをブロックする。 Apache なら .htaccess に:

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

Nginx なら location = /xmlrpc.php { deny all; }。最も厳格な方法でサーバーの負荷もかかりませんが、ピンバック、Jetpack、モバイルアプリもすべて使えなくなります。また WordPress の外にあるため、サーバーを移転するときに忘れがちです。

うまくいかないときは

  • Jetpack に接続エラーが表示される。 Jetpack には XML-RPC が必要です。「完全に無効化」から「ログインを無効化し、ピンバックは維持」に切り替えるか、サーバーのルールを削除してください。
  • WordPress モバイルアプリでログインできない。 原因は同じです。モバイルではブラウザーを使うか、XML-RPC のログインを許可したうえでログイン制限と二要素認証に頼ってください。
  • 投稿ツールが投稿できなくなった。 そのツールが XML-RPC を使っているか確認してください。最近のツールのほとんどは、アプリケーションパスワードを使う REST API に移行しています。

Hushfort なら

バックドアロックは 無料の WordPress セキュリティプラグイン Hushfort Security に追加する有料アドオン Hushfort Pro の機能です。XML-RPC が開いているかどうかを示す攻撃面スキャンは、無料版プラグインに含まれます。

バックドアロックは、Hushfort の「攻撃面の強化」レイヤーの一部です。選択肢は 4 つあります:

  • ログインを無効化し、ピンバックは維持 (推奨): XML-RPC 経由のパスワード推測は不可能になり、ピンバックとトラックバックは引き続き機能します。ストアサイトに適しています。
  • 完全に無効化: 最も厳格な選択肢です。Jetpack と公式モバイルアプリは接続できなくなります。
  • system.multicall のみ無効化: 一括推測を塞ぎ、それ以外はそのままにします。
  • 変更しない: WordPress のデフォルトです。

その後、攻撃面スキャンが実際のリクエストで結果を確認するので、外部から見えるものを確かめられます。負荷保護も xmlrpc.php へのリクエストを通常のページ表示より高く値付けするため、残ったノイズの勢いも弱まります。

よくある質問

WordPress で XML-RPC を無効にしても安全ですか?

ほとんどのサイトでは安全です。現在の WordPress は、ブロックエディターや大半の連携に REST API を使っています。ただし XML-RPC は今も Jetpack、WordPress 公式モバイルアプリ、一部の古い投稿ツールで使われているので、先にそれらを確認してください。

ログインページを隠せば xmlrpc.php も隠れますか?

いいえ。xmlrpc.php は単独でユーザー名とパスワードを受け付けるため、wp-login.php を隠した後も、攻撃者はそこで推測を続けられます。

system.multicall とは何ですか?

1 回のリクエストで多数の呼び出しを実行する XML-RPC のメソッドです。攻撃者はこれを使って 1 回のリクエストで数百回のパスワード推測を送り、リクエスト数を数える制限をすり抜けます。

XML-RPC を無効にするとピンバックは使えなくなりますか?

ファイル全体をブロックすると使えなくなります。XML-RPC のログインだけを閉じ、ピンバックのメソッドを開けたままにすれば、ピンバックとトラックバックは引き続き機能します。

xmlrpc_enabled フィルターで XML-RPC は完全にオフになりますか?

いいえ。無効になるのはログインが必要なメソッドだけです。ファイルは引き続き応答し、ピンバックの呼び出しも実行されます。多くの場合はそれで十分ですが、結果はテストしてください。

不具合の報告・機能のリクエスト

メッセージは Hushfort の開発チームに直接届きます。

内容の種類

返信にのみ使用します。

これらの情報は返信のためだけに使用します。 プライバシー