Lyhyesti: PHP:n disable_functions-asetuksella estätte funktiot, joilla PHP suorittaa järjestelmäkomentoja, kuten exec, shell_exec tai proc_open. Se vaikeuttaa hyökkääjän seuraavaa askelta murron jälkeen. Asetus toimii vain php.ini-tiedostosta tai FPM-poolista, sen on sovittava sovellukseen, eikä se korvaa päivitystä.
Miksi disable_functions on järkevä juuri nyt
PHP2Shellissä on kyse haittakoodin suorittamisesta etänä ilman kirjautumista. Molemmat haavoittuvuudet, CVE-2026-109618 ja CVE-2026-109619, ovat itse PHP-tulkissa, ja ne on korjattu versioissa PHP 8.5.12, 8.4.27, 8.3.36 ja 8.2.35. Päivitys on ainoa tapa sulkea ne.
Koventaminen vaikuttaa yhtä tasoa myöhemmin. Joka kerran pystyy suorittamaan koodia palvelimella, haluaa yleensä jatkaa: käynnistää järjestelmäkomentoja, ladata työkaluja, perustaa pysyvän takaoven. Moni näistä vaiheista kulkee muutaman PHP-funktion kautta. Jos ne on estetty, tie käy vaivalloisemmaksi ja huomattavammaksi.
disable_functions ei siis korvaa korjauksia vaan on yksi rakennuspalikka siltä varalta, että kaikesta varovaisuudesta huolimatta jotain pääsee läpi. Tämä pätee tuleviin haavoittuvuuksiin yhtä lailla kuin PHP2Shelliin.
Mitä PHP:n disable_functions tekee ja mitä ei
Asetus poistaa mainitut funktiot ajoympäristöstä. Jos komentosarja kutsuu estettyä funktiota, PHP keskeyttää virheeseen. Esto koskee kaikkea koodia, joka suoritetaan kyseisessä PHP-prosessissa, siis myös lisättyä koodia.
Rajat kannattaa tuntea:
- Asetus ei ole umpinainen suojatila. PHP-laajennukset, tulkin virheet tai PHP:n ulkopuoliset ohjelmat voivat kiertää sen.
- Se ei estä hyökkääjää lukemasta tai kirjoittamasta tiedostoja, joihin PHP-käyttäjällä on pääsy. Siitä huolehtivat tiedosto-oikeudet ja eristys.
- Se toimii vain php.ini-tiedostosta tai
php_admin_value-asetuksena.ini_set()-komennolla,.user.ini-tiedostolla tai.htaccess-tiedostolla sitä ei voi asettaa.
disable_functions tuottaa eniten hyötyä yhdessä siistin php.ini-tiedoston, sivustokohtaisten käyttäjien ja rajoittavien tiedosto-oikeuksien kanssa. Perusteet löytyvät oppaasta php.ini turvallisesti.
Mitkä funktiot kannattaa estää
Tyypillisille verkkosivustoille, jotka eivät tarvitse järjestelmäkomentoja, seuraava luettelo on osoittautunut toimivaksi. Se kattaa prosessien käynnistämiseen ja käynnissä olevien prosessien ohjaamiseen tarkoitetut funktiot.
| Ryhmä | Funktiot | Tyypillinen laillinen käyttö |
|---|---|---|
| Komentojen suoritus | exec, shell_exec, system, passthru |
Kuvankäsittely, varmuuskopiot komentosarjalla |
| Prosessien avaaminen | proc_open, popen |
Composer, PDF-työkalut, sähköpostin lähetys |
| Prosessien ohjaus | proc_nice, proc_terminate, proc_get_status |
Jonot, taustatyöt |
| Prosessien hallinta | pcntl_exec, pcntl_fork |
yleensä vain komentorivillä |
| Signaalit ja oikeudet | posix_kill, posix_setuid |
harvoin verkkokäytössä |
Asetuksina se näyttää tältä:
; verkon ajotavan php.ini, esim. /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
Jos luettelo ei päde kaikille palvelimen verkkosivustoille, asettakaa se FPM-poolia kohden. Tarkistakaa uudelleenlatauksen jälkeen, mikä luettelo kyseisessä poolissa todella on voimassa:
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (ote)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen
Tarkistakaa sovellus ensin: näin vältätte katkokset
Joka asettaa luettelon tarkistamatta, ottaa riskin, että kuvien pienennys, PDF-laskut tai sähköpostin lähetys lakkaavat yhtäkkiä toimimasta. Etsikää siksi ensin koodista kyseiset funktiot:
# Missä ja kuinka usein funktioita käytetään koodissa?
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
Osumat eivät automaattisesti tarkoita, että funktiota tarvitaan käytössä. Monet kirjastot tarkistavat ensin, onko funktio saatavilla, ja väistävät muuten. Ratkaisevaa on testi staging-ympäristössä kaikilla tärkeillä toiminnoilla: tilaus, lasku, lomakkeen lähetys, kuvan lataus, ajastetut tehtävät.
Jos sovellus vaatii välttämättä jonkin näistä funktioista, tarkistakaa valmistajan järjestelmävaatimukset sen virallisilta sivuilta. Usein tehtävän voi siirtää erilliseen pooliin tai komentorivin komentosarjaan, johon ei pääse verkon kautta.
Asetuksen käyttöönotto ja vaikutuksen tarkistus
Muutoksen jälkeen PHP:n on luettava asetukset uudelleen. Tarkistakaa sen jälkeen arvo verkkosivustonne ajotavassa, ei komentorivillä:
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# Tarkista virheloki estettyjen funktioiden kutsujen varalta
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20
Virhelokin ilmoitukset ovat arvokkaita myöhemminkin. Jos siellä yhtäkkiä näkyy estettyjen funktioiden kutsuja, vaikka sovelluksenne ei käytä niitä, se voi viitata lisättyyn koodiin. Miten silloin edetään, kuvaa opas Web shellien tunnistaminen ja poistaminen.
Tyypilliset virheet disable_functions-asetuksen käytössä
Käytännössä koventaminen kaatuu harvoin tekniikkaan vaan pikkuasioihin. Nämä virheet ovat erityisen yleisiä:
- Muutettu väärää tiedostoa: Luettelo on vain komentorivin php.ini-tiedostossa, verkkosivusto toimii PHP-FPM:n kautta ja jää suojaamatta.
- Ei uudelleenkäynnistystä: Tiedosto on oikein, mutta käynnissä olevat prosessit käyttävät yhä vanhoja asetuksia.
- Liian laaja esto: Funktioita kuten
ini_settaimailestetään mukana, ja tärkeät toiminnot katkeavat huomaamatta. Virheet huomataan usein vasta päivien kuluttua, esimerkiksi tilausvahvistusten jäädessä saapumatta. - Kerran asetettu, ei koskaan tarkistettu: Muuton, PHP-version vaihdon tai hosting-paneelin kautta tehdyn uudelleenasennuksen jälkeen luettelo on kadonnut.
- Väärä turvallisuuden tunne: Esto käsitetään päivitysten korvaajaksi. Se ei kuitenkaan sulje aukkoa tulkissa.
Ottakaa siksi aktiivisen arvon tarkistus osaksi rutiiniänne jokaisen PHP-päivityksen jälkeen. Lyhyt silmäys riittää, vie vähän aikaa ja estää koventamisen katoamisen äänettömästi.
Jos samalla palvelimella on useita verkkosivustoja: luokaa jokaiselle oma pooli ja oma luettelo. Lisäksi open_basedir rajoittaa hakemistoja, joihin PHP saa päästä.
Miten PHP SOS auttaa konkreettisesti?
- Tarkistamme sovelluksenne koodin ja toiminnot kriittisten funktioiden käytön osalta.
- Määrittelemme kullekin verkkosivustolle sopivan estoluettelon ja testaamme sen ennen tuotantoon siirtoa.
- Yhdistämme eston pooleihin, tiedosto-oikeuksiin ja lokitukseen yhtenäiseksi koventamiskonseptiksi.
- Dokumentoimme asetukset ja valvomme virhelokia poikkeavien kutsujen varalta.
Miten tämä etenee kokonaispakettina, kuvaa palvelu PHP-verkkopalvelimen koventaminen.
Usein kysytyt kysymykset
Voinko asettaa disable_functions-asetuksen ini_set()-komennolla tai .htaccess-tiedostossa?
Ei. Asetus toimii vain php.ini-tiedostosta tai php_admin_value-asetuksena FPM-poolissa tai Apachen asetuksissa. Ajon aikana sitä ei voi asettaa, eikä sovellus voi myöskään vapauttaa estettyjä funktioita.
Suojaako disable_functions PHP2Shellilta?
Ei. PHP2Shell koskee itse PHP-tulkkia, ja aukko suljetaan vain päivityksellä. Estetyt funktiot voivat kuitenkin rajoittaa hyökkääjän liikkumatilaa onnistuneen hyväksikäytön jälkeen.
Miksi php -i näyttää eri luettelon kuin verkkosivustoni?
Komentorivi lukee usein oman php.ini-tiedostonsa. Verkkosivuston kannalta ratkaisevat PHP-FPM:n, mod_php:n tai LiteSpeedin asetukset. Tarkistakaa arvo siksi siinä ajotavassa, jolla verkkosivustonne toimii.
Mitkä sovellukset tarvitsevat proc_open- tai exec-funktiota?
Se riippuu sovelluksesta. Tyypillisiä ovat kuvankäsittely ulkoisilla ohjelmilla, PDF-tiedostojen luonti, sähköpostin lähetys sendmailin kautta tai työkalut kuten Composer. Tarkistakaa asia koodista ja valmistajan järjestelmävaatimuksista.