2026年5月19日
2026年5月19日
WordPressのXMLRPC脆弱性を無効化してセキュリティを強化する方法
はじめに
WordPressの xmlrpc.php は外部アプリケーションとの連携に使われる古いAPIですが、ブルートフォース攻撃の増幅に悪用されることで知られています。1リクエストで数百回のログイン試行を処理できる「system.multicall」メソッドは、攻撃者にとって非常に効率的な手段です。本記事では XMLRPC を安全に無効化する複数の方法と、Jetpack など正当なサービスとの共存方法を解説します。
症状・原因
- サーバーログに
xmlrpc.phpへの大量のPOSTリクエストが記録されている - サーバーの CPU・帯域幅が異常に高い(DDoS・ブルートフォース攻撃の可能性)
system.multicallを使った1リクエスト数百ログイン試行が行われている- セキュリティプラグインが
xmlrpc.phpへの攻撃を検知して警告している - Jetpack などの正規プラグインが XMLRPC を必要としているため単純に無効化できない
解決手順
ステップ1:xmlrpc.php の役割とリスクを理解する
# xmlrpc.php が有効かどうかを確認する
curl -s -o /dev/null -w "%{http_code}" \
https://example.com/xmlrpc.php
# 200 → 有効(脆弱な状態)
# 403/404 → 無効化済み
# ブルートフォース攻撃の実態を確認する(アクセスログ)
grep "xmlrpc.php" /var/log/nginx/access.log | \
grep "POST" | wc -l
# 大量の POST リクエストがあれば攻撃を受けている
# system.multicall の悪用例(攻撃者が送るリクエスト)
# 1回のリクエストで 500 件のログイン試行が可能
curl -s -X POST https://example.com/xmlrpc.php \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0"?>
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>'
# 利用可能なメソッド一覧が返ってくれば xmlrpc は有効
ステップ2:WordPress フィルターで XMLRPC を無効化する
<?php
// functions.php または mu-plugins/ のプラグインに追記する
// xmlrpc_enabled フィルターで XMLRPC を完全に無効化する
add_filter( 'xmlrpc_enabled', '__return_false' );
// 特定のメソッドのみ無効化する(より細かい制御)
add_filter( 'xmlrpc_methods', 'disable_xmlrpc_methods' );
function disable_xmlrpc_methods( $methods ) {
// ブルートフォース攻撃に悪用される危険なメソッドを削除
unset( $methods['system.multicall'] );
unset( $methods['system.listMethods'] );
unset( $methods['system.getCapabilities'] );
// pingback を無効化(DDoS に悪用される)
unset( $methods['pingback.ping'] );
unset( $methods['pingback.extensions.getPingbacks'] );
return $methods;
}
// pingback のみを無効化して XMLRPC は維持する場合
add_filter( 'xmlrpc_methods', 'disable_xmlrpc_pingback' );
function disable_xmlrpc_pingback( $methods ) {
unset( $methods['pingback.ping'] );
return $methods;
}
ステップ3:.htaccess で XMLRPC を Apache レベルでブロックする
# .htaccess に追記する(WordPress セクションの外に記述)
# xmlrpc.php へのアクセスを完全にブロックする
<Files xmlrpc.php>
Order allow,deny
Deny from all
</Files>
# Apache 2.4 以降の書き方
<Files xmlrpc.php>
Require all denied
</Files>
# 特定の IP アドレスのみ許可する(Jetpack サーバーIPを許可する場合)
<Files xmlrpc.php>
Order deny,allow
Deny from all
# Jetpack の IP レンジを許可(要確認・変更される場合あり)
Allow from 76.74.255.0/25
Allow from 209.132.135.0/27
</Files>
# User-Agent でのブロック(補助的な対策)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/xmlrpc\.php [NC]
RewriteCond %{HTTP_USER_AGENT} !^Jetpack [NC]
RewriteRule ^ - [F,L]
</IfModule>
ステップ4:Nginx で XMLRPC を効率的にブロックする
# Nginx の server ブロックに追記する
# xmlrpc.php への全アクセスをブロックする
location = /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
return 444; # 接続を切断(レスポンスを返さない)
}
# Jetpack などのサービスを許可する場合
location = /xmlrpc.php {
# Jetpack の IP レンジのみ許可
allow 76.74.255.0/25;
allow 209.132.135.0/27;
deny all;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# xmlrpc.php への大量リクエストをレートリミットする(Nginx Plus / ngx_http_limit_req_module)
limit_req_zone $binary_remote_addr zone=xmlrpc:10m rate=1r/m;
location = /xmlrpc.php {
limit_req zone=xmlrpc burst=5 nodelay;
# 1分に1回までに制限(ブルートフォース緩和)
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
}
ステップ5:Jetpack との共存と allowed_methods フィルターによる代替アプローチ
<?php
// Jetpack は WordPress.com と XMLRPC で通信するため、
// 完全無効化すると Jetpack の機能が失われる
// 解決策1:Jetpack の REST API モードを使用する(推奨)
// Jetpack 設定 → ダッシュボード → 「XMLRPCを使用しない」を選択
// 解決策2:危険なメソッドのみ無効化してメソッドを許可リスト化する
add_filter( 'xmlrpc_methods', 'jetpack_safe_xmlrpc_methods' );
function jetpack_safe_xmlrpc_methods( $methods ) {
// Jetpack が必要とするメソッドの許可リスト
$allowed_methods = [
'jetpack.verifyRegistration',
'jetpack.getPost',
'jetpack.getPosts',
'wp.getUsersBlogs',
'wp.getPost',
'wp.editPost',
'wp.newPost',
'wp.uploadFile',
];
// 許可リスト以外を全て削除
foreach ( array_keys( $methods ) as $method ) {
if ( ! in_array( $method, $allowed_methods, true ) ) {
unset( $methods[ $method ] );
}
}
return $methods;
}
// 解決策3:Jetpack を使っていない場合の完全無効化(推奨)
// 以下の両方を実施する(多層防御)
add_filter( 'xmlrpc_enabled', '__return_false' );
// さらに .htaccess または Nginx でネットワークレベルでもブロック
// XMLRPC への不正アクセスをログに記録する
add_action( 'xmlrpc_call', 'log_xmlrpc_access' );
function log_xmlrpc_access( $method ) {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
error_log(
sprintf(
'[XMLRPC] method=%s ip=%s ua=%s',
$method,
$ip,
$_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
)
);
}
注意事項
- Jetpack の確認: Jetpack を使用している場合は、完全無効化の前に Jetpack の REST API モードが利用できるか確認してください。
- モバイルアプリ: 公式 WordPress モバイルアプリは XMLRPC を使用する場合があります(旧バージョン)。最新版では REST API を使用しています。
- 多層防御: PHP レベルのフィルターだけでなく、サーバーレベル(.htaccess/Nginx)でもブロックすることで、PHP が起動するコストも節約できます。
まとめ
XMLRPC の無効化は WordPress セキュリティの基本です。PHP フィルターとサーバー設定の両方でブロックする多層防御が最も効果的です。Jetpack を使用している場合は REST API モードへの移行を検討してください。関連記事:WordPressの自動更新を正しく設定してサイトを常に最新状態に保つ方法