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äsugaini_set(), failiga.user.inivõi.htaccessseda 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_setvõimailja 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.
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.