Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

PHP disable_functions správne nasadiť

Pomocou disable_functions zablokujete rizikové funkcie PHP. Ako určiť zoznam podľa svojej aplikácie bez ochromenia webu.

Stav 5 min čítaniaPríručky

Stručne: Pomocou PHP disable_functions zablokujete funkcie, cez ktoré PHP vykonáva systémové príkazy, napríklad exec, shell_exec alebo proc_open. Útočníkom to po vniknutí sťažuje ďalší krok. Nastavenie pôsobí iba z php.ini alebo poolu FPM, musí sa hodiť k aplikácii a nenahrádza aktualizáciu.

Prečo je disable_functions zmysluplné práve teraz

Pri PHP2Shell ide o vykonanie škodlivého kódu na diaľku bez prihlásenia. Obe zraniteľnosti CVE-2026-109618 a CVE-2026-109619 sídlia v samotnom interpreteri PHP, opravené sú v PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35. Aktualizácia je jediný spôsob, ako ich uzavrieť.

Spevnenie sa uplatňuje o úroveň neskôr. Kto raz dokáže na serveri vykonať kód, spravidla chce pokračovať: spúšťať systémové príkazy, sťahovať nástroje, zriadiť trvalý backdoor. Mnohé z týchto krokov prebiehajú cez niekoľko funkcií PHP. Ak sú zablokované, cesta je namáhavejšia a nápadnejšia.

disable_functions preto nie je náhradou za záplaty, ale súčasťou ochrany pre prípad, že sa napriek všetkej opatrnosti niečo prederie. Platí to pre budúce zraniteľnosti rovnako ako pre PHP2Shell.

Čo PHP disable_functions dokáže a čo nie

Nastavenie odstráni uvedené funkcie z behového prostredia. Ak skript zavolá zablokovanú funkciu, PHP skončí s chybou. Blokovanie platí pre každý kód, ktorý v tomto procese PHP beží, teda aj pre zavlečený kód.

Hranice by ste mali poznať:

  • Nastavenie nie je uzavretý chránený priestor. Rozšírenia PHP, chyby v interpreteri alebo programy mimo PHP ho môžu obísť.
  • Nebráni útočníkovi čítať alebo zapisovať súbory, ku ktorým má používateľ PHP prístup. Za to zodpovedajú práva k súborom a izolácia.
  • Pôsobí iba z php.ini alebo ako php_admin_value. Cez ini_set(), .user.ini alebo .htaccess sa nastaviť nedá.

Najviac prináša disable_functions spolu s čistou php.ini, samostatnými používateľmi pre každý web a reštriktívnymi právami k súborom. Základy sú v príručke Bezpečná konfigurácia php.ini.

Ktoré funkcie by ste mali zablokovať

Pre typické weby bez potreby systémových príkazov sa osvedčil nasledujúci zoznam. Zahŕňa funkcie na spúšťanie procesov a riadenie bežiacich procesov.

Skupina Funkcie Typické legitímne využitie
Vykonávanie príkazov exec, shell_exec, system, passthru Úprava obrázkov, zálohy cez skript
Otváranie procesov proc_open, popen Composer, nástroje na PDF, odosielanie pošty
Riadenie procesov proc_nice, proc_terminate, proc_get_status Fronty, úlohy na pozadí
Správa procesov pcntl_exec, pcntl_fork zvyčajne len v príkazovom riadku
Signály a práva posix_kill, posix_setuid zriedka vo webovej prevádzke

Ako konfigurácia to vyzerá takto:

; php.ini webového prevádzkového režimu, napr. /etc/php/8.3/fpm/php.ini
disable_functions = exec,shell_exec,system,passthru,proc_open,popen,proc_nice,proc_terminate,proc_get_status,pcntl_exec,pcntl_fork,posix_kill,posix_setuid

Ak zoznam nemá platiť pre všetky weby na serveri, nastavte ho pre každý pool FPM. Po opätovnom načítaní skontrolujte, ktorý zoznam v tomto poole skutočne platí:

; /etc/php/8.3/fpm/pool.d/meine-seite.conf (výťah)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen

Aplikáciu vopred skontrolovať: ako sa vyhnúť výpadkom

Kto zoznam nastaví bez kontroly, riskuje, že zmenšovanie obrázkov, PDF faktúry alebo odosielanie pošty prestanú zrazu fungovať. Preto najprv hľadajte dotknuté funkcie v kóde:

# Kde a ako často sa funkcie v kóde používajú?
grep -rnoE "\b(exec|shell_exec|system|passthru|proc_open|popen|pcntl_exec)\s*\(" /var/www/meine-seite --include="*.php" \
  | cut -d: -f1 | sort | uniq -c | sort -rn | head -30

Nálezy automaticky neznamenajú, že sa funkcia v prevádzke potrebuje. Mnohé knižnice najprv overia, či je funkcia dostupná, a inak použijú náhradu. Rozhodujúci je test v staging prostredí so všetkými dôležitými procesmi: objednávka, faktúra, odoslanie formulára, upload obrázka, plánované úlohy.

Ak aplikácia nevyhnutne vyžaduje niektorú z týchto funkcií, preverte systémové požiadavky výrobcu na jeho oficiálnej stránke. Úlohu sa často dá presunúť do samostatného poolu alebo do skriptu pre príkazový riadok, ktorý nie je dostupný cez web.

Nastavenie aktivovať a účinok skontrolovať

Po zmene musí PHP načítať konfiguráciu znova. Potom skontrolujte hodnotu v prevádzkovom režime svojho webu, nie v príkazovom riadku:

sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# V chybovom logu skontrolovať volania zablokovaných funkcií
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20

Hlásenia v chybovom logu sú cenné aj neskôr. Ak sa tam náhle objavia volania zablokovaných funkcií, hoci ich vaša aplikácia nepoužíva, môže to naznačovať zavlečený kód. Ako potom postupovať, popisuje príručka Rozpoznať webshell a odstrániť ju.

Typické chyby pri nasadení disable_functions

V praxi spevnenie zriedka stroskotá na technike, ale na drobnostiach. Tieto chyby sú obzvlášť rozšírené:

  • Zmenený nesprávny súbor: Zoznam je len v php.ini príkazového riadka, web beží cez PHP-FPM a zostáva nechránený.
  • Žiadny reštart: Súbor je správny, ale bežiace procesy stále pracujú so starou konfiguráciou.
  • Zablokované príliš široko: Spolu s tým sa zablokujú funkcie ako ini_set alebo mail a dôležité procesy sa nepozorovane prerušia. Chyby potom často vyjdú najavo až o niekoľko dní, napríklad pri chýbajúcich potvrdeniach objednávok.
  • Raz nastavené, nikdy nekontrolované: Po sťahovaní, zmene verzie PHP alebo novej inštalácii cez hostingový panel zoznam zmizol.
  • Falošný pocit bezpečia: Blokovanie sa chápe ako náhrada aktualizácií. Zraniteľnosť v interpreteri však neuzatvára.

Kontrolu aktívnej hodnoty preto zaraďte do svojej rutiny po každej aktualizácii PHP. Stačí krátky pohľad, stojí to takmer žiadny čas a bráni to tichej strate spevnenia.

Tip

Pri viacerých weboch na jednom serveri: založte pre každý web samostatný pool s vlastným zoznamom. Dopĺňa to open_basedir, ktorý obmedzuje adresáre, ku ktorým môže PHP pristupovať.

Ako konkrétne pomáha PHP SOS?

  • Kód a procesy vašej aplikácie preveríme na používanie kritických funkcií.
  • Pre každý web určíme vhodný zoznam blokovaných funkcií a pred spustením do ostrej prevádzky ho otestujeme.
  • Blokovanie skombinujeme s poolmi, právami k súborom a zaznamenávaním do ucelenej koncepcie spevnenia.
  • Nastavenia zdokumentujeme a chybový log sledujeme kvôli nápadným volaniam.

Ako to prebieha ako celkový balík, popisuje služba Spevnenie servera pre webové servery PHP.

Časté otázky

Môžem disable_functions nastaviť cez ini_set() alebo .htaccess?

Nie. Nastavenie pôsobí iba z php.ini alebo ako php_admin_value v poole FPM, resp. v konfigurácii Apache. Za behu sa nastaviť nedá a aplikácia zablokované funkcie ani nemôže opäť uvoľniť.

Chráni disable_functions pred PHP2Shell?

Nie. PHP2Shell sa týka samotného interpretera PHP, zraniteľnosť uzavrie iba aktualizácia. Zablokované funkcie však môžu po úspešnom zneužití obmedziť manévrovací priestor útočníka.

Prečo php -i zobrazuje iný zoznam než môj web?

Príkazový riadok často číta vlastnú php.ini. Pre web platí konfigurácia PHP-FPM, mod_php alebo LiteSpeed. Hodnotu preto kontrolujte v prevádzkovom režime, v ktorom beží váš web.

Ktoré aplikácie potrebujú proc_open alebo exec?

Závisí to od aplikácie. Typické sú úprava obrázkov cez externé programy, tvorba PDF, odosielanie pošty cez sendmail alebo nástroje ako Composer. Preverte to v kóde a v systémových požiadavkách výrobcu.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc