Praegune olukord: PHP2Shell. Kaks kriitilist PHP turvaauku (CVSS 9,2) lubavad kahjulikku koodi ilma sisselogimata. Paigad alates 21.10.2026.Mida nüüd teha →

PHP disable_functions õige kasutamine

Seadega disable_functions lukustate riskantsed PHP funktsioonid. Kuidas koostada loend oma rakendusele sobivaks, panemata veebisaiti seisma.

Seis Lugemisaeg 4 minJuhendid

Lühidalt: PHP disable_functions abil lukustate funktsioonid, mille kaudu PHP käivitab süsteemikäske, näiteks exec, shell_exec või proc_open. See raskendab ründajal pärast sissemurdmist järgmist sammu. Seade toimib ainult php.ini-st või FPM-i poolist, peab rakendusele sobima ega asenda uuendust.

Miks disable_functions on just praegu mõistlik

PHP2Shelli puhul on tegemist kahjuliku koodi kaugkäivitamisega ilma sisselogimata. Mõlemad turvaaugud CVE-2026-109618 ja CVE-2026-109619 asuvad PHP interpretaatoris endas, parandatud versioonides PHP 8.5.12, 8.4.27, 8.3.36 ja 8.2.35. Uuendus on ainus viis neid sulgeda.

Karastamine rakendub ühe taseme võrra hiljem. Kes on kord serveris koodi käivitanud, tahab tavaliselt edasi: käivitada süsteemikäske, laadida tööriistu, rajada püsiv tagauks. Paljud neist sammudest käivad läbi mõne üksiku PHP funktsiooni. Kui need on lukustatud, muutub tee vaevalisemaks ja märgatavamaks.

disable_functions ei ole seetõttu paikade asendaja, vaid üks element juhuks, kui kõigest hoolimata midagi läbi pääseb. See kehtib tulevaste turvaaukude kohta samamoodi nagu PHP2Shelli kohta.

Mida PHP disable_functions annab ja mida mitte

Seade eemaldab nimetatud funktsioonid käitusaegsest keskkonnast. Kui skript kutsub välja lukustatud funktsiooni, katkestab PHP veaga. Lukk kehtib igale koodile, mis selles PHP protsessis töötab, seega ka sissetoodud koodile.

Piire peaksite teadma:

  • Seade ei ole suletud kaitseruum. PHP laiendused, vead interpretaatoris või programmid väljaspool PHP-d võivad seda kõrvale kalduda.
  • See ei takista ründajal faile lugemast ega kirjutamast, millele PHP kasutajal on juurdepääs. Selle eest vastutavad failiõigused ja isolatsioon.
  • See toimib ainult php.ini-st või käsuna php_admin_value. Käsuga ini_set(), failiga .user.ini või .htaccess seda seada ei saa.

Kõige rohkem annab disable_functions koos korraliku php.ini, iga veebisaidi oma kasutajate ja piiravate failiõigustega. Alused on kirjas juhendis php.ini turvaline seadistamine.

Milliseid funktsioone peaksite lukustama

Tüüpiliste veebisaitide jaoks, mis ei vaja süsteemikäske, on end tõestanud järgmine loend. See hõlmab funktsioone protsesside käivitamiseks ja töötavate protsesside juhtimiseks.

Rühm Funktsioonid Tüüpiline legitiimne kasutus
Käskude käivitamine exec, shell_exec, system, passthru Piltide töötlemine, varundamine skriptiga
Protsesside avamine proc_open, popen Composer, PDF-tööriistad, e-kirjade saatmine
Protsesside juhtimine proc_nice, proc_terminate, proc_get_status Järjekorrad, taustatööd
Protsessihaldus pcntl_exec, pcntl_fork enamasti ainult käsureal
Signaalid ja õigused posix_kill, posix_setuid harva veebitöös

Seadistusena näeb see välja nii:

; Veebi töörežiimi php.ini, nt /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

Kui loend ei kehti kõigi serveri veebisaitide kohta, seadke see FPM-i pooli kaupa. Kontrollige pärast uuestilaadimist, milline loend selles poolis tegelikult kehtib:

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

Rakenduse eelkontroll: nii väldite katkestusi

Kes seab loendi kontrollimata, riskib, et piltide vähendamine, PDF-arved või e-kirjade saatmine lakkavad ootamatult töötamast. Otsige seetõttu koodist enne mõjutatud funktsioone:

# Kus ja kui tihti kasutatakse funktsioone koodis?
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

Tabamused ei tähenda automaatselt, et funktsiooni tööl vaja läheb. Paljud teegid kontrollivad esmalt, kas funktsioon on saadaval, ja valivad muidu teise tee. Otsustav on test staging-keskkonnas kõigi oluliste toimingutega: tellimus, arve, vormi saatmine, piltide üleslaadimine, ajastatud ülesanded.

Kui rakendus nõuab ühte neist funktsioonidest kohustuslikult, kontrollige tootja süsteeminõudeid tema ametlikul lehel. Sageli saab ülesande viia eraldi poolile või käsureaskriptile, mis veebi kaudu kättesaadav ei ole.

Seade aktiveerida ja mõju kontrollida

Pärast muudatust peab PHP seadistuse uuesti sisse lugema. Kontrollige seejärel väärtust oma veebisaidi töörežiimis, mitte käsureal:

sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# Kontrollida vealogi lukustatud funktsioonide väljakutsete suhtes
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20

Vealogi teated on väärtuslikud ka hiljem. Kui seal ilmuvad ootamatult lukustatud funktsioonide väljakutsed, kuigi teie rakendus neid ei kasuta, võib see viidata sissetoodud koodile. Kuidas siis edasi tegutseda, kirjeldab juhend Veebishellide tuvastamine ja eemaldamine.

Tüüpilised vead disable_functions kasutamisel

Praktikas ei kuku karastamine harva läbi tehnika, vaid pisiasjade tõttu. Eriti levinud on need vead:

  • Muudetud vale fail: Loend on ainult käsurea php.ini-s, veebisait töötab PHP-FPM-iga ja jääb kaitseta.
  • Taaskäivitus puudub: Fail on õige, kuid töötavad protsessid kasutavad endiselt vana seadistust.
  • Lukustatud liiga laialt: Lukustatakse kaasa funktsioonid nagu ini_set või mail ja olulised toimingud katkevad märkamatult. Vead jäävad siis sageli silma alles päevi hiljem, näiteks tellimuskinnituste puudumisel.
  • Kord seatud, mitte kunagi kontrollitud: Pärast kolimist, PHP versiooni vahetust või hostingupaneeli kaudu uuesti paigaldamist on loend kadunud.
  • Vale turvatunne: Lukku peetakse uuenduste asendajaks. See ei sulge aga ühtegi auku interpretaatoris.

Võtke aktiivse väärtuse kontroll seetõttu oma rutiini pärast iga PHP uuendust. Lühike pilguheit piisab, võtab vähe aega ja takistab, et karastus vaikselt kaotsi läheb.

Näpunäide

Mitme veebisaidi korral ühes serveris: looge igale veebisaidile oma pool oma loendiga. Lisaks piirab open_basedir katalooge, millele PHP-l on juurdepääs.

Kuidas PHP SOS konkreetselt aitab?

  • Kontrollime teie rakenduse koodi ja töövooge kriitiliste funktsioonide kasutuse suhtes.
  • Määrame iga veebisaidi jaoks sobiva lukustusloendi ja testime seda enne tööleminekut.
  • Kombineerime luku poolide, failiõiguste ja logimisega tervikliku karastuskontseptsiooniks.
  • Dokumenteerime seaded ja jälgime vealogi kahtlaste väljakutsete suhtes.

Kuidas see tervikpaketina kulgeb, kirjeldab teenus Serveri karastamine PHP veebiserveritele.

Korduma kippuvad küsimused

Kas disable_functions võib seada käsuga ini_set() või failis .htaccess?

Ei. Seade toimib ainult php.ini-st või käsuna php_admin_value FPM-i poolis või Apache'i seadistuses. Tööajal seda seada ei saa ja rakendus ei saa lukustatud funktsioone ka uuesti vabastada.

Kas disable_functions kaitseb PHP2Shelli eest?

Ei. PHP2Shell puudutab PHP interpretaatorit ennast, turvaauk suletakse ainult uuendusega. Lukustatud funktsioonid võivad aga piirata ründaja tegutsemisruumi pärast edukat ärakasutamist.

Miks näitab php -i teistsugust loendit kui minu veebisait?

Käsurida loeb sageli oma php.ini-d. Veebisaidi jaoks loeb PHP-FPM-i, mod_php või LiteSpeedi seadistus. Kontrollige väärtust seetõttu töörežiimis, mille kaudu teie veebisait töötab.

Millised rakendused vajavad proc_open või exec?

See sõltub rakendusest. Tüüpilised on piltide töötlemine väliste programmide kaudu, PDF-i loomine, e-kirjade saatmine sendmaili kaudu või tööriistad nagu Composer. Kontrollige seda koodis ja tootja süsteeminõuetes.

Allikad

Kohene kontakt

Iga tund loeb. Kirjutage meile kohe.

Kirjeldage lühidalt süsteemi, PHP versiooni ja tähelepanekut. Võtame teiega ühendust, selgitame olukorra välja ja töötame kaugtööna, kuni intsident on lõpetatud ja dokumenteeritud.

Kohene abi