Blog technologiczny od 2014 · 1 110 wpisów
RSS

Xmlrpc.php pod ostrzałem — jak sprawdzić i czy wyłączyć w WordPressie

Xmlrpc.php to częsty cel ataków brute-force na WordPressa. Sprawdzam, jak wykryć atak we własnych logach i czy bezpiecznie można go wyłączyć.

W poprzednim artykule sprawdzałem logi 404 z highlab.pl i trafiłem na kilka wątków naraz: skanowanie /admin, ciche istnienie /wp-login.php i jeden, bardzo konkretny epizod na /xmlrpc.php — 60 żądań z jednego adresu w niecałe 11 minut, podszywających się pod Jetpacka. Tam był to jeden z kilku dowodów na ogólniejszą tezę. Tutaj jest jedynym tematem, potraktowanym praktycznie: nie „co się dzieje”, tylko „co ja, jako właściciel tej strony, mam z tym zrobić”.

Jeśli nie czytałeś poprzedniego artykułu, krótkie tło znajdziesz niżej — ale sedno tego wpisu jest inne: czy powinieneś wyłączyć xmlrpc.php na swojej stronie, i jak to sprawdzić, zamiast zgadywać.

Z tego artykułu dowiesz się:
  • xmlrpc.php to prawdziwy, potrzebny plik WordPressa — problem nie w tym, że istnieje, tylko w jednej jego metodzie (system.multicall), która pozwala sprawdzić setki haseł w jednym żądaniu.
  • Atak na ten plik nie pojawi się w logu błędów 404 — trzeba zajrzeć do surowych logów serwera, dokładnie tak jak w moim przypadku.
  • Zanim cokolwiek wyłączysz, sprawdź czy używasz Jetpacka, aplikacji mobilnej WordPress albo pingbacków — część z nich może przestać działać.
  • Są trzy poziomy wyłączenia: pełny, na poziomie serwera i selektywny (blokujący tylko najbardziej ryzykowną metodę) — dobieramy go do tego, z czego faktycznie korzystasz.

Czym właściwie jest xmlrpc.php

xmlrpc.php to interfejs, przez który różne narzędzia mogą sterować Twoim WordPressem bez logowania się do panelu przez przeglądarkę. Korzystają z niego m.in.:

  • aplikacja mobilna WordPress (publikowanie wpisów z telefonu),
  • Jetpack — część jego funkcji (nie wszystkie; nowsze wersje coraz częściej przechodzą na REST API),
  • pingbacki i trackbacki — mechanizm, w którym blogi informują się nawzajem o linkowaniu do siebie,
  • starsze narzędzia do blogowania (np. Windows Live Writer) — dziś rzadkość, ale wciąż się zdarzają.

Ten plik jest włączony domyślnie w każdej instalacji WordPressa, niezależnie od tego, czy świadomie z niego korzystasz. To ważne, bo oznacza, że masz go „za darmo” razem z ryzykiem, nawet jeśli nigdy o nim nie słyszałeś.

Dlaczego akurat ten plik jest tak łakomym celem

W skrócie (pełne wyjaśnienie z przykładem z moich własnych logów jest w poprzednim artykule): xmlrpc.php obsługuje metodę system.multicall, która pozwala spakować wiele poleceń w jedno żądanie HTTP. Atakujący wykorzystują to do sprawdzenia setek par login/hasło w pojedynczym requeście — z punktu widzenia prostego monitoringu wygląda to jak jedno, niewinne zapytanie, a nie setki prób logowania. Ten sam plik bywa też wykorzystywany do pingback spamu i ataków DDoS reflection.

Jak sprawdzić, czy Twój xmlrpc.php jest celem ataków

Pierwsza pułapka: to się nie pojawi w typowym raporcie błędów 404. xmlrpc.php istnieje naprawdę, więc serwer nie mówi „nie znaleziono” — odpowiada normalnie (zwykle kodem 200), niezależnie od tego, czy podane hasło było poprawne. Żeby to zobaczyć, trzeba zajrzeć do surowych logów serwera (access.log), nie do wtyczki logującej 404.

terminal
grep "POST /xmlrpc.php" access.log

Na co zwracać uwagę w wyniku:

  • dużo żądań z jednego adresu IP w krótkim czasie,
  • User-Agent podszywający się pod Jetpacka/WordPress.com, ale z losową, nieistniejącą domeną w środku (np. http://site27117189.com),
  • regularne, „maszynowe” odstępy między żądaniami — nie przypadkowe kliknięcia człowieka.

Tak wyglądał realny przykład z moich własnych logów, opisany szerzej w poprzednim artykule:

Żądań
60
Czas trwania
~11 min
Warianty User-Agent
32
Adresów IP
1
access.log — 122.170.192.39
09:04:56  POST /xmlrpc.php  200  UA: Jetpack by WordPress.com (Jetpack 13.0; WordPress 6.3)
09:05:06  POST /xmlrpc.php  200  UA: WordPress.com; https://wordpress.com
09:05:17  POST /xmlrpc.php  200  UA: Jetpack/13.0; WordPress/6.3; http://site27117189.com
09:05:27  POST /xmlrpc.php  200  UA: WordPress.com; https://wordpress.com
09:05:37  POST /xmlrpc.php  200  UA: Jetpack/12.0; WordPress/6.4; http://site59128473.com
…w sumie 60 żądań, 32 różne warianty UA, odstępy ~10 sekund…

Prawdziwy Jetpack nie zmienia swojej tożsamości co dziesięć sekund i nie podpisuje się losową domeną.

Zanim wyłączysz: sprawdź, czy możesz sobie na to pozwolić

Wyłączenie xmlrpc.php „na wszelki wypadek” może zepsuć coś, z czego faktycznie korzystasz. Zanim ruszysz dalej, ustal:

  • Czy używasz Jetpacka? Sprawdź, z których jego funkcji korzystasz — część (starsze wersje synchronizacji, niektóre widżety) nadal opiera się o XML-RPC, część już przeszła na REST API.
  • Czy publikujesz z aplikacji mobilnej WordPress? Ona też korzysta z tego interfejsu.
  • Czy zależy Ci na pingbackach/trackbackach? Jeśli nie wiesz, co to jest, prawdopodobnie ich nie potrzebujesz.
  • Czy używasz starszego narzędzia do blogowania (Windows Live Writer i podobne)? Dziś rzadkość, ale warto wykluczyć.

Praktyczny sposób sprawdzenia: przejrzyj te same logi co wyżej i zobacz, czy oprócz podejrzanych wpisów są tam też żądania z Twoich własnych, znanych adresów IP albo z prawdziwego Jetpacka (bez losowej domeny w User-Agencie).

Jeśli używasz Jetpacka

Pełne wyłączenie xmlrpc.php może zepsuć część jego funkcji. W takim wypadku lepszym wyborem jest wariant selektywny niżej — blokujący tylko najbardziej ryzykowną metodę (system.multicall), a nie cały interfejs.

Jak wyłączyć (albo ograniczyć) xmlrpc.php

Trzy poziomy, od najprostszego do najbardziej precyzyjnego — wybierz jeden, nie wszystkie naraz.

1. Najprostszy: filtr w functions.php

Wyłącza XML-RPC funkcjonalnie — plik nadal odpowiada, ale nic nie robi. Dobry wybór, jeśli z niczego wymienionego wyżej nie korzystasz.

functions.php
add_filter( 'xmlrpc_enabled', '__return_false' );

2. Twardszy: blokada na poziomie serwera

Serwer odrzuca żądanie, zanim w ogóle dotrze do WordPressa — mniejsze obciążenie przy większym ruchu ataku niż wariant z functions.php.

.htaccess
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

3. Selektywny: zablokuj tylko system.multicall

Najbezpieczniejszy kompromis, jeśli korzystasz z Jetpacka albo innej integracji opartej o XML-RPC — reszta interfejsu działa normalnie, znika tylko metoda odpowiedzialna za masowe zgadywanie haseł.

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

Wtyczki robiące to samo też istnieją — jeśli wolisz takie rozwiązanie, sprawdź datę ostatniej aktualizacji przed instalacją (nieaktualizowana wtyczka bezpieczeństwa to gorszy wybór niż jej brak).

Jak sprawdzić, czy wyłączenie zadziałało

Prosty test z terminala — kod odpowiedzi powinien się zmienić z 200 na 403 (blokada serwera) albo na komunikat o wyłączonym XML-RPC (filtr w functions.php):

terminal
curl -I -X POST https://twoja-domena.pl/xmlrpc.php

Potem obserwuj logi przez tydzień — sprawdź, czy ruch do tego adresu faktycznie zniknął, czy tylko przeniósł się gdzie indziej (najczęściej na /wp-login.php).

Ważne zastrzeżenie

Wyłączenie xmlrpc.php zamyka jeden konkretny wektor ataku — to nie jest zabezpieczenie panelu jako takiego. Silne hasło, 2FA, rate limiting i bieżące aktualizacje nadal obowiązują niezależnie od tej zmiany (więcej w poprzednim artykule).

FAQ

01Czy wyłączenie xmlrpc.php zepsuje mi Jetpacka?+
Może, jeśli korzystasz ze starszych funkcji opartych o XML-RPC. Sprawdź najpierw, z czego dokładnie korzystasz, albo użyj wariantu selektywnego, który blokuje tylko najbardziej ryzykowną metodę, zostawiając resztę interfejsu działającą.
02Czy WordPress w ogóle wymaga xmlrpc.php do działania?+
Nie. Podstawowe funkcje WordPressa (edytor, panel, publikowanie przez przeglądarkę) działają bez niego. Jest potrzebny tylko do konkretnych integracji zewnętrznych.
03Skąd wiem, że akurat mnie to dotyczy?+
Sprawdź surowe logi serwera pod kątem żądań POST do /xmlrpc.php — jeśli widzisz dużo requestów z jednego adresu w krótkim czasie, prawdopodobnie ktoś próbuje brute-force’ować Twoje hasło przez ten plik.
04Czy wtyczka firewall/bezpieczeństwo załatwia to za mnie automatycznie?+
Część wtyczek tego typu domyślnie ogranicza xmlrpc.php albo daje taką opcję w ustawieniach — warto to sprawdzić, zanim dodasz własny filtr, żeby nie zablokować tego samego dwa razy w sprzeczny sposób.
05Co jeśli używam starej aplikacji do blogowania, np. Windows Live Writer?+
Wtedy pełne wyłączenie xmlrpc.php przestanie działać z tym narzędziem. W praktyce to dziś rzadkość — jeśli nie jesteś pewien, sprawdź w logach, czy w ogóle jest stamtąd jakiś ruch.

Podsumowanie

xmlrpc.php to nie „zawsze wyłącz od razu”, tylko „sprawdź, z czego korzystasz, i podejmij świadomą decyzję”. Jeśli nic z wymienionego wyżej Cię nie dotyczy — pełne wyłączenie jest najprostsze i najbezpieczniejsze. Jeśli używasz Jetpacka albo podobnej integracji — wariant selektywny daje Ci ochronę bez ryzyka, że coś przestanie działać.

Pełniejszy kontekst tego, dlaczego w ogóle zacząłem to sprawdzać (i co jeszcze znalazłem w logach 404) — w poprzednim artykule.

Opublikowano · Znalazłeś błąd? Napisz
Piotr Cichosz
Autor

Od ponad 10 lat jestem zaangażowany w świat elektroniki użytkowej, zdobywając szeroką wiedzę i doświadczenie w testowaniu oraz recenzowaniu najnowszych technologii. Moja kariera obejmuje pracę w wiodących firmach technologicznych, gdzie specjalizowałem się…

Czytaj dalej
← Poprzedni Ceny sprzętów od Apple rosną, a Siri wciąż nie mówi po polsku. Za co tak naprawdę płacimy w nowym iPhonie?