Aktualna sytuacja: PHP2Shell. Dwie krytyczne luki w PHP (CVSS 9,2) umożliwiają wykonanie złośliwego kodu bez logowania. Poprawki od 21.10.2026.Co należy teraz zrobić →

Wyłączanie session.upload_progress: poprawnie i na stałe

Środek zaradczy wobec CVE-2026-115560 i jeden ze środków przejściowych dla PHP2Shell ustawia się szybko. Aby był trwały, musi stać we właściwym miejscu, być zablokowany i sprawdzany po każdej aktualizacji.

Stan 5 min czytaniaUtwardzanie i konfiguracja

Krótko: Proszę ustawić session.upload_progress.enabled=0 w php.ini, w puli PHP-FPM lub w konfiguracji serwera Apache, nigdy przez ini_set() ani .user.ini, a następnie zrestartować wszystkie procesy robocze PHP. Środek staje się trwały dopiero wtedy, gdy wartość jest zablokowana przed ponownym włączeniem, obowiązuje w każdym trybie pracy i każdej zainstalowanej wersji PHP oraz jest sprawdzana po aktualizacjach.

Małe ustawienie o podwójnym działaniu

Rzadko pojedyncze ustawienie PHP zyskało tyle uwagi. Gdy php.net 21 października 2026 opublikował poprawki wobec PHP2Shell, session.upload_progress.enabled=0 znalazło się na liście środków przejściowych. Dwa dni później pojawiła się wzmianka o CVE-2026-115560, a zalecanym środkiem zaradczym było to samo ustawienie.

Wielu administratorów ustawiło je w tych dniach szybko. Czy działa wszędzie, to inne pytanie. Typowe luki wylicza się szybko: wartość jest ustawiona tylko w konfiguracji CLI, zapomniano o drugiej wersji PHP albo panel hostingu nadpisał plik przy następnym zapisie. Ten artykuł pokazuje, jak wdrożyć środek tak, aby obowiązywał jeszcze za trzy miesiące.

Ważne na początku: wyłączenie nie zastępuje aktualizacji PHP. Według doniesień branżowych samo session.upload_progress.enabled=0 nie zamyka obu luk PHP2Shell. Czego dokładnie dotyczy CVE-2026-115560, wyjaśnia strona CVE-2026-115560: wskazówka o postępie uploadu w sesji.

Co robi ta funkcja i kto jej potrzebuje

Session Upload Progress zapisuje podczas uploadu pliku na bieżąco postęp w sesji, aby aplikacja mogła wyświetlić pasek postępu. W PHP funkcja jest domyślnie włączona. Podręcznik PHP sam zwraca uwagę, że dostarczone przez nadawcę nazwy plików i pól trafiają przy tym bez sprawdzenia do pamięci sesji, i zaleca wyłączenie funkcji, jeśli aplikacja jej nie używa.

Czy Państwa aplikacja jej używa, ustalą Państwo za pomocą wyszukiwania w kodzie tylko do odczytu:

# Szuka użyć funkcji postępu w kodzie aplikacji
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/

Jeśli wyszukiwanie niczego nie znajdzie, funkcję można wyłączyć bez odczuwalnych skutków. Jeśli są trafienia, aplikacja traci tylko wskaźnik postępu, a nie upload. Nowoczesne formularze i tak zwykle mierzą postęp w przeglądarce.

Ustawianie session.upload_progress.enabled we właściwym miejscu

Ustawienie ma według podręcznika PHP tryb INI_PERDIR. Oznacza to, że można je ustawić w php.ini, w konfiguracji serwera, w .htaccess (tylko mod_php) i w .user.ini (tylko FPM i CGI), ale nie w czasie działania. php.net wyraźnie wyklucza .user.ini jako miejsce dla tego środka. Poniższa tabela pokazuje sensowne miejsca dla każdego trybu pracy.

Tryb pracy Zalecane miejsce Blokuje nadpisanie? Następnie zrestartować
PHP-FPM plik puli z php_admin_flag tak każdą usługę FPM
PHP-FPM php.ini SAPI FPM nie, .user.ini mogłoby nadpisać każdą usługę FPM
Apache z mod_php VirtualHost lub konfiguracja serwera z php_admin_flag tak Apache w całości
php-cgi, LiteSpeed, FrankenPHP php.ini danego środowiska sprawdzić zależnie od budowy wszystkie procesy środowiska
Obraz Docker osobny plik w /usr/local/etc/php/conf.d/ podczas budowania tak, jeśli nadpisanie nie jest dozwolone utworzyć kontener od nowa

Dwa solidne warianty wyglądają tak:

; PHP-FPM, np. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache z mod_php, w VirtualHost lub dla całego serwera
<IfModule php_module>
    php_admin_flag session.upload_progress.enabled off
</IfModule>

Dodatkowo warto wpisać wartość do php.ini każdego SAPI WWW jako wartość podstawową. Wtedy ustawienie obowiązuje także dla nowych pul, które ktoś założy później. Dlaczego php_admin_flag robi różnicę, opisuje artykuł php_admin_value: blokowanie ustawień przed nadpisaniem.

Sprawdzanie skuteczności w kontekście WWW

Wiersz poleceń często czyta inny php.ini niż serwer WWW. php -i dowodzi więc niewiele. Także php-fpm8.3 -i pokazuje tylko wartości z php.ini, a nie wpisy z pul. Wiarygodne jest wyłącznie zapytanie, które faktycznie przechodzi przez pulę.

Postępowanie jest następujące:

  1. Zrestartować wszystkie usługi PHP, na przykład systemctl restart php8.3-fpm lub Apache przy mod_php. Bez restartu działa dalej stara wartość.
  2. Umieścić w katalogu głównym strony krótki plik testowy o losowej nazwie, który wypisuje tylko bieżącą wartość.
  3. Wywołać plik raz przez prawdziwą domenę i zanotować wynik.
  4. Plik od razu usunąć i powtórzyć krok dla każdej strony i każdej puli.
<?php
// Plik testowy: umieścić tylko na chwilę, potem natychmiast usunąć
header('Content-Type: text/plain');
echo 'session.upload_progress.enabled = ', var_export(ini_get('session.upload_progress.enabled'), true), "\n";
echo 'PHP ', PHP_VERSION, ' / SAPI ', PHP_SAPI, "\n";

Oczekiwana jest pusta wartość lub '0'. Jeśli widnieje tam '1', Państwa ustawienie w tej puli nie działa. Po aktualizacji PHP należy dodatkowo sprawdzić, czy wszystkie procesy robocze zostały zrestartowane, jak opisano w artykule Restart PHP-FPM i wszystkich procesów roboczych.

Ważne

Proszę nigdy nie zostawiać plików testowych. Zdradzają wersje i konfigurację, a są ulubionym celem zautomatyzowanych skanów.

Aby ustawienie pozostało na stałe

Większość nawrotów powstaje nie przez atakujących, lecz przez bieżącą eksploatację. Nowa pula jest kopiowana ze starego szablonu, aktualizacja pakietu tworzy nowy php.ini albo ktoś w panelu hostingu przełącza wersję PHP. Przed takimi nawrotami chronią stałe nawyki.

  • Objąć wszystkie wersje: na wielu serwerach równolegle działa kilka wersji PHP. Każda ma własne katalogi konfiguracji i wymaga wpisu.
  • Dostosować szablony: szablony pul, role Ansible, pliki Dockerfile i szablony panelu zawierają wartość, aby nowe strony dziedziczyły ją automatycznie.
  • Korzystać z ustawień panelu: w panelach hostingu wartość należy wpisać w dodatkowe dyrektywy przewidziane przez panel, w przeciwnym razie następna zmiana nadpisze ręczną pracę.
  • Sprawdzać po aktualizacjach: sprawdzenie z poprzedniego rozdziału należy do listy kontrolnej każdej aktualizacji PHP.
  • Dokumentować: zapisać datę, serwer, pule i wynik. To pomaga później wobec zarządu, ubezpieczyciela lub audytorów.

Kto w ogóle nie używa .user.ini, może całkowicie wyłączyć wczytywanie takich plików przez user_ini.filename = w php.ini. Dotyczy to jednak wszystkich ustawień, które aplikacje tam zapisują. Dlatego krok ten proszę wcześniej przetestować, szczególnie w systemach CMS zapisujących własne pliki .user.ini.

Pozostałe środki przejściowe z php.net, na przykład limity dla post_max_size i limit pamięci przez cgroup, są zebrane na stronie Środki doraźne, gdy nie mogą Państwo jeszcze załatać. Jak PHP porządkuje swoje poziomy konfiguracji, wyjaśnia artykuł Plik php.ini wyjaśniony.

Jak konkretnie pomaga PHP SOS?

  • Inwentaryzacja: ustalamy wszystkie wersje PHP, tryby pracy i pule na Państwa serwerach oraz odczytujemy obowiązujące wartości w kontekście WWW.
  • Poprawne ustawienie: wpisujemy ustawienie z blokadą w pulach i konfiguracji serwera oraz kontrolowanie restartujemy wszystkie procesy robocze.
  • Test działania: po przestawieniu sprawdzamy formularze uploadu i zarządzanie mediami.
  • Zapobieganie nawrotom: dostosowujemy szablony, wdrożenia i ustawienia panelu oraz dokumentujemy stan w ramach utwardzania serwerów.

Częste pytania

Dlaczego session.upload_progress.enabled=0 nie działa przez ini_set()?

Według podręcznika PHP to ustawienie należy do trybu INI_PERDIR. Nie można go więc w ogóle zmienić w czasie działania przez ini_set(). php.net podaje jako właściwe miejsca php.ini, pulę FPM lub konfigurację serwera, a .user.ini wyraźnie wyklucza.

Czy uploady plików nadal działają po wyłączeniu?

Tak. Wyłączany jest tylko komunikat o postępie, który PHP zapisuje do sesji podczas uploadu. Sam upload przebiega dalej. Dotyczy to wyłącznie aplikacji, które swój pasek postępu budują właśnie na tej funkcji PHP.

Czy aplikacja może ponownie włączyć tę funkcję?

Przez plik .htaccess przy mod_php lub .user.ini przy PHP-FPM jest to zasadniczo możliwe, dopóki wartość nie jest zablokowana. Za pomocą php_admin_flag w puli lub w konfiguracji Apache Państwo temu zapobiegną.

Czy po następnej aktualizacji PHP muszę przywrócić tę wartość?

Nie, nie jest to konieczne. Funkcji nie potrzebuje większość aplikacji, a sam podręcznik PHP radzi ją w takich przypadkach wyłączyć. Po każdej aktualizacji wystarczy sprawdzić, czy wartość nadal obowiązuje.

Źródła

Kontakt natychmiast

Liczy się każda godzina. Proszę napisać do nas teraz.

Proszę krótko opisać system, wersję PHP i obserwacje. Skontaktujemy się z Państwem, ustalimy sytuację i będziemy pracować zdalnie, aż incydent zostanie zamknięty i udokumentowany.

Natychmiastowa pomoc