RCE w WordPressie i nie tylko: przegląd świeżych podatności
Ostatnie tygodnie przyniosły serię podatności typu RCE, czyli zdalnego wykonania kodu, i to w oprogramowaniu, które napędza sporą część internetu. Zdarzył się przypadek rzadki: dziura pozwalająca uruchomić kod bez logowania trafiła do samego rdzenia WordPressa. Obok niej pojawiła się zwyczajowa fala krytycznych błędów we wtyczkach i motywach, a poza ekosystemem WordPressa oberwały narzędzia, na których stoją zespoły deweloperskie: serwer CI/CD TeamCity, samodzielnie hostowana Gitea i framework Next.js. Kilka z tych podatności jest już w katalogu CISA KEV, z publicznymi dowodami koncepcji. Ten wpis to triaż, nie sensacja: czym naprawdę jest każdy błąd, czy jest wykorzystywany w praktyce i co łatać najpierw.
Kontekst i legalność. To materiał edukacyjny opisujący publicznie ujawnione i załatane już podatności. Każdy opisany błąd ma poprawkę, a my podajemy wersje, w których go naprawiono. Konsekwentnie oddzielamy potwierdzoną eksploatację od samej teorii i nie udostępniamy gotowych exploitów. Testowanie cudzych systemów jest legalne wyłącznie za pisemną zgodą właściciela.
WordPress: tym razem dostał sam rdzeń (wp2shell)
Najciekawszy technicznie i najgroźniejszy jest błąd, który 17 lipca 2026 ujawnił zespół Assetnote z Searchlight Cyber. Nazwali go „wp2shell” i nie jest to przesada marketingowa. Nieuwierzytelniony napastnik może wykonać kod na domyślnej instalacji WordPressa, bez konta i bez interakcji użytkownika. RCE w rdzeniu, a nie we wtyczce, zdarza się bardzo rzadko, bo rdzeń jest audytowany od lat i to właśnie czyni ten przypadek wyjątkowym.
Podatność to w istocie łańcuch dwóch błędów. Pierwszy, CVE-2026-63030, to pomyłka w logice zbiorczego przetwarzania żądań w REST API pod adresem /wp-json/batch/v1. Gdy funkcja wp_parse_url zawiedzie na ścieżce podżądania, błąd trafia do tablicy walidacji, ale nie do tablicy dopasowań. Te dwie tablice się rozjeżdżają i kolejne żądania są kierowane do niewłaściwego handlera. Drugi błąd, CVE-2026-60137, to wstrzyknięcie SQL w parametrze author__not_in mechanizmu WP_Query. Złożenie ich obu pozwala przejść od anonimowego żądania do wykonania kodu na serwerze.
Warto zauważyć jeden szczegół. Końcówka batch, którą wykorzystuje pierwszy błąd, jest domyślnie włączona od WordPressa 5.6 z 2020 roku, więc problem dotyczył domyślnej instalacji, bez żadnych dodatkowych wtyczek. Podatne są wersje od 6.9.0 do 6.9.4 oraz od 7.0.0 do 7.0.1. Poprawki wyszły w 6.9.5 i 7.0.2. Sam wynik CVSS zatrzymał się na 7.5, ale praktyczna ocena ryzyka była na tyle wysoka, że projekt wypchnął wymuszoną aktualizację automatyczną. W obiegu są już publiczne dowody koncepcji, a wykorzystanie w sieci zostało potwierdzone. Jeżeli prowadzisz WordPressa z wyłączonymi automatycznymi aktualizacjami, to jest pozycja numer jeden do sprawdzenia jeszcze dziś.
Wtyczki i motywy: stała powierzchnia ataku
Rdzeń to wyjątek. Prawdziwą, stałą powierzchnią ataku w WordPressie były i są wtyczki oraz motywy, bo to tam ląduje kod pisany w bardzo różnej jakości. Lato 2026 nie było pod tym względem inne.
Forminator, popularna wtyczka do formularzy z ponad 600 tysiącami aktywnych instalacji, dostała CVE-2026-15748 z oceną 9.8. To klasyczny scenariusz: nieuwierzytelniony atakujący wgrywa dowolny plik, w tym plik PHP, i dostaje wykonanie kodu. Sedno tkwi w funkcji handle_file_upload, gdzie czarna lista niebezpiecznych rozszerzeń sprawdzała klucze dokładnym dopasowaniem, które dawało się obejść kluczami typu MIME z alternatywą zapisaną znakiem pionowej kreski. Jest jeden warunek działania: formularz musi mieć zarówno pole wgrywania pliku, jak i pole wyboru. Poprawka to wersja 1.56.2 z 31 lipca 2026.
Jeszcze wyżej na skali jest GiveWP, wtyczka do zbiórek, z CVE-2026-82222 i maksymalną oceną 10.0. Tu wektorem jest wstrzyknięcie obiektu PHP, które prowadzi do wykonywania poleceń na serwerze, również bez uwierzytelnienia. Motyw Avada wraz z wtyczką Fusion Builder dostał z kolei CVE-2026-18431 (9.8): zapis dowolnego pliku, który także kończy się zdalnym wykonaniem kodu, w wersjach do 7.16 włącznie.
Do kompletu doszła seria błędów, które nie dają wprost RCE, ale prowadzą do przejęcia konta administratora, a stamtąd i tak do pełnej kontroli: obejście uwierzytelnienia w panelu WPMU DEV (CVE-2026-76581), ujawnienie danych w TranslatePress (CVE-2026-19632, około 400 tysięcy witryn) i eskalacja uprawnień w Pods (CVE-2026-19598, około 100 tysięcy witryn). Wszystkie z oceną 9.8. Wspólny mianownik jest ten sam od lat: administrator WordPressa to w praktyce wykonanie kodu, bo z panelu można wgrać wtyczkę.
Poza WordPressem: CI/CD, Git i framework
WordPress skupia uwagę, bo jest wszędzie, ale z perspektywy atakującego najciekawsze bywają narzędzia wewnętrzne, które zespoły wystawiają do sieci „na chwilę”. Trzy przykłady z tego samego okna czasowego.
TeamCity, serwer ciągłej integracji od JetBrains, dostał CVE-2026-63077 z oceną 9.8. To nieuwierzytelnione RCE przez protokół komunikacji z agentami. Źródłem jest deserializacja niezaufanych danych: zbyt liberalna lista dozwolonych klas w XStream, która dokładała klasy protokołu TeamCity, nie odbierając przy tym domyślnych uprawnień samego XStreama. Przejęcie serwera CI/CD jest szczególnie brzydkie, bo to miejsce, przez które przechodzą wszystkie budowane artefakty i sekrety. JetBrains załatał to w wersjach 2025.11.7 oraz 2026.1.3 dla instalacji lokalnych. CISA dopisała podatność do katalogu KEV 5 sierpnia, a Rapid7 opublikował działający dowód koncepcji dwa dni później. To jest błąd aktywnie wykorzystywany, choć szczegóły kampanii pozostają nieznane.
Gitea, lekki, samodzielnie hostowany serwer Git, ma CVE-2026-60004, również 9.8. Formalnie wymaga uwierzytelnienia i prawa zapisu do repozytorium, ale Gitea domyślnie pozwala na samodzielną rejestrację, więc napastnik po prostu zakłada konto. Sam trik jest elegancki: końcówka diffpatch pozwala podłożyć wykonywalny hak Gita pochodzący z treści kontrolowanej przez repozytorium, a potem uruchomić polecenia powłoki na koncie usługi Gitei. To nie jest błąd pamięci ani egzotyczny parser, tylko nadużycie w pełni legalnej funkcji. Poprawka jest w 1.27.1. Ta podatność też nie jest teoretyczna: zgłoszono zaatakowaną instancję, na którą wgrano coś w rodzaju kryptokoparki, a CISA dodała ją do KEV 25 sierpnia.
Na koniec warstwa frameworka. Next.js załatał dwie poważne dziury naraz. CVE-2026-75604 (9.0) to przejście po ścieżce, które daje nieuwierzytelnione RCE, ale tylko w aplikacjach uruchomionych na systemie plików Windows. Linux i macOS są nietknięte. Druga to przepełnienie sterty w bibliotece libheif przy parsowaniu obrazów AVIF: spreparowany plik prowadzi do zapisu poza zakresem. Tu jest ważny szczegół, który zmienia realne ryzyko. Optymalizacja AVIF w Next.js jest domyślnie wyłączona i trzeba ją świadomie włączyć w konfiguracji, a publiczny dowód koncepcji na razie nie potwierdza pełnego RCE. Obie dziury naprawiono w 15.5.24 i 16.3.3.
Pięć wzorców, które się powtarzają
Jeśli poukładać te osiem błędów obok siebie, widać, że RCE rzadko jest jednym magicznym trikiem. To garść powtarzalnych prymitywów.
Pierwszy to wgranie pliku bez uwierzytelnienia, które kończy się webshellem. Tak działa Forminator i, w wariancie zapisu pliku, Avada. Drugi to niebezpieczna deserializacja albo wstrzyknięcie obiektu: TeamCity przez XStream, GiveWP przez obiekty PHP. Trzeci to błąd logiki połączony z klasyczną raną webu, czyli SQL injection, jak w łańcuchu wp2shell. Czwarty to nadużycie funkcji, która działa dokładnie tak, jak ją zaprojektowano, tyle że na danych atakującego, jak haki Gita w Gitei. Piąty to bezpieczeństwo pamięci w parserach, jak libheif w Next.js.
Płynie z tego prosta obserwacja operacyjna. Powierzchnia ataku to nie tylko „aplikacja”, ale każdy punkt, w którym niezaufane dane spotykają się z parserem, deserializatorem albo zapisem na dysk. Do tego dochodzi tempo. Od ujawnienia wp2shell, TeamCity i Gitei do wpisu w KEV z publicznym PoC minęły dni, nie miesiące. Okno na spokojne łatanie zamyka się szybciej niż kiedyś.
Jak się bronić
Reakcja na tę falę nie wymaga heroizmu, tylko właściwej kolejności.
- Inwentaryzacja i tempo łatania. Nie da się załatać czegoś, o czym się nie wie. Miej listę wersji WordPressa, wtyczek, serwerów CI i frameworków, śledź katalog CISA KEV i tam, gdzie się da, włącz wymuszone aktualizacje automatyczne. Przy wp2shell to była różnica między spokojem a pożarem.
- Zmniejsz powierzchnię wystawioną do internetu. TeamCity, Gitea i inne panele zarządzania nie muszą wisieć w otwartej sieci. Schowaj je za VPN lub listą dozwolonych adresów i wymuś MFA na kontach administracyjnych.
- Utwardź wgrywanie plików. Waliduj po zawartości, nie po rozszerzeniu, trzymaj wgrane pliki poza katalogiem serwowanym przez serwer WWW i nigdy nie pozwalaj ich wykonać. To zabija całą klasę błędów w rodzaju Forminatora.
- Wyeliminuj niebezpieczną deserializację. Trzymaj ścisłe listy dozwolonych klas i unikaj natywnej deserializacji danych, do których może dosięgnąć atakujący. To lekcja z TeamCity i GiveWP.
- Wirtualne łatki i monitoring. Gdy nie możesz załatać od razu, reguła WAF potrafi zamknąć okno na czas. Loguj i alarmuj na nietypowy ruch wychodzący, zakładaj przejęcie i ograniczaj uprawnienia, żeby pojedynczy przejęty host nie oznaczał końca gry.
Co z tego wynika
Ta fala nie jest wyjątkowa co do rodzaju błędów, bo wgrywanie plików, deserializacja i SQL injection są z nami od dawna. Wyjątkowe jest tempo i to, jak nisko trzeba się schylić po dostęp, gdy na końcu łańcucha stoi CI/CD albo rdzeń CMS milionów witryn. To jest wprost tematyka NIS2 i KSC: zarządzanie podatnościami, aktualizacje, kontrola dostępu i zdolność wykrycia incydentu, zanim zrobi to za ciebie kryptokoparka na twojej Gitei. O tym samym pisaliśmy przy anatomii Log4Shella, przy łańcuchu Langflow i przy incydencie MyDr. Zmienia się nazwa produktu, nie wzorzec.
Wymogi opisaliśmy na stronie NIS2 / KSC. Jeśli prowadzisz albo hostujesz systemy wystawione do sieci i chcesz sprawdzić, gdzie realnie jesteś podatny, od wgrywania plików, przez deserializację, po zasięg po przejęciu pojedynczego hosta, to dokładnie nasza specjalizacja: testy penetracyjne i weryfikacja powierzchni ataku. Umów konsultację, zanim najnowszy PoC zrobi rundę po sieci.
Źródła: Rapid7 (wp2shell) · Strobes / Assetnote · The Hacker News (Forminator) · The Hacker News (pięć wtyczek) · The Hacker News (Gitea) · JetBrains (TeamCity) · The Hacker News (TeamCity, KEV) · The Hacker News (Next.js)