Ukratko: Uz PHP disable_functions zabranjujete funkcije putem kojih PHP izvršava sistemske naredbe, primjerice exec, shell_exec ili proc_open. To napadačima nakon provale otežava sljedeći korak. Postavka djeluje samo iz php.ini ili FPM poola, mora odgovarati aplikaciji i ne zamjenjuje ažuriranje.
Zašto je disable_functions upravo sada smislen
Kod PHP2Shella radi se o izvršavanju zlonamjernog koda izdaleka bez prijave. Dvije ranjivosti CVE-2026-109618 i CVE-2026-109619 nalaze se u samom PHP interpreteru, a ispravljene su u PHP-u 8.5.12, 8.4.27, 8.3.36 i 8.2.35. Ažuriranje je jedini način da se zatvore.
Ojačavanje djeluje razinu kasnije. Tko jednom može izvršavati kod na poslužitelju, obično želi dalje: pokretati sistemske naredbe, naknadno učitavati alate, postaviti trajna stražnja vrata. Mnogi od tih koraka prolaze kroz malo PHP funkcija. Ako su zabranjene, put postaje mukotrpniji i upadljiviji.
disable_functions stoga nije zamjena za zakrpe, nego sastavni dio za slučaj da unatoč svakom oprezu nešto prođe. To vrijedi za buduće ranjivosti jednako kao i za PHP2Shell.
Što PHP disable_functions postiže, a što ne
Postavka uklanja navedene funkcije iz izvršnog okruženja. Ako skripta pozove zabranjenu funkciju, PHP prekida rad s pogreškom. Zabrana vrijedi za svaki kod koji radi u tom PHP procesu, dakle i za ubačeni kod.
Granice trebate poznavati:
- Postavka nije zatvoreni zaštićeni prostor. PHP ekstenzije, pogreške u interpreteru ili programi izvan PHP-a mogu je zaobići.
- Ne sprječava napadača da čita ili piše datoteke kojima PHP korisnik ima pristup. Za to su zaduženi prava datoteka i izolacija.
- Djeluje samo iz php.ini ili kao
php_admin_value. Putemini_set(),.user.iniili.htaccessne može se postaviti.
Najviše disable_functions donosi zajedno s urednom php.ini, zasebnim korisnicima po web-stranici i restriktivnim pravima datoteka. Osnove su u vodiču Sigurna konfiguracija php.ini.
Koje funkcije trebate zabraniti
Za tipične web-stranice bez potrebe za sistemskim naredbama sljedeći se popis pokazao dobrim. Obuhvaća funkcije za pokretanje procesa i upravljanje pokrenutim procesima.
| Skupina | Funkcije | Tipična legitimna uporaba |
|---|---|---|
| Izvršavanje naredbi | exec, shell_exec, system, passthru |
Obrada slika, sigurnosne kopije putem skripte |
| Otvaranje procesa | proc_open, popen |
Composer, PDF alati, slanje e-pošte |
| Upravljanje procesima | proc_nice, proc_terminate, proc_get_status |
Redovi čekanja, pozadinski poslovi |
| Administracija procesa | pcntl_exec, pcntl_fork |
uglavnom samo u naredbenom retku |
| Signali i prava | posix_kill, posix_setuid |
rijetko u web-radu |
Kao konfiguracija to izgleda ovako:
; php.ini web načina rada, npr. /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
Ako popis ne vrijedi za sve web-stranice na poslužitelju, postavite ga po FPM poolu. Nakon ponovnog učitavanja provjerite koji popis u tom poolu zaista vrijedi:
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (izvadak)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen
Prethodna provjera aplikacije: tako izbjegavate ispade
Tko popis postavi neprovjereno, riskira da smanjivanje slika, PDF računi ili slanje e-pošte odjednom prestanu raditi. Zato prethodno u kodu potražite pogođene funkcije:
# Gdje se i koliko često funkcije koriste u kodu?
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
Pogoci automatski ne znače da se funkcija u radu zaista treba. Mnoge biblioteke najprije provjere je li funkcija dostupna, a inače odabiru zaobilazno rješenje. Odlučujući je test u staging okruženju sa svim važnim procesima: narudžba, račun, slanje obrasca, upload slike, planirani zadaci.
Ako aplikacija nužno zahtijeva neku od tih funkcija, provjerite sistemske zahtjeve proizvođača na njegovoj službenoj stranici. Zadatak se često može premjestiti u zaseban pool ili skriptu naredbenog retka koja nije dostupna putem weba.
Aktivacija postavke i provjera učinka
Nakon promjene PHP mora ponovno učitati konfiguraciju. Zatim provjerite vrijednost u načinu rada svoje web-stranice, a ne u naredbenom retku:
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# Provjeriti log pogrešaka na pozive zabranjenih funkcija
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20
Poruke u logu pogrešaka vrijedne su i kasnije. Ako se tamo odjednom pojave pozivi zabranjenih funkcija iako ih Vaša aplikacija ne koristi, to može upućivati na ubačeni kod. Kako dalje postupiti, opisuje vodič Prepoznavanje i uklanjanje webshellova.
Tipične pogreške pri uporabi disable_functions
U praksi se ojačavanje rijetko slomi na tehnici, nego na sitnicama. Ove su pogreške osobito raširene:
- Promijenjena pogrešna datoteka: Popis stoji samo u php.ini naredbenog retka, a web-stranica radi preko PHP-FPM-a i ostaje nezaštićena.
- Bez ponovnog pokretanja: Datoteka je ispravna, ali pokrenuti procesi još rade sa starom konfiguracijom.
- Zabranjeno preširoko: Funkcije poput
ini_setilimailzabranjene su usput i važni procesi neprimjetno prestaju raditi. Pogreške se tada često uoče tek nakon nekoliko dana, primjerice kad izostanu potvrde narudžbi. - Jednom postavljeno, nikad provjereno: Nakon selidbe, promjene verzije PHP-a ili nove instalacije putem hosting panela popis je nestao.
- Lažan osjećaj sigurnosti: Zabrana se shvaća kao zamjena za ažuriranja. Ona ipak ne zatvara ranjivost u interpreteru.
Provjeru aktivne vrijednosti stoga uvrstite u svoju rutinu nakon svakog PHP ažuriranja. Dovoljan je kratak pogled, jedva traje i sprječava da se ojačavanje tiho izgubi.
Kod više web-stranica na jednom poslužitelju: za svaku web-stranicu postavite zaseban pool s vlastitim popisom. Dopunski open_basedir ograničava direktorije kojima PHP smije pristupati.
Kako PHP SOS konkretno pomaže?
- Provjeravamo kod i procese Vaše aplikacije na uporabu kritičnih funkcija.
- Za svaku web-stranicu određujemo prikladan popis zabrana i testiramo ga prije puštanja u rad.
- Zabranu kombiniramo s poolovima, pravima datoteka i bilježenjem u skladan koncept ojačavanja.
- Postavke dokumentiramo i nadziremo log pogrešaka zbog upadljivih poziva.
Kako to teče kao cjelovit paket, opisuje usluga Ojačavanje poslužitelja za PHP web-poslužitelje.
Česta pitanja
Mogu li disable_functions postaviti putem ini_set() ili .htaccess?
Ne. Postavka djeluje samo iz php.ini ili kao php_admin_value u FPM poolu odnosno u Apache konfiguraciji. Tijekom rada ne može se postaviti, a aplikacija zabranjene funkcije ne može ni ponovno odobriti.
Štiti li disable_functions od PHP2Shella?
Ne. PHP2Shell pogađa sam PHP interpreter, a ranjivost se zatvara samo ažuriranjem. Zabranjene funkcije ipak mogu ograničiti prostor djelovanja napadača nakon uspješnog iskorištavanja.
Zašto php -i prikazuje drugačiji popis od moje web-stranice?
Naredbeni redak često čita vlastitu php.ini. Za web-stranicu je mjerodavna konfiguracija PHP-FPM-a, mod_php-a ili LiteSpeeda. Vrijednost stoga provjerite u načinu rada preko kojeg radi Vaša web-stranica.
Koje aplikacije trebaju proc_open ili exec?
To ovisi o aplikaciji. Tipični su obrada slika putem vanjskih programa, izrada PDF-ova, slanje e-pošte putem sendmaila ili alati poput Composera. Provjerite to u kodu i u sistemskim zahtjevima proizvođača.