Krótko: Bezpieczeństwo Symfony po PHP2Shell oznacza: załatać PHP, zrestartować wszystkie procesy, w tym workery Messengera, a następnie sprawdzić sekrety, cache i profiler. Luka leży w PHP, a nie w Symfony; sama aktualizacja Symfony jej nie zamyka.
Dlaczego PHP2Shell dotyczy każdego projektu Symfony
Symfony jest podstawą wielu aplikacji firmowych, API i portali, a ponadto tkwi w systemach takich jak Shopware 6 i Contao. Luki PHP CVE-2026-109618 i CVE-2026-109619 umożliwiają według zespołu PHP wykonanie złośliwego kodu bez logowania. To, czy aplikacja jest czysto zaprogramowana, nie odgrywa tu roli.
Zespół PHP ocenia ryzyko przy mod_php jako najwyższe, ale dotknięte są także PHP-FPM, php-cgi, FrankenPHP i LiteSpeed. Projekty Symfony uruchamiane przez Symfony Runtime z FrankenPHP lub innymi stale działającymi serwerami wymagają po aktualizacji pełnego restartu lub nowego obrazu.
Bezpieczeństwo Symfony: sprawdzanie wersji PHP i procesów
php bin/console about pokazuje wersję Symfony, środowisko, tryb debugowania i wersję PHP wiersza poleceń. Żądania sieciowe działają jednak przez PHP-FPM lub serwer aplikacji, a to może być inna wersja. Proszę sprawdzić obie ścieżki lub zlecić ich potwierdzenie operatorowi.
Naprawione wersje upstream to 8.5.12, 8.4.27, 8.3.36 i 8.2.35; backporty dystrybucji noszą często starsze numery. To, które wersje PHP obsługuje Państwa wersja Symfony, można sprawdzić w wymaganiach systemowych w dokumentacji na symfony.com.
# Wyświetlenie środowiska, trybu debugowania i wersji PHP
php bin/console about
# Zakończenie workerów Messengera po bieżącej wiadomości
php bin/console messenger:stop-workers
# Znane luki w zależnościach
composer audit
Jeśli kilka instancji działa za load balancerem lub w kontenerach, każda z osobna musi być załatana i zrestartowana. Zapomniana instancja nadal obsługuje część żądań na starym PHP.
Workery Messengera, polecenia cron i inne procesy w tle ładują PHP jeden raz przy starcie. Dopóki nie zostaną zrestartowane, działają ze starym PHP w pamięci. Menedżer procesów musi je po zatrzymaniu uruchomić ponownie.
Gdzie aplikacje Symfony są podatne na atak
| Miejsce | Zawartość | Punkt kontroli |
|---|---|---|
.env, .env.local, .env.local.php |
Zmienne środowiskowe, często baza danych i klucze API | Niedostępne w webroot, po podejrzeniu odnowić wartości |
config/secrets/prod/ |
Zaszyfrowane sekrety | Prywatny klucz deszyfrujący nie należy do repozytorium |
public/ |
Katalog główny dokumentów z index.php |
Dodatkowe pliki PHP |
var/cache/prod/ |
Wygenerowany kontener i szablony jako PHP | Po podejrzeniu usunąć i wygenerować od nowa |
var/log/ |
Logi | Zabezpieczyć |
config/packages/security.yaml |
Firewalle, role, reguły dostępu | Nieoczekiwane zmiany |
Cache to niedoceniana kryjówka. Symfony generuje tam pliki PHP, które są ładowane przy każdym żądaniu. Zmiana w tych plikach nie rzuca się w oczy w repozytorium, ponieważ cache nie jest wersjonowany.
W produkcji muszą obowiązywać APP_ENV=prod i APP_DEBUG=0, a WebProfilerBundle nie może być tam aktywny. Publicznie dostępny profiler pod /_profiler ujawnia konfigurację i dane żądań.
Obszary admina, bundle i zależności
Projekty Symfony mają zależnie od budowy własne obszary admina, często z bundlami takimi jak EasyAdmin czy Sonata. Proszę sprawdzić w security.yaml, które ścieżki wymagają jakich ról, a w bazie danych, kto te role ma. Ścieżki admina potrzebne tylko wewnętrznie powinny być ograniczone na poziomie serwera WWW do znanych sieci.
Bundle i pakiety Composera to obcy kod z własnymi lukami. composer audit pokazuje znane problemy; szczegółowo opisuje to artykuł Sprawdzanie zależności Composera pod kątem luk. Przestarzałe pakiety są ponadto najczęstszym powodem, dla którego aktualizacja PHP w projektach Symfony trwa dłużej, niż planowano.
Co daje aktualizacja Symfony, a czego nie
Aktualizacja komponentów Symfony zamyka błędy we frameworku. Nie łata PHP, nie restartuje workerów, nie odnawia wyciekłych sekretów i nie usuwa zmanipulowanego cache. To, czy są oznaki ataku, opisuje artykuł Czy już doszło do kompromitacji?. Ponieważ nie ma potwierdzonych wskaźników kompromitacji (Indicators of Compromise), pomaga przede wszystkim obserwacja nietypowego zachowania, na przykład nieoczekiwanych procesów lub połączeń wychodzących.
Jeśli projekt jest dostarczany jako kontener, nowe PHP należy do obrazu bazowego. Proszę zbudować obraz od nowa, nawet jeśli w kodzie nic się nie zmieniło, i wdrożyć go na wszystkich środowiskach. Rzut oka do Dockerfile pokazuje, jakiego obrazu bazowego się używa; na stałe ustawiony stary tag uniemożliwia bowiem, aby nowy build w ogóle otrzymał załatane PHP. Szczegóły w artykule Łatanie PHP w kontenerach Docker.
Jak konkretnie pomaga PHP SOS?
- Ustalamy, z którego PHP korzystają web, CLI i workery Państwa projektu Symfony, i towarzyszymy w uporządkowanym restarcie.
- Zabezpieczamy logi od 20.10.2026 i porównujemy kod na serwerze z Państwa repozytorium.
- Sprawdzamy pliki środowiskowe, sekrety, cache, ustawienia profilera i role admina.
- Do bieżącej obserwacji procesów i połączeń oferujemy monitoring bezpieczeństwa.
Częste pytania
Czy Symfony jest dotknięte przez PHP2Shell?
Samo Symfony nie ma nowej luki. PHP2Shell tkwi w PHP, a więc w środowisku uruchomieniowym każdej aplikacji Symfony. Lukę zamyka aktualizacja PHP lub potwierdzony backport oraz restart wszystkich procesów PHP.
Jak zatrzymać workery Messengera po aktualizacji PHP?
Poleceniem php bin/console messenger:stop-workers działające workery otrzymują polecenie zakończenia po bieżącej wiadomości. Menedżer procesów, taki jak Supervisor lub systemd, uruchamia je następnie ponownie z nowym PHP.
Dlaczego profiler Symfony w produkcji jest niebezpieczny?
Profiler pokazuje żądania, konfigurację i często zmienne środowiskowe. Jeśli jest aktywny na publicznym serwerze, każdy może pobrać te informacje. Jego miejsce jest wyłącznie w środowisku deweloperskim.
Co dzieje się z cache po ataku?
Cache w var/cache zawiera wygenerowany kod PHP. Atakujący może tam umieścić kod, który uruchamia się przy każdym żądaniu. W razie podejrzenia cache należy usunąć i wygenerować od nowa ze sprawdzonego kodu źródłowego.