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. Cezini_set(),.user.inialebo.htaccesssa 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_setalebomaila 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.
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.