Krytyczne podatności PHP2Shell (CVE-2026-109618 i CVE-2026-109619): Analiza i instrukcja naprawy dla VPS
Niedawno ujawniono zestaw krytycznych podatności typu zero-day w rdzeniu PHP, określanych wspólną nazwą PHP2Shell (CVE-2026-109618 oraz CVE-2026-109619). Otrzymały one bardzo wysoki priorytet w klasyfikacji zagrożeń (9.2 w skali CVSS v4.0). Luki te umożliwiają nieuwierzytelnionemu napastnikowi zdalne wykonanie dowolnego kodu (RCE) na serwerach z podatną wersją PHP — dotyczy to konfiguracji z Apache mod_php, PHP-FPM, Nginx, LiteSpeed oraz FrankenPHP.
Z uwagi na fakt, że kod ładunku (exploit payload) jest wykonywany jeszcze przed pełnym załadowaniem logiki WordPressa, niezbędne jest natychmiastowe zaktualizowanie plików binarnych PHP na serwerze oraz dodatkowe zabezpieczenie środowiska.
Szczegóły techniczne: Na czym polegają luki CVE-2026-109618 i CVE-2026-109619?
Obie podatności ujawniają się podczas inicjalizacji lub przerwania przetwarzania żądania, zanim dojdzie do uruchomienia właściwego kodu aplikacji.
- CVE-2026-109618 (Uszkodzenie pamięci przy przekroczeniu limitu / Out-Of-Memory): Gdy niepoprawnie sformatowany lub zbyt duży ładunek
multipart/form-datawywoła wyjątek przekroczenia limitu pamięci (longjmp()), PHP przerywa proces inicjalizacji. Podczas czyszczenia zasobów silnik PHP nieprawidłowo obsługuje częściowo zainicjowane wskaźniki, co prowadzi do stanu błędu typu use-after-free lub naruszenia spójności pamięci. Stan ten może zostać wykorzystany do przejęcia kontroli i wykonania kodu na serwerze. - CVE-2026-109619 (Przetrwały stan globalny pomiędzy żądaniami): W momencie, gdy żądanie kończy się z powodu błędu krytycznego (fatal error) lub przekroczenia limitu czasu (timeout), pamięć procesu roboczego jest zwalniana. Jednak w trwałych procesach (takich jak PHP-FPM) mogą pozostać nieaktualne wskaźniki do zwolnionej pamięci. Kolejne żądanie HTTP obsłużone przez ten sam proces roboczy może uzyskać dostęp do tego nieprawidłowego stanu przed ponowną inicjalizacją, co stwarza bezpośrednie zagrożenie wykonaniem dowolnego kodu.
Instrukcja krok po kroku: Aktualizacja PHP na VPS i DigitalOcean Droplet
Aby w pełni wyeliminować problem, należy zaktualizować silnik PHP do oficjalnych wersji zawierających poprawki bezpieczeństwa:
- PHP 8.2: Aktualizacja do wersji 8.2.35 lub wyższej
- PHP 8.3: Aktualizacja do wersji 8.3.36 lub wyższej
- PHP 8.4: Aktualizacja do wersji 8.4.27 lub wyższej
- PHP 8.5: Aktualizacja do wersji 8.5.12 lub wyższej
Krok 1: Połącz się z serwerem VPS i sprawdź zainstalowaną wersję PHP
Otwórz terminal i połącz się ze swoim serwerem przez SSH:
ssh root@your_server_ip
Sprawdź aktualnie używaną wersję PHP:
php -v
Krok 2: Zaktualizuj pakiety PHP
Wybierz polecenia odpowiednie dla systemu operacyjnego zainstalowanego na Twoim serwerze.
Dla systemów Ubuntu / Debian:
# Aktualizacja listy pakietów w repozytorium
sudo apt update
# Aktualizacja wyłącznie pakietów PHP
sudo apt --only-upgrade install php* -y
# Alternatywnie: pełna aktualizacja pakietów systemowych
sudo apt upgrade -y
Dla systemów RHEL / AlmaLinux / Rocky Linux / CentOS:
# Wyczyszczenie pamięci podręcznej i odświeżenie metadanych
sudo dnf clean all && sudo dnf makecache
# Aktualizacja pakietów PHP przez DNF/YUM
sudo dnf upgrade "php*" -y
Krok 3: Uruchom ponownie PHP-FPM i serwer WWW
Sama aktualizacja plików na dysku nie wystarczy — aktywne procesy PHP-FPM lub serwera WWW działające w pamięci RAM muszą zostać uruchomione ponownie, aby załadować nowe pliki binarne.
Jeśli używasz Nginx + PHP-FPM:
Ustal aktywną wersję PHP-FPM (np. php8.3-fpm, php8.2-fpm) i zrestartuj usługę:
# Dla PHP 8.3
sudo systemctl restart php8.3-fpm
# Dla PHP 8.2
sudo systemctl restart php8.2-fpm
# Przeładuj konfigurację serwera Nginx
sudo systemctl reload nginx
Jeśli używasz Apache (mod_php lub mpm_event z PHP-FPM):
# Restart usługi Apache
sudo systemctl restart apache2 # Dla Ubuntu/Debian
# LUB
sudo systemctl restart httpd # Dla RHEL/AlmaLinux
Weryfikacja wersji po aktualizacji:
php -v
Upewnij się, że w konsoli wyświetla się jedna z bezpiecznych wersji (8.2.35+, 8.3.36+, 8.4.27+, 8.5.12+).
Tymczasowe ograniczenie ryzyka na poziomie konfiguracji
Jeśli czekasz na wydanie zaktualizowanych pakietów w oficjalnym repozytorium Twojej dystrybucji, wprowadź poniższe modyfikacje w konfiguracji, aby zmniejszyć płaszczyznę ataku.
- Wyłącz
session.upload_progress: W plikuphp.ini(np./etc/php/8.3/fpm/php.ini) odnajdź i ustaw następującą wartość:
session.upload_progress.enabled = 0
- Ogranicz limity dla żądań POST i przesyłanych plików: Zmniejsz maksymalne dopuszczalne rozmiary w
php.ini, aby uniknąć nagłych skoków alokacji pamięci:
post_max_size = 16M
upload_max_filesize = 10M
- Zrestartuj usługę PHP-FPM, aby zastosować zmiany:
sudo systemctl restart php8.3-fpm
Ochrona na poziomie aplikacji: Konfiguracja wtyczki Wordfence w WordPressie
Mimo że podatności w rdzeniu PHP występują na poziomie binarnym/środowiskowym (poniżej warstwy wykonywania kodu WordPressa), Web Application Firewall (WAF) wtyczki Wordfence stanowi kluczowy element ochrony warstwowej (defense-in-depth), pozwalając blokować złośliwe ładunki skierowane w znane punkty wejścia.
- Włącz rozszerzoną ochronę zapory Wordfence (Extended Protection)
- Zaloguj się do kokpitu WordPressa.
- Przejdź do Wordfence > Firewall.
- Kliknij Manage Firewall.
- Wybierz Optimize the Wordfence Firewall.
- Pobierz kopię zapasową pliku
.htaccesslubuser.ini, gdy system o to poprosi, i dokończ proces konfiguracji. Pozwoli to wtyczce Wordfence na wcześniejszą inicjalizację (auto_prepend_file) podczas obsługi żądań HTTP.
- Zaktualizuj reguły zapory sieciowej
- Przejdź do Wordfence > Firewall > Firewall Options.
- Upewnij się, że opcja Rules Auto-Update jest włączona.
- Kliknij ręcznie Check for Rules Update, aby pobrać najnowsze reguły ochrony przygotowane pod kątem zagrożeń CVE-2026-109618 oraz CVE-2026-109619.
- Skonfiguruj limity żądań (Rate Limiting) i ochronę przed atakami Brute Force
- Przejdź do Wordfence > Firewall > Advanced Firewall Rules.
- Włącz Rate Limiting, aby ograniczyć działanie automatycznych botów przeciążających punkty przesyłania plików nieprawidłowymi żądaniami multipart.
Lista kontrolna podsumowująca
- [ ] Połączono się przez SSH z serwerem VPS / DigitalOcean Droplet.
- [ ] Zaktualizowano pakiety PHP w systemie za pomocą
aptlubdnf. - [ ] Potwierdzono poprawność wersji PHP poleceniem
php -v. - [ ] Zrestartowano usługi
php-fpmoraznginx/apache. - [ ] Sprawdzono, czy zapora Wordfence działa w trybie Extended Protection.
- [ ] Wykonano ręczną aktualizację reguł wtyczki Wordfence.
Gotowy, aby wynieść swój projekt
na wyższy poziom?
Wprowadźmy Twoją wizję w życie dzięki profesjonalnemu tworzeniu stron i dedykowanym rozwiązaniom.
Skontaktuj się z nami już teraz i rozpocznijmy pracę nad przekształceniem Twoich pomysłów w rzeczywistość!