Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

Pravilna uporaba PHP disable_functions

Z disable_functions blokirate tvegane funkcije PHP. Kako seznam prilagodite svoji aplikaciji, ne da bi spletna stran odpovedala.

Stanje 5 min branjaPriročniki

Na kratko: S PHP disable_functions blokirate funkcije, prek katerih PHP izvaja sistemske ukaze, na primer exec, shell_exec ali proc_open. To napadalcem po vdoru otežuje naslednji korak. Nastavitev deluje samo iz php.ini ali poola FPM, mora ustrezati aplikaciji in posodobitve ne nadomesti.

Zakaj je disable_functions smiseln prav zdaj

Pri PHP2Shell gre za izvajanje škodljive kode na daljavo brez prijave. Ranljivosti CVE-2026-109618 in CVE-2026-109619 sta v samem interpreterju PHP, odpravljeni v PHP 8.5.12, 8.4.27, 8.3.36 in 8.2.35. Posodobitev je edini način, da ju zaprete.

Utrjevanje posega eno raven pozneje. Kdor enkrat lahko izvede kodo na strežniku, običajno hoče naprej: zagnati sistemske ukaze, naložiti orodja, vzpostaviti trajna stranska vrata. Številni od teh korakov tečejo prek maloštevilnih funkcij PHP. Če so blokirane, je pot bolj mukotrpna in bolj opazna.

disable_functions zato ni nadomestilo za popravke, ampak gradnik za primer, da kljub vsej previdnosti kaj prodre. To velja za prihodnje ranljivosti enako kot za PHP2Shell.

Kaj PHP disable_functions zmore in česa ne

Nastavitev navedene funkcije odstrani iz izvajalnega okolja. Če skripta pokliče blokirano funkcijo, PHP prekine z napako. Blokada velja za vsako kodo, ki teče v tem procesu PHP, torej tudi za vneseno kodo.

Meje poznajte:

  • Nastavitev ni zaprt zaščitni prostor. Razširitve PHP, napake v interpreterju ali programi zunaj PHP jo lahko zaobidejo.
  • Ne prepreči, da napadalec bere ali piše datoteke, do katerih ima dostop uporabnik PHP. Za to so pristojne pravice datotek in izolacija.
  • Deluje samo iz php.ini ali kot php_admin_value. Z ini_set(), .user.ini ali .htaccess je ni mogoče nastaviti.

Največ disable_functions prinese skupaj s čisto php.ini, lastnimi uporabniki za vsako spletno stran in restriktivnimi pravicami datotek. Osnove so v vodniku Varna konfiguracija php.ini.

Katere funkcije naj blokirate

Za tipične spletne strani brez potrebe po sistemskih ukazih se je obneslo naslednje. Zajema funkcije za zagon procesov in za upravljanje tekočih procesov.

Skupina Funkcije Tipična zakonita uporaba
Izvajanje ukazov exec, shell_exec, system, passthru Obdelava slik, varnostne kopije prek skript
Odpiranje procesov proc_open, popen Composer, orodja za PDF, pošiljanje e-pošte
Upravljanje procesov proc_nice, proc_terminate, proc_get_status Čakalne vrste, opravila v ozadju
Upravljanje procesov v sistemu pcntl_exec, pcntl_fork večinoma samo v ukazni vrstici
Signali in pravice posix_kill, posix_setuid redko v spletnem delovanju

Kot konfiguracija je to videti tako:

; php.ini spletnega načina delovanja, 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

Če seznam ne velja za vse spletne strani na strežniku, ga nastavite za vsak pool FPM. Po ponovnem nalaganju preverite, kateri seznam v tem poolu dejansko velja:

; /etc/php/8.3/fpm/pool.d/meine-seite.conf (izvleček)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen

Aplikacijo preverite vnaprej: tako se izognete izpadom

Kdor seznam nastavi nepreverjeno, tvega, da zmanjševanje slik, računi v PDF ali pošiljanje e-pošte nenadoma ne bodo več delovali. Zato v kodi vnaprej poiščite zadevne funkcije:

# Kje in kako pogosto se funkcije uporabljajo v kodi?
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

Zadetki samodejno ne pomenijo, da se funkcija v delovanju potrebuje. Številne knjižnice najprej preverijo, ali je funkcija na voljo, sicer pa ubero drugo pot. Odločilen je preizkus v okolju staging z vsemi pomembnimi postopki: naročilo, račun, pošiljanje obrazca, nalaganje slike, načrtovana opravila.

Če aplikacija nujno zahteva eno od teh funkcij, preverite sistemske zahteve proizvajalca na njegovi uradni strani. Pogosto je nalogo mogoče prestaviti v ločen pool ali skripto ukazne vrstice, ki ni dosegljiva prek spleta.

Aktivirajte nastavitev in preverite učinek

Po spremembi mora PHP konfiguracijo znova prebrati. Nato vrednost preverite v načinu delovanja vaše spletne strani, ne v ukazni vrstici:

sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# V dnevniku napak preverite klice blokiranih funkcij
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20

Sporočila v dnevniku napak so dragocena tudi pozneje. Če se tam nenadoma pojavijo klici blokiranih funkcij, čeprav jih vaša aplikacija ne uporablja, to lahko kaže na vneseno kodo. Kako nadaljujete, opisuje vodnik Prepoznavanje in odstranitev webshellov.

Tipične napake pri uporabi disable_functions

V praksi utrjevanje redko spodleti zaradi tehnike, temveč zaradi malenkosti. Te napake so posebej pogoste:

  • Spremenjena napačna datoteka: Seznam je samo v php.ini ukazne vrstice, spletna stran teče prek PHP-FPM in ostane nezaščitena.
  • Brez ponovnega zagona: Datoteka je pravilna, a tekoči procesi še delajo s staro konfiguracijo.
  • Preširoka blokada: Skupaj se blokirajo funkcije, kot sta ini_set ali mail, in pomembni postopki neopazno odpovedo. Napake pogosto opazite šele po nekaj dneh, na primer ko izostanejo potrditve naročil.
  • Enkrat nastavljeno, nikoli preverjeno: Po selitvi, menjavi različice PHP ali novi namestitvi prek upravljalnega panela gostovanja je seznam izginil.
  • Lažen občutek varnosti: Blokada se razume kot nadomestilo za posodobitve. Ranljivosti v interpreterju pa ne zapre.

Preverjanje aktivne vrednosti zato vključite v rutino po vsaki posodobitvi PHP. Kratek pogled zadošča, vzame malo časa in prepreči, da bi se utrditev tiho izgubila.

Nasvet

Pri več spletnih straneh na enem strežniku: za vsako spletno stran ustvarite lasten pool z lastnim seznamom. Dodatno open_basedir omeji mape, do katerih sme PHP dostopati.

Kako PHP SOS pomaga konkretno?

  • Kodo in postopke vaše aplikacije preverimo glede uporabe kritičnih funkcij.
  • Za vsako spletno stran določimo ustrezen seznam blokad in ga pred zagonom preizkusimo.
  • Blokado združimo s pooli, pravicami datotek in beleženjem v skladen koncept utrjevanja.
  • Nastavitve dokumentiramo in dnevnik napak nadzorujemo glede sumljivih klicev.

Kako to poteka kot celotni paket, opisuje storitev Utrjevanje strežnikov PHP.

Pogosta vprašanja

Ali lahko disable_functions nastavim z ini_set() ali .htaccess?

Ne. Nastavitev deluje samo iz php.ini ali kot php_admin_value v poolu FPM oziroma v konfiguraciji Apache. Med izvajanjem je ni mogoče nastaviti, aplikacija pa blokiranih funkcij tudi ne more znova odblokirati.

Ali disable_functions ščiti pred PHP2Shell?

Ne. PHP2Shell zadeva sam interpreter PHP, ranljivost zapre samo posodobitev. Blokirane funkcije pa lahko po uspešnem izkoriščanju omejijo manevrski prostor napadalca.

Zakaj php -i prikaže drug seznam kot moja spletna stran?

Ukazna vrstica pogosto bere lastno php.ini. Za spletno stran šteje konfiguracija PHP-FPM, mod_php ali LiteSpeed. Vrednost zato preverite v načinu delovanja, prek katerega teče vaša spletna stran.

Katere aplikacije potrebujejo proc_open ali exec?

To je odvisno od aplikacije. Značilni so obdelava slik prek zunanjih programov, ustvarjanje PDF, pošiljanje e-pošte prek sendmail ali orodja, kot je Composer. Preverite v kodi in v sistemskih zahtevah proizvajalca.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč