Krytyczne luki w PHP: co to oznacza dla stron projektów odbudowy
Nadzwyczajne aktualizacje PHP i pilne ostrzeżenie CERT-EU z 21 października dotyczą każdego, kto prowadzi projekt odbudowy z własną stroną: od portalu programu do strony zbiórki funduszy. Zhakowany zasób projektu to nie tylko awaria techniczna, ale też kwestia zaufania darczyńców i partnerów.

- Co się stało — Ukazały się nadzwyczajne wersje PHP 8.5.12, 8.4.27, 8.3.36 i 8.2.35 — zamykają dwie luki z oceną 9,2 na 10.
- Dlaczego to ważne — Strona projektu odbudowy to publiczna sprawozdawczość i dane do wpłat. Podmiana na takim zasobie uderza w zaufanie darczyńców, a nie tylko w technikę.
- Co robić — Sporządzić wykaz zasobów projektu, ustalić wersję PHP każdego z nich, zaktualizować w ramach tej samej gałęzi i zrestartować obsługę.
21 października 2026 roku zespół PHP wydał nadzwyczajne aktualizacje, a europejski zespół reagowania na incydenty komputerowe CERT-EU opublikował pilne ostrzeżenie. Dwie luki z oceną zagrożenia 9,2 na 10 pozwalają wykonać obcy kod na serwerze bez autoryzacji.
PHP to język, w którym napisana jest większość stron: WordPress, Joomla, OpenCart, Bitrix, Laravel. W kontekście odbudowy oznacza to portale programów, strony zbiórek funduszy, rejestry zniszczonego mienia, strony organizacji społecznych i wykonawców — czyli zasoby, w których obok siebie leżą dane osobowe, dokumenty i dane płatnicze.
Co dokładnie znaleziono
Luk jest dwie, obie ocenione na 9,2 punktu i obie prowadzą do tego samego skutku — wykonania obcego kodu na serwerze bez autoryzacji.
CVE-2026-109618 — awaria przy braku pamięci
W PHP jest ustawienie memory_limit: żądanie, które zużyło zbyt wiele pamięci, jest przerywane siłowo. Problem polega na tym, jak dokładnie zostaje przerwane. PHP może urwać się w momencie, gdy wewnętrzne dane żądania są wypełnione tylko do połowy — na przykład w trakcie analizy pliku przesłanego przez formularz wysyłania. Porządkowanie po takim żądaniu bierze niedokończone dane za prawdziwe i próbuje zwolnić pamięć, której nigdy nie było. A w tej pamięci może leżeć to, co napastnik umieścił tam wcześniejszymi żądaniami.
CVE-2026-109619 — pozostałości poprzedniego żądania
Druga dziura dotyczy tego, że serwer nie do końca „zapomina” poprzedniego odwiedzającego. Stan wewnętrzny, który należał do jednego żądania, czasem przeżywa zwolnienie pamięci — powiedzmy po błędzie krytycznym. Następne żądanie, które trafiło do tego samego procesu roboczego, zdąży skorzystać z tych pozostałości, zanim zwykła inicjalizacja je wyzeruje.
Zagrożona jest każda instalacja PHP obsługująca żądania sieciowe: PHP-FPM, Apache z modułem mod_php, php-cgi, FrankenPHP, LiteSpeed. Za najbardziej ryzykowne zespół PHP uznaje właśnie połączenie Apache z mod_php — jest ono do dziś standardem na wielu tanich hostingach.
Demonstracyjny exploit działa jednym jedynym nieuwierzytelnionym żądaniem — jeszcze przed tym, jak zacznie wykonywać się kod samej strony. Czyli nie pomogą tu ani wtyczki bezpieczeństwa, ani skomplikowane hasła, ani uwierzytelnianie dwuskładnikowe: atak odbywa się o poziom niżej.
Które wersje są zagrożone
Wszystko, co jest niższe od tych wersji, jest podatne:
| Gałąź PHP | Bezpieczna wersja |
|---|---|
| PHP 8.5 | 8.5.12 |
| PHP 8.4 | 8.4.27 |
| PHP 8.3 | 8.3.36 |
| PHP 8.2 | 8.2.35 |
| PHP 8.1 i starsze | brak wsparcia |
Osobną kategorią ryzyka są produkty komercyjne i otwarte, wewnątrz których PHP jest wbudowany, choć z zewnątrz tego nie widać: panele zarządzania, urządzenia sieciowe, systemy monitoringu wideo, portale korporacyjne. Spis takiego oprogramowania prowadzi repozytorium niderlandzkiego NCSC.
Dlaczego zhakowana strona projektu to kwestia zaufania, a nie tylko techniki
Nikt nie szuka waszego projektu osobno. Kiedy przykłady exploitów stają się publiczne — a już są publiczne — w ciągu kilku godzin ruszają automatyczne skanery, które przeczesują cały internet po kolei. Jest im obojętne, czy to portal programu krajowego, czy strona inicjatywy dla jednej gminy: liczy się tylko wersja, którą odpowiada serwer.
Typowe skutki są znane: webshell na serwerze, spam i obca reklama na stronach, domena na czarnych listach, poczta, która przestaje dochodzić. Ale dla projektów odbudowy najdroższe jest coś innego. Po pierwsze, podmiana danych do wpłat — klasyczny scenariusz, w którym stronę ze zbiórką hakuje się nie po to, by ją zepsuć, lecz by po cichu zmienić numer konta. Po drugie, publiczna sprawozdawczość: jeśli dokumenty i liczby można zmienić z zewnątrz, traci sens sama otwartość, na której opiera się zaufanie darczyńców i partnerów.
Po trzecie — dane ludzi. Wnioski, rejestry uszkodzonego mienia i ankiety uczestników programów zwykle leżą na tym samym serwerze co strona.
Co robić — krok po kroku
- Proszę sprawdzić swoją wersję. W panelu hostingu to sekcja „Wersja PHP” lub „PHP Selector”; na własnym serwerze — polecenie
php -v. Ważne jest sprawdzenie wersji, na której pracuje sama strona, a nie tej, która stoi w wierszu poleceń: często się różnią. - Proszę zaktualizować w ramach swojej gałęzi. Przejście z 8.2.29 na 8.2.35 to poprawka wewnątrz jednej gałęzi: zgodność zostaje zachowana, strona od tego się nie psuje. Nie należy tego mylić z przejściem z 8.2 na 8.4 — ono już wymaga sprawdzenia.
- Jeśli mają Państwo 8.1 lub starszą — te gałęzie nie mają wsparcia. Z powodu powagi sytuacji zespół bezpieczeństwa PHP wydał minimalne poprawki także dla 7.4, 8.0 i 8.1, a część hostingów utrzymuje własne kompilacje. Właściwym rozwiązaniem jest jednak przeniesienie się na wspieraną gałąź, a lepiej zaplanować je teraz niż następnym razem.
- Proszę zrestartować moduły obsługi. Bez restartu
php-fpmlub Apache procesy robocze dalej pracują na starym kodzie i aktualizacja faktycznie nie działa. - Proszę sprawdzić wynik. Najprościej — tymczasowa strona z
phpinfo(), którą zaraz po sprawdzeniu trzeba usunąć, albo sekcja „Wersja PHP” w panelu po restarcie.
Użytkownicy hostingu najczęściej nie będą musieli robić niczego ręcznie: duzi dostawcy dostali poprawki z wyprzedzeniem i sami aktualizują swoje maszyny. Warto napisać do wsparcia jedną linijkę — „czy PHP zostało zaktualizowane do wersji z 21 października 2026” — i dostać odpowiedź na piśmie.
Jeśli aktualizacja od razu nie jest możliwa
Bywa, że strona jest stara, a aktualizacja wymaga przygotowania. Wtedy są środki tymczasowe, które zwężają okno do ataku:
- zablokować przepełnienie pamięci jako punkt wejścia:
memory_limit=-1, ustawiony tak, by aplikacja nie mogła tego nadpisać, oraz sprawdzenie, że żadna pula ani katalog nie przywraca limitu; - zmniejszyć
post_max_size— 8M dla stron bez wysyłania plików, 32M jeśli wysyłanie jest potrzebne, aupload_max_filesizetrzymać niżej; - wyłączyć
session.upload_progress.enabledi zrestartować wszystkie procesy robocze; - na PHP 8.5 dodatkowo wyłączyć
fatal_error_backtraces; - ograniczyć rozmiar i złożoność żądań na poziomie serwera WWW lub proxy.
Żaden z tych środków nie czyni instalacji bezpieczną. Zamykają one tylko znane drogi — całkowicie problem zamyka wyłącznie aktualizacja.
Jeśli i to jest niemożliwe, CERT-EU doradza proste i niepopularne rozwiązanie: usunąć podatną usługę z publicznego internetu, dopóki poprawka nie zostanie zainstalowana i sprawdzona.
Skąd te dane
- CERT-EU, Security Advisory 2026-018 „Critical Vulnerabilities in PHP”
- Ogłoszenie o wydaniu aktualizacji na php.net
- Techniczny opis CVE-2026-109618 i CVE-2026-109619
Jeśli w waszym projekcie nie ma osoby odpowiedzialnej za aktualizacje i dostępy, audyt zasobów można zlecić na zewnątrz — w szczególności firmie SmartGT.
Autor materiału — SmartGT. Źródło pierwotne: „Krytyczne luki w PHP: aktualizacji nie można odkładać”.
