Ajankohtainen tilanne: PHP2Shell. Kaksi kriittistä PHP-haavoittuvuutta (CVSS 9.2) sallii haittakoodin suorittamisen ilman kirjautumista. Korjaukset 21.10.2026 alkaen.Mitä nyt on tehtävä →

PHP-perustiedot ylläpitäjille

Mitä ylläpitäjän on tiedettävä PHP:stä: mitkä binäärit ovat käynnissä, miten konfiguraatio vaikuttaa, miten FPM-poolit toimivat ja mitkä komennot auttavat PHP2Shellin kaltaisissa päivityksissä.

Tilanne Lukuaika 4 minPHP-tietoa

Lyhyesti: Ylläpitäjälle ilman kehittäjätaustaa viisi perusasiaa riittää PHP:n turvalliseen käyttöön: PHP koostuu useista ohjelmista (komentorivi, PHP-FPM, Apache-moduuli), joilla kullakin on oma versionsa; asetukset vaikuttavat tasoittain php.ini-tiedostosta sovellukseen; PHP-FPM jakaa pyynnöt workereille pooleissa; päivitys tehoaa vasta kaikkien prosessien uudelleenkäynnistyksen jälkeen; ja lokit ovat tärkein vihje, kun jokin ei ole kunnossa. Kun nämä asiat tuntee, PHP2Shellin kaltaiset aukot voi sulkea nopeasti ja todennettavasti.

Mistä PHP koostuu palvelimella

PHP ei ole yksittäinen ohjelma. Tyypillisellä Linux-palvelimella on useita variantteja, jotka kytketään palvelinrajapinnan (SAPI) kautta:

Variantti Tyypillinen nimi Mihin
Komentorivi (CLI) php, php8.3 cron-työt, Composer, huoltokomentosarjat
PHP-FPM php-fpm, php-fpm8.3 verkkopyynnöt Nginxin tai Apachen takana
Apache-moduuli mod_php, libphp verkkopyynnöt suoraan Apachen prosessissa
CGI php-cgi vanhemmat rakenteet

Jokaisella variantilla voi olla eri versio ja eri php.ini. Monilla palvelimilla on lisäksi käynnissä useita PHP-versioita rinnakkain, esimerkiksi 8.2 ja 8.4. Päivityksessä jokainen on käsiteltävä erikseen. Miten rajapinnat toimivat, selittää PHP-FPM selitettynä.

Mitä varianttia verkkosivustonne todella palvelee, selviää käynnissä olevista prosesseista ja verkkopalvelimen konfiguraatiosta:

ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php     # lataako Apache PHP-moduulin?
ls /run/php/ 2>/dev/null                    # FPM-socketit, usein versiota ja poolia kohti

Käynnistysajan sarake on myöhemmin uudelleenkäynnistyksessä tärkeä: kaikki PHP-prosessit on käynnistettävä päivityksen ajankohdan jälkeen. Jos prosessit toimivat eri käyttäjinä, se viittaa erillisiin pooleihin, mikä on hyvä. Jos Apachessa näkyy PHP-moduuli, vaikka kaikkien verkkosivustojen pitäisi toimia FPM:n kautta, se viittaa vanhaan jäänteeseen, joka kuuluu poistaa. Hosting-käyttöliittymissä kuten Plesk tai cPanel pätee sama periaate, paitsi että käyttöliittymä näyttää versiot ja käsittelijät verkkosivustoittain; ratkaisevaa on kuitenkin se, mikä todella on käynnissä prosessina.

Ylläpitäjän tärkeimmät komennot

php -v                    # komentorivin versio
php --ini                 # ladattu php.ini ja lisäksi luetut hakemistot
php --ini=diff            # versiosta PHP 8.5 lähtien: poikkeamat oletuksesta
php -m                    # kootut ja ladatut moduulit
php --ri session          # laajennuksen asetukset
php -l datei.php          # syntaksin tarkistus suorittamatta
php-fpm8.3 -v             # FPM-binäärin versio (nimi vaihtelee jakelun mukaan)
php-fpm8.3 -t             # testaa FPM-konfiguraatio käynnistämättä uudelleen
systemctl status php8.3-fpm

Kaksi huomautusta käsikirjasta: php -l löytää syntaksivirheitä mutta ei virheitä, jotka ilmenevät vasta suorituksessa. Ja php -i kutsuu funktiota phpinfo(); tuloste ei kuulu julkisiin tiedostoihin verkkohakemistossa.

Miten PHP:n asetukset vaikuttavat

Asetus voidaan määrittää useassa paikassa. Kuka saa muuttaa mitä missä, säätelee kunkin direktiivin muutostila:

  1. php.ini ja conf.d: variantin perusasetukset, luetaan käynnistyksessä.
  2. FPM-pooli: php_value ja php_admin_value poolia kohti. Käsikirjan mukaan sovellus ei voi ylikirjoittaa php_admin_value-direktiivillä asetettuja arvoja funktiolla ini_set().
  3. Hakemistotaso: .user.ini FPM:llä tai .htaccess mod_php:llä, vain direktiiveille tilassa INI_PERDIR tai INI_ALL.
  4. Sovellus: ini_set() ajon aikana, vain direktiiveille tilassa INI_ALL.

Esimerkki: memory_limit on tilassa INI_ALL, joten sovellus voi muuttaa sitä. post_max_size on tilassa INI_PERDIR, eikä sitä voi muuttaa funktiolla ini_set(). Siksi php.net vaatii PHP2Shellin väliaikaisissa toimenpiteissä asettamaan arvot niin, etteivät sovellukset voi ylikirjoittaa niitä. Tasojen yksityiskohdat selittää php.ini selitettynä.

PHP-FPM-poolit lyhyesti

Pooli on joukko workereita, joilla on oma käyttäjä, oma socket ja omat asetukset. Tärkeimmät direktiivit käsikirjan mukaan:

[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic                 ; static, dynamic tai ondemand
pm.max_children = 20         ; enintään 20 samanaikaista pyyntöä
pm.max_requests = 500        ; uusi worker 500 pyynnön jälkeen
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/shop-slow.log
php_admin_value[error_log] = /var/log/php-fpm/shop-error.log
php_admin_flag[log_errors] = on

Oma pooli verkkosivustoa kohti omalla käyttäjällä erottaa sivustot toisistaan. security.limit_extensions on oletuksena .php .phar ja estää FPM:ää suorittamasta muita tiedostopäätteitä kuin PHP:tä. clear_env on oletuksena päällä ja pitää ympäristömuuttujat poissa workerilta.

Lokit: mihin ylläpitäjän kannattaa katsoa

PHP kirjoittaa virheet asetuksella error_log määritettyyn kohteeseen, PHP-FPM lisäksi omaan lokiinsa ja hitaat pyynnöt slowlogiin backtracen kanssa. Lisäksi tulevat verkkopalvelimen käyttö- ja virhelokit. Huolehtikaa siitä, että display_errors on tuotannossa pois päältä ja log_errors päällä: virheet kuuluvat lokiin, ei verkkosivulle. Lokit pitäisi lisäksi kierrättää ja säilyttää määrätyn ajan, jotta ne ovat vielä olemassa hätätilanteessa. PHP2Shellin jälkeen ammattilehdistö suosittelee säilyttämään palvelinlokit 20.10.2026 alkaen. Vahva varoitusmerkki on PHP-FPM- tai verkkopalvelinprosessi, joka käynnistää komentotulkin; miten sen tunnistaa, kerrotaan kohdassa Varoitusmerkki: verkkopalvelin käynnistää komentotulkin.

Ylläpitäjän tarkistuslista PHP2Shellin jälkeen

  1. Luettele kaikki PHP-variantit ja -versiot palvelimella, myös käyttämättömät.
  2. Tarkista pakettitilanne; jakelun takaisinporttauksissa käy muutosloki läpi hakusanoilla CVE-2026-109618 ja CVE-2026-109619.
  3. Päivitä versioon 8.5.12, 8.4.27, 8.3.36 tai 8.2.35 tai vahvistettuun takaisinporttaukseen.
  4. Käynnistä PHP-FPM, Apache ja LiteSpeed uudelleen ja tarkista prosessien käynnistysajat.
  5. Vastakoe komennolla php -r 'var_dump(ini_get("memory_hard_limit_percent"));'; bool(false) tarkoittaa käsikirjan mukaan haavoittuvaa versiota.
  6. Turvaa lokit ja tarkista ne poikkeamien varalta.

Miten version ja korjaustilan voi todistaa luotettavasti, kuvaa PHP-version ja korjaustilan oikea tarkistus.

Miten PHP SOS auttaa konkreettisesti?

Tietoturvahuoltosopimuksessa hoidamme PHP:n perushuollon yhdessä tiiminne kanssa:

  • Inventaario: kaikki PHP-variantit, versiot, poolit ja konfiguraatiopaikat palvelinta kohti.
  • Konfiguraatio: tietoturvan kannalta olennaiset arvot asetettu php_admin_value-direktiivillä, poolit eroteltu verkkosivustoittain.
  • Päivitykset: asennus, uudelleenkäynnistys, tarkistus ja dokumentointi jokaisen tietoturvajulkaisun yhteydessä.
  • Tiedon välitys: Kerromme ylläpitäjillenne, mitä olemme muuttaneet ja miksi.

Usein kysytyt kysymykset

Miksi php -v näyttää eri version kuin verkkosivusto?

Komentorivi, PHP-FPM ja Apache-moduuli ovat erillisiä ohjelmia, joilla on oma versionsa ja oma php.ini-tiedostonsa. php -v näyttää vain komentorivin. Verkkosivuston kannalta ratkaisee sen binäärin versio, joka todella käsittelee pyyntöjä.

Mikä php.ini on palvelimellani voimassa?

Sen näyttää php --ini komentoriville. PHP-FPM:llä on yleensä oma php.ini ja lisäksi pooli-tiedostoja. Versiosta PHP 8.5 lähtien php --ini=diff näyttää, mitkä arvot poikkeavat oletuksesta.

Mikä on ero php_value- ja php_admin_value-direktiivien välillä?

Molemmat asettavat asetuksia FPM-poolissa. Käsikirjan mukaan sovellus ei voi ylikirjoittaa php_admin_value-direktiivillä asetettuja arvoja funktiolla ini_set(). Tietoturvan kannalta olennaisille asetuksille php_admin_value on siksi oikea valinta.

Riittääkö päivitys ilman uudelleenkäynnistystä?

Ei riitä. Käynnissä olevat PHP-prosessit pitävät vanhan koodin muistissa. Päivityksen jälkeen PHP-FPM, Apache mod_php:n kanssa tai LiteSpeed on käynnistettävä uudelleen, muuten haavoittuva versio jatkaa toimintaansa.

Lähteet

Pikayhteys

Jokainen tunti on tärkeä. Kirjoittakaa meille nyt.

Kuvatkaa lyhyesti järjestelmä, PHP-versio ja havainnot. Otamme yhteyttä, selvitämme tilanteen ja työskentelemme etänä, kunnes tapaus on käsitelty loppuun ja dokumentoitu.

Pikaapu