21 października w świecie cyberbezpieczeństwa zrobiło się niezwykle nerwowo. Ujawniono dwie krytyczne podatności w PHP, technologii, na której opiera się ogromna część współczesnego Internetu. Nie mówimy tutaj o błędzie w pojedynczej aplikacji czy popularnej wtyczce. Problem dotyczy samego silnika PHP, wykorzystywanego przez miliony stron i serwisów internetowych.

Chodzi o CVE-2026-109618 oraz CVE-2026-109619, obie ocenione na 9,2 w skali CVSS 4.0. Nadano im wspólną nazwę PHP2Shell. Wykorzystanie luk może pozwolić atakującemu na zdalne wykonanie kodu (RCE) bez wcześniejszego uwierzytelnienia, a także uzyskanie dostępu do poufnych danych przechowywanych w pamięci serwera.

Skala potencjalnego zagrożenia robi wrażenie. PHP wykorzystywane jest między innymi przez popularne systemy takie jak WordPress, Drupal czy Joomla, a także MediaWiki, na którym działa Wikipedia. Badacze Wiz potwierdzili już możliwość wykorzystania podatności w testowych instalacjach trzech pierwszych platform. Nie oznacza to oczywiście, że każda strona korzystająca z PHP jest podatna, ale pokazuje, jak wielu środowisk może dotyczyć ten problem.

Przyjrzyjmy się więc bliżej, czym właściwie jest PHP2Shell, jak działają obie podatności i jakie konsekwencje może mieć ich wykorzystanie.

Źródło problemu w PHP

PHP to język programowania działający po stronie serwera, wykorzystywany przede wszystkim do tworzenia dynamicznych stron i aplikacji internetowych. Kiedy użytkownik odwiedza taką stronę, serwer wykonuje odpowiedni kod PHP, przetwarza potrzebne dane i przygotowuje odpowiedź, która następnie trafia do przeglądarki.

O skali wykorzystania tej technologii najlepiej świadczą liczby. Według Wiz Research PHP używane jest przez około 70% wszystkich stron internetowych. Tak szerokie zastosowanie sprawia, że wykrycie krytycznych podatności może mieć konsekwencje dla ogromnej liczby niezależnych od siebie serwisów.

W przypadku PHP2Shell problem dotyczy konkretnie interpretera, czyli komponentu odpowiedzialnego za wykonywanie kodu na serwerze. Błędy występują w sposobie zarządzania pamięcią podczas przetwarzania żądań i w określonych sytuacjach mogą prowadzić do nieprawidłowego wykorzystania przechowywanych w niej danych. To właśnie te niepozorne na pierwszy rzut oka błędy otwierają drogę do znacznie poważniejszych konsekwencji.

Jak z błędu pamięci powstaje RCE?

Pierwsza z podatności, CVE-2026-109618, związana jest z obsługą sytuacji, w której interpreterowi zaczyna brakować dostępnej pamięci (out-of-memory, OOM). PHP powinno wtedy przerwać wykonywaną operację i zwolnić zajmowane zasoby. Problem pojawia się, gdy operacja zostaje przerwana w momencie, gdy część danych nie została jeszcze prawidłowo przygotowana. Podczas ich późniejszego przetwarzania interpreter może potraktować nieprawidłowe dane jako poprawne, doprowadzając do uszkodzenia zawartości pamięci.

Druga podatność, CVE-2026-109619, dotyczy sytuacji, w której PHP zachowuje odwołanie do pamięci zwolnionej po zakończeniu wcześniejszego żądania. Gdy serwer otrzymuje kolejne żądanie, może ponownie skorzystać z danych znajdujących się pod nieaktualnym adresem. Tego rodzaju błąd określa się jako use-after-free, czyli wykorzystanie pamięci, która została już zwolniona i mogła zostać przeznaczona do innych celów.

W obu przypadkach atakujący może wykorzystać błędy do manipulowania zawartością pamięci procesu PHP, a w konsekwencji doprowadzić do wykonania własnego kodu na serwerze. Nie jest to jednak prosty atak, polegający na przesłaniu pojedynczego polecenia. Skuteczne wykorzystanie podatności wymaga odpowiedniego przygotowania danych i uwzględnienia sposobu działania pamięci w danym środowisku.

Jak wygląda wykorzystanie PHP2Shell?

Punktem wyjścia do ataku może być odpowiednio przygotowane żądanie HTTP POST, podobne do tych, jakie przeglądarka wysyła podczas korzystania z formularzy internetowych. Różnica polega na jego zawartości. Atakujący umieszcza w nim spreparowane dane, których przetwarzanie może doprowadzić do wystąpienia błędów w pamięci interpretera PHP.

Schemat wykorzystania PHP2Shell do zdalnego wykonania kodu w aplikacjach internetowych. Źródło: Wiz Research.

W przypadku CVE-2026-109618 atakujący może odpowiednio manipulować przesyłanymi danymi, doprowadzając do wyczerpania dostępnej pamięci w trakcie ich przetwarzania. PHP przerywa wtedy wykonywaną operację, ale podczas zwalniania zasobów może błędnie zinterpretować pozostawione w pamięci dane. Badacze Datadog Security Labs potwierdzili, że w ten sposób możliwe jest wykonanie poleceń na serwerze.

Nieco inaczej wygląda wykorzystanie CVE-2026-109619. Tutaj atak może obejmować więcej niż jedno żądanie. Pierwsze doprowadza do pozostawienia nieaktualnych odwołań do pamięci, a kolejne może spowodować ich ponowne użycie przez interpreter. W odpowiednich warunkach pozwala to atakującemu manipulować pamięcią procesu i ostatecznie doprowadzić do wykonania własnego kodu.

Co szczególnie istotne, w określonych konfiguracjach atak może nastąpić jeszcze przed uruchomieniem właściwego kodu aplikacji. Oznacza to, że nawet prawidłowo skonfigurowane mechanizmy logowania czy kontroli dostępu mogą nie mieć okazji zareagować. Nie wszystkie środowiska są jednak narażone w równym stopniu. Według zespołu PHP najwyższe ryzyko dotyczy serwerów Apache korzystających z modułu mod_php.

Zdalne wykonanie kodu to jednak niejedyny możliwy skutek. Badacze Wiz Research wykazali, że niektóre warianty PHP2Shell pozwalają również odczytywać fragmenty pamięci serwera, nawet bez uzyskania możliwości wykonywania poleceń. Mogą znajdować się tam poufne informacje przetwarzane przez aplikację, takie jak hasła, tokeny uwierzytelniające czy klucze API. Ich przejęcie może z kolei otworzyć drogę do innych systemów i usług.

Schemat odczytu poufnych danych z pamięci serwera przy wykorzystaniu PHP2Shell. Źródło: Wiz Research.

W odkryciu błędów pomogło AI

Ciekawym wątkiem tej historii jest rola sztucznej inteligencji. Jak opisuje Wiz Research, błędy pozostawały niezauważone przez ponad dekadę, a ich wykorzystanie wymagało skomplikowanej analizy pamięci.

Badacze korzystali między innymi z modeli Gemini i GPT, które pomagały w analizie kodu, identyfikowaniu podatności oraz opracowywaniu i dostosowywaniu exploitów do różnych konfiguracji PHP. Według Wiz dzięki wsparciu AI udało się znacząco przyspieszyć prace, które wcześniej wymagałyby znacznie więcej czasu i zaangażowania doświadczonych specjalistów.

Dostępne poprawki

PHP2Shell nie ogranicza się do najnowszych wydań PHP. Podatności dotyczą również znacznie starszych wersji, sięgających nawet PHP 5.4.
21 października zespół PHP udostępnił poprawki w wersjach 8.2.35, 8.3.36, 8.4.27 oraz 8.5.12.

Nieco bardziej skomplikowana jest sytuacja starszych, niewspieranych już gałęzi. Nie otrzymują one standardowych aktualizacji bezpieczeństwa, choć część dostawców systemów operacyjnych nadal przygotowuje dla nich własne poprawki. Jak zaznaczono w oficjalnym komunikacie PHP, zmiany konfiguracji mogą ograniczyć możliwość wykorzystania podatności w określonych scenariuszach. Nie usuwają jednak ich przyczyny, dlatego pełne rozwiązanie problemu wymaga aktualizacji samego interpretera.