Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

Isključiti session.upload_progress: ispravno i trajno

Zaštita od CVE-2026-115560 i jedna od prijelaznih mjera za PHP2Shell postavlja se brzo. Da bi držala, mora biti na pravom mjestu, zaključana i provjeravana nakon svakog ažuriranja.

Stanje 5 min čitanjaOjačavanje i konfiguracija

Ukratko: Postavite session.upload_progress.enabled=0 u php.ini, u PHP-FPM poolu ili u Apache konfiguraciji poslužitelja, nikada putem ini_set() ili .user.ini, a zatim ponovno pokrenite sve PHP workere. Mjera postaje trajna tek kad je vrijednost zaključana od ponovnog uključivanja, vrijedi u svakom načinu rada i svakoj instaliranoj verziji PHP-a te se provjerava nakon ažuriranja.

Mala postavka s dvostrukim učinkom

Rijetko je jedna PHP postavka dobila toliko pozornosti. Kad je php.net 21. listopada 2026. objavio zakrpe za PHP2Shell, session.upload_progress.enabled=0 našao se na popisu prijelaznih mjera. Dva dana kasnije uslijedila je napomena o CVE-2026-115560, a preporučena zaštita bila je ista postavka.

Mnogi su je administratori tih dana brzo postavili. Djeluje li posvuda, drugo je pitanje. Tipične praznine brzo se nabrajaju: vrijednost stoji samo u CLI konfiguraciji, druga verzija PHP-a je zaboravljena ili je hosting panel pri sljedećem spremanju prepisao datoteku. Ovaj članak pokazuje kako mjeru provesti tako da vrijedi i za tri mjeseca.

Važno unaprijed: isključivanje ne zamjenjuje PHP ažuriranje. Prema stručnim izvješćima sam session.upload_progress.enabled=0 ne zatvara obje ranjivosti PHP2Shella. Što se točno tiče CVE-2026-115560, objašnjava stranica CVE-2026-115560: napomena o Session Upload Progressu.

Što funkcija radi i kome treba

Session Upload Progress tijekom prijenosa datoteke neprekidno upisuje napredak u sesiju kako bi aplikacija mogla prikazati traku napretka. U PHP-u je funkcija zadano uključena. PHP priručnik sam upozorava da pritom nazivi datoteka i polja koje isporuči pošiljatelj završavaju neprovjereni u memoriji sesije i preporučuje isključiti funkciju ako je aplikacija ne koristi.

Koristi li je Vaša aplikacija, saznat ćete pretragom koda koja samo čita:

# Traži upotrebe funkcije napretka u kodu aplikacije
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/

Ako pretraga ništa ne pronađe, funkciju možete isključiti bez osjetnih posljedica. Ako ima pogodaka, aplikacija gubi samo prikaz napretka, a ne prijenos. Suvremeni obrasci napredak ionako uglavnom mjere u pregledniku.

session.upload_progress.enabled postaviti na pravom mjestu

Postavka prema PHP priručniku ima način INI_PERDIR. To znači: može se postaviti u php.ini, u konfiguraciji poslužitelja, u .htaccess (samo mod_php) i u .user.ini (samo FPM i CGI), ali ne tijekom rada. php.net .user.ini izričito isključuje kao mjesto za mjeru. Sljedeća tablica prikazuje smislena mjesta po načinu rada.

Način rada Preporučeno mjesto Zaključava od nadjačavanja? Nakon toga ponovno pokrenuti
PHP-FPM datoteka poola s php_admin_flag da svaku FPM uslugu
PHP-FPM php.ini FPM SAPI-ja ne, .user.ini bi mogao nadjačati svaku FPM uslugu
Apache s mod_php VirtualHost ili konfiguracija poslužitelja s php_admin_flag da Apache u cijelosti
php-cgi, LiteSpeed, FrankenPHP php.ini dotičnog izvršnog okruženja provjeriti prema izvedbi sve procese okruženja
Docker image vlastita datoteka u /usr/local/etc/php/conf.d/ pri izgradnji da, ako nadjačavanje nije dopušteno ponovno izraditi kontejner

Dvije otporne varijante izgledaju ovako:

; PHP-FPM, npr. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache s mod_php, u VirtualHostu ili na razini cijelog poslužitelja
<IfModule php_module>
    php_admin_flag session.upload_progress.enabled off
</IfModule>

Dodatno se isplati unos u php.ini svakog web SAPI-ja kao osnovna vrijednost. Tada postavka vrijedi i za nove poolove koje netko kasnije izradi. Zašto php_admin_flag čini razliku, opisuje članak php_admin_value: zaključati postavke od nadjačavanja.

Provjeriti djelotvornost u web-kontekstu

Naredbeni redak često čita drugu php.ini od web-poslužitelja. php -i stoga dokazuje malo. Ni php-fpm8.3 -i ne pokazuje unose iz poolova, nego samo vrijednosti iz php.ini. Pouzdan je samo upit koji se doista izvršava preko poola.

Postupak:

  1. Ponovno pokrenite sve PHP usluge, primjerice systemctl restart php8.3-fpm ili Apache kod mod_php-a. Bez ponovnog pokretanja stara vrijednost nastavlja vrijediti.
  2. U web-korijen odložite kratku datoteku za provjeru s nasumičnim nazivom koja ispisuje samo trenutačnu vrijednost.
  3. Datoteku jednom pozovite preko prave domene i zabilježite rezultat.
  4. Datoteku odmah izbrišite i korak ponovite za svaku web-stranicu i svaki pool.
<?php
// Datoteka za provjeru: odložiti samo nakratko, zatim odmah izbrisati
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";

Očekuje se prazna vrijednost ili '0'. Ako tamo stoji '1', Vaša postavka u tom poolu ne djeluje. Nakon ažuriranja PHP-a dodatno provjerite jesu li svi workeri ponovno pokrenuti, kako je opisano u članku Ponovno pokrenuti PHP-FPM i sve workere.

Važno

Datoteke za provjeru nikad ne ostavljajte. Otkrivaju verzije i konfiguraciju i omiljena su meta automatiziranih skeniranja.

Da postavka ostane trajno

Većina povrata ne nastaje zbog napadača, nego zbog rada. Novi pool kopira se iz starog predloška, ažuriranje paketa izrađuje novu php.ini ili netko u hosting panelu promijeni verziju PHP-a. Protiv takvih povrata pomažu čvrste navike.

  • Pokriti sve verzije: na mnogim poslužiteljima paralelno radi više verzija PHP-a. Svaka ima vlastite konfiguracijske mape i treba unos.
  • Prilagoditi predloške: predlošci poolova, Ansible uloge, Dockerfileovi i predlošci panela sadrže vrijednost kako bi je nove web-stranice automatski naslijedile.
  • Koristiti postavke panela: u hosting panelima vrijednost pripada u dodatne direktive koje panel predviđa, inače sljedeća izmjena prepisuje ručni rad.
  • Provjeravati nakon ažuriranja: provjera iz prethodnog odjeljka pripada u kontrolni popis svakog PHP ažuriranja.
  • Dokumentirati: zabilježiti datum, poslužitelj, poolove i rezultat. To kasnije pomaže prema upravi, osiguravatelju ili revizorima.

Tko .user.ini uopće ne koristi, može učitavanje takvih datoteka potpuno isključiti pomoću user_ini.filename = u php.ini. To se ipak odnosi na sve postavke koje aplikacije tamo odlažu. Zato taj korak prethodno testirajte, osobito kod CMS-ova koji pišu vlastite .user.ini datoteke.

Ostale prijelazne mjere php.net-a, primjerice granice za post_max_size i granicu memorije putem cgroupa, skupljene su na stranici Hitne mjere ako još ne možete zakrpati. Kako PHP načelno uređuje svoje razine konfiguracije, objašnjava članak php.ini objašnjen.

Kako PHP SOS konkretno pomaže?

  • Zabilježiti stanje: utvrđujemo sve verzije PHP-a, načine rada i poolove na Vašim poslužiteljima i očitavamo djelotvorne vrijednosti u web-kontekstu.
  • Čisto postaviti: postavku upisujemo zaključanu u poolove i konfiguraciju poslužitelja te kontrolirano ponovno pokrećemo sve workere.
  • Testirati funkciju: obrasce za prijenos i upravljanje medijima provjeravamo nakon prijelaza.
  • Spriječiti povrate: predloške, deploymente i postavke panela prilagođavamo i stanje dokumentiramo u sklopu ojačavanja poslužitelja.

Česta pitanja

Zašto session.upload_progress.enabled=0 ne djeluje putem ini_set()?

Postavka prema PHP priručniku pripada načinu INI_PERDIR. Zato se uopće ne može mijenjati tijekom rada putem ini_set(). php.net kao ispravna mjesta navodi php.ini, FPM pool ili konfiguraciju poslužitelja, a .user.ini izričito isključuje.

Rade li prijenosi datoteka i nakon isključivanja?

Rade. Isključuje se samo obavijest o napretku koju PHP tijekom prijenosa upisuje u sesiju. Sam prijenos teče dalje. Pogođene su samo aplikacije koje svoju traku napretka grade upravo na toj PHP funkciji.

Može li aplikacija funkciju ponovno uključiti?

Putem datoteke .htaccess kod mod_php-a ili .user.ini kod PHP-FPM-a to je u načelu moguće, dok vrijednost nije zaključana. Pomoću php_admin_flag u poolu ili u Apache konfiguraciji to sprječavate.

Moram li vrijednost vratiti nakon sljedećeg ažuriranja PHP-a?

Ne, to nije potrebno. Većini aplikacija funkcija nije potrebna, a PHP priručnik sam savjetuje da se u takvim slučajevima isključi. Nakon svakog ažuriranja provjerite samo vrijedi li vrijednost još.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć