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の自動更新を正しく設定してサイトを常に最新状態に保つ方法

お気軽にご相談ください

お見積りへ お問い合わせへ