Spis treści 4 sekcji
WordPress to najpopularniejszy silnik stron internetowych na świecie - napędza znaczną część sieci, także tej polskiej. Postawisz go praktycznie wszędzie, również na AWS: od jednoklikowego blueprintu na Lightsail po własny serwer na EC2 (jak w naszym poradniku migracji WordPressa na AWS). Dlatego luka w samym rdzeniu WordPressa to nie jest problem niszowy - dotyczy ogromnej liczby witryn naraz, a naprawa jest prosta i pilna.
Czym jest wp2shell
wp2shell (oznaczenie CVE-2026-63030, ocena CVSS 7.5) to luka w samym rdzeniu WordPressa - nie we wtyczce, nie w motywie. Badacze z Searchlight Cyber, którzy ją zgłosili, opisują ją jako łańcuch błędów w REST API (konkretnie w endpointcie batch), prowadzący do zdalnego wykonania kodu (RCE). Kluczowe i najgroźniejsze jest jedno słowo: pre-auth. Atakujący nie potrzebuje żadnego konta, hasła ani interakcji użytkownika - wystarczy anonimowe żądanie HTTP do podatnej witryny.
Podatne wersje to 6.9.0-6.9.4 oraz 7.0.0-7.0.1. Wersje starsze niż 6.9 nie są podatne - luka pojawiła się dopiero w kodzie gałęzi 6.9, która trafiła do wydania w grudniu 2025. Łatki to 7.0.2 oraz 6.9.5, obie wydane 17 lipca 2026.
Dlaczego to problem konkretnie na AWS
Tu wraca fundamentalna zasada chmury - model współodpowiedzialności. Na EC2 i Lightsail AWS odpowiada za sprzęt, hypervisor i sieć, ale za system operacyjny, aplikację i jej łatanie odpowiadasz Ty. Amazon nie zaktualizuje za Ciebie WordPressa na Twojej instancji. To samo dotyczy warstwy bezpieczeństwa: AWS WAF czy GuardDuty mogą wykryć lub spowolnić atak, ale nie załatają dziury w kodzie. Jeśli chcesz ugruntować ten temat, mamy osobny artykuł o bezpieczeństwie i modelu współodpowiedzialności AWS.
Jest jeszcze niuans, który stawia self-hostowane WordPressy na AWS w pierwszej linii ognia. Według badaczy podatna ścieżka jest osiągalna, gdy witryna nie używa trwałego object cache (Redis lub Memcached). A to jest domyślny stan zdecydowanej większości pojedynczych instalacji na jednej instancji EC2 czy na Lightsailu - trwały object cache to element, który dokłada się świadomie, zwykle dopiero przy większym ruchu i z osobną warstwą danych lub ElastiCache. Innymi słowy: typowy WordPress "postawiony i zapomniany" na AWS jest dokładnie w tej konfiguracji, którą luka lubi najbardziej.
Wymuszona aktualizacja to nie jest gwarancja - zweryfikuj
Domyślnie WordPress ma włączone automatyczne aktualizacje w tle dla wydań bezpieczeństwa, a przy tej luce WordPress.org dodatkowo wymusza aktualizację dla podatnych instalacji, które mają auto-update włączony. Brzmi jak "problem rozwiązał się sam". W praktyce na serwerach, którymi zarządzasz sam - a EC2 i Lightsail to dokładnie takie serwery - automatyczna aktualizacja potrafi po cichu nie wykonać się. Najczęstsze powody:
- Uprawnienia i właściciel plików - użytkownik serwera WWW nie ma prawa zapisu do plików rdzenia (częste po ręcznej migracji lub na stackach Bitnami z Lightsaila).
- Wyłączone w konfiguracji - stałe
DISALLOW_FILE_MODSlubWP_AUTO_UPDATE_COREustawione wwp-config.phpblokują samodzielną aktualizację. - Metoda zapisu przez FTP - gdy WordPress ma skonfigurowane
FS_METHODna FTP bez poprawnych danych, aktualizacja utyka. - Brak miejsca na dysku - pełny wolumen EBS to cicha śmierć każdej aktualizacji.
- Zablokowany ruch wychodzący - restrykcyjna grupa bezpieczeństwa lub NACL, przez którą instancja nie dosięga
api.wordpress.org.
Wniosek jest prosty i jest esencją podejścia SecOps: nie ufaj założeniom, sprawdź stan faktyczny. Zweryfikuj realnie działającą wersję rdzenia na każdej witrynie, zamiast zakładać, że "przecież się aktualizuje".
Plan działania krok po kroku
- Zinwentaryzuj. Znajdź wszystkie WordPressy pod swoim kontem AWS - instancje EC2, Lightsaile, kontenery. Łatwo zapomnieć o tej jednej starej witrynie klienta, która stoi od trzech lat.
- Sprawdź wersję każdej. Najpewniej przez WP-CLI (
wp core version), alternatywnie w panelu administracyjnym lub w plikureadme.htmlw katalogu WordPressa. - Załataj do 7.0.2 lub 6.9.5. Preferuj WP-CLI albo panel administracyjny. To jest jedyna prawdziwa naprawa.
- Zweryfikuj, że łatka faktycznie weszła. Po aktualizacji ponownie sprawdź numer wersji - nie kończ na kliknięciu "aktualizuj". Możesz też użyć bezinwazyjnego checkera
wp2shell.comudostępnionego przez Searchlight. - Nie możesz od razu załatać? Zablokuj endpoint. Jako tymczasowe obejście zablokuj na warstwie brzegowej dostęp do
/wp-json/batch/v1oraz?rest_route=/batch/v1- regułą w AWS WAF, w konfiguracji Nginx/Apache albo na CloudFront. - Przejrzyj logi. Poszukaj żądań POST do endpointu batch sprzed aktualizacji, sprawdź findingi w GuardDuty, nietypowe procesy i nowe pliki w
wp-content/uploads. - Podejrzewasz kompromitację? Potraktuj instancję jako skażoną. Sama "aktualizacja na wierzchu" nie usuwa backdoora - rotuj sekrety i odtwórz witrynę z czystego, znanego dobrego obrazu.
/wp-json/batch/v1 lub query string z rest_route=/batch/v1. Gotowe managed rules dla WordPressa pomagają, ale własna, precyzyjna reguła na ten konkretny endpoint jest pewniejsza do czasu wgrania łatki. Pamiętaj: to kupuje czas, nie zastępuje aktualizacji.
