Lyhyesti: php-cgi on vanhin tapa ajaa PHP:tä verkkopalvelimen takana, ja se pyörii yhä monilla palvelimilla, usein huomaamatta. PHP2Shellin php-cgi-haavoittuvuus koskee nimenomaisesti tätä toimintatapaa. Korjaa, lopeta kaikki käynnissä olevat php-cgi-prosessit ja suunnittele siirtymä PHP-FPM:ään.
Mikä php-cgi on ja missä se yhä pyörii
PHP:stä on useita muunnelmia: komentoriviohjelmana, Apache-moduulina, PHP-FPM:nä ja php-cgi:nä. php-cgi on ohjelma, jonka verkkopalvelin käynnistää ja jolle se välittää pyynnöt CGI:n tai FastCGI:n kautta. Ilman omaa prosessinhallintaa se on yksinkertaisempi kuin PHP-FPM, mutta myös huonommin hallittava.
Tyypillisiä löytöpaikkoja ovat vanhemmat hosting-paneelit, Apache mod_fcgid:llä, omat wrapper-skriptit useille PHP-versioille ja PHP Windowsissa IIS:n kanssa FastCGI:n kautta. Toimistoista ja viranomaisilta löytyy lisäksi palvelimia, jotka on perustettu vuosia sitten ja joita on sen jälkeen vain käytetty.
php-cgi-haavoittuvuus PHP2Shellissä
PHP2Shell koostuu haavoittuvuuksista CVE-2026-109618 ja CVE-2026-109619 itse PHP:ssä, kumpikin arvioitu CVSS v4.0 -pisteillä 9.2. Molemmat sallivat haittakoodin suorittamisen ilman kirjautumista. PHP-projekti mainitsee php-cgi:n nimenomaisesti koskeneiden toimintatapojen joukossa PHP-FPM:n, mod_php:n, FrankenPHP:n ja LiteSpeedin rinnalla.
Korjatut versiot ovat PHP 8.5.12, 8.4.27, 8.3.36 ja 8.2.35. PHP 8.1:lle ja sitä vanhemmille ei ole enää virallisia päivityksiä, vain vähäisiä lähdekoodin backporteja versioille 7.4, 8.0 ja 8.1. Juuri php-cgi-ympäristöt pyörivät keskimääräistä useammin vanhoilla versioilla. Lisäksi php-cgi ei ole ensimmäistä kertaa kohteena: jo vuonna 2024 php-cgi:n haavoittuvuus Windowsissa (CVE-2024-4577) herätti huomiota. Tämänkaltaiset perinnöt ansaitsevat siksi erityistä huomiota.
Etsi php-cgi palvelimelta
Seuraavat komennot vain lukevat ja auttavat jäljittämään php-cgi:n. Polut ja moduulien nimet ovat esimerkkejä.
# Käynnissä olevat php-cgi-prosessit käynnistysaikoineen ja käyttäjineen
ps -eo pid,lstart,user,cmd | grep -E 'php-cgi|php[0-9.]*-cgi' | grep -v grep
# Asennetut php-cgi-ohjelmat
ls /usr/bin/php*-cgi /usr/lib/cgi-bin/php* 2>/dev/null
# Apache: onko mod_fcgid tai mod_cgi ladattu?
apache2ctl -M 2>/dev/null | grep -Ei 'fcgid|cgi'
grep -RniE 'FcgidWrapper|AddHandler.*php|Action.*php' /etc/apache2 /etc/httpd 2>/dev/null
Jos löydät FcgidWrapper-merkintöjä tai käsittelijöitä, jotka osoittavat php-cgi-ohjelmaan, tämä toimintatapa on käytössä. Tarkista jokaisen löydetyn ohjelman versio komennolla -v. Jakelupaketeissa korjauksen todistaa muutosloki CVE-numeroineen, koska backportit eivät usein muuta versionumeroa.
Korjaa ja lopeta kaikki prosessit
Asenna päivitys paketinhallinnan tai sen lähteen kautta, josta php-cgi tulee. Sen jälkeen kaikkien käynnissä olevien php-cgi-prosessien on kadottava. mod_fcgid:n kanssa Apache pitää prosesseja jonkin aikaa varalla; Apachen täysi uudelleenkäynnistys lopettaa ne.
# Käynnistä Apache kokonaan uudelleen (Debian/Ubuntu tai RHEL-perhe)
systemctl restart apache2 # tai: systemctl restart httpd
# Tarkistus: onko vielä päivitystä vanhempia php-cgi-prosesseja?
ps -eo pid,lstart,cmd | grep -E 'php-cgi' | grep -v grep
Jos php-cgi toimii oman prosessinhallinnan tai paneelin palvelun kautta, käynnistä se uudelleen. Windowsissa IIS:n kanssa kierrätä sovelluspoolit, katso PHP Windowsissa ja IIS:ssä.
Jos php-cgi pyörii PHP 8.1:llä tai vanhemmalla julkisesti tavoitettavalla palvelimella, virallinen korjaus puuttuu. Aseta heti väliaikaiset toimenpiteet ja harkitse BSI:n suosituksen mukaan palvelimen ottamista tilapäisesti pois verkosta.
Väliaikaiset toimenpiteet php-cgi:n kohdalla
php.net suosittelee väliaikaisia toimenpiteitä, jotka eivät tarjoa täydellistä suojaa. php-cgi:n kohdalla arvot kuuluvat php.ini-tiedostoon, jonka kyseinen ohjelma lataa, tai palvelinkonfiguraatioon. .user.ini-tiedostot ja ini_set() eivät php.net:n mukaan riitä asetukselle session.upload_progress.enabled.
; php-cgi-asennuksen php.ini
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
Latausominaisuuden kanssa php.net mainitsee arvon post_max_size = 32M. PHP 8.5:ssä lisätään fatal_error_backtraces=0. Muistirajat asetat cgroupien kautta verkkopalvelinpalvelulle, et RLIMIT_AS- tai RLIMIT_DATA-asetuksilla. Sen jälkeen kaikki prosessit käynnistetään uudelleen.
Tie PHP-FPM:ään
Pitkällä aikavälillä php-cgi ei ole hyvä valinta. PHP-FPM tarjoaa poolit verkkosivustoa kohden, omat käyttäjät, poolikohtaiset rajat, tilasivut ja hallitut uudelleenkäynnistykset. Siirtymä on yleensä hyvin suunniteltavissa: asenna PHP-FPM, luo poolit, vaihda verkkopalvelin käyttämään FastCGI:tä PHP-FPM:lle, poista wrapper-skriptit. Siistin rakenteen näyttää Nginx ja PHP-FPM turvalliseksi. Jos lisäksi pyörii vanha PHP-versio, yhdistä vaihto päivitykseen.
Siihen asti, kunnes siirtymä on tehty, kannattaa tarkistaa nykyinen konfiguraatio kriittisesti. Verkkopalvelimen tulisi välittää php-cgi:lle vain tiedostoja, joiden pääte on .php, eikä polkuja, jotka osoittavat olemattomiin tiedostoihin. Latauskansioissa PHP:n suoritus ei saa olla mahdollista. Wrapper-skriptit, jotka lataavat jokaiselle verkkosivustolle oman php.ini-tiedoston, kannattaa tarkistaa sen varalta, kumoavatko nämä tiedostot väliaikaiset arvot. Jos php-cgi-ohjelma sijaitsee suoraan julkisesti tavoitettavassa hakemistossa, kuten cgi-bin, se pitää poistaa sieltä. Tällaiset perinnöt ovat usein peräisin menneiden vuosien asennusohjeista ja unohtuvat myöhemmissä muutoksissa yksinkertaisesti. Dokumentoi jokainen löytö polkuineen ja käyttötarkoituksineen, jotta myöhempi uudistus ei jätä mitään huomiotta.
Tärkeää on edelleen: korjaus ei poista haittaohjelmaa, joka on asennettu aiemmin. Säilytä lokit 20.10.2026 alkaen.
Miten PHP SOS auttaa konkreettisesti?
- Jäljitämme php-cgi-asennukset, wrapperit ja käsittelijät ja yhdistämme ne verkkosivustoihin.
- Korjaamme, lopetamme kaikki vanhat prosessit ja dokumentoimme tilan.
- PHP 8.1:lle ja sitä vanhemmille suunnittelemme kanssanne siirtymän tuettuun PHP-versioon.
- Palvelimen koventamisen puitteissa korvaamme php-cgi:n PHP-FPM:llä ja erillisillä pooleilla.
Usein kysytyt kysymykset
Käytänkö php-cgi:tä tietämättäni?
Se on yleisempää kuin luulisi. Vanhemmat paneelit, FastCGI-ympäristöt mod_fcgid:llä ja PHP Windowsissa IIS:n kanssa käynnistävät PHP:n usein php-cgi:nä. Prosessiluettelo tai phpinfon Server API näyttää sen luotettavasti.
Onko FastCGI sama asia kuin php-cgi?
Ei aivan. FastCGI on protokolla. PHP-FPM ja php-cgi voivat molemmat puhua FastCGI:tä, mutta php-cgi on vanhempi, yksinkertaisempi ohjelma ilman poolia ja prosessinhallintaa. PHP2Shell koskee nimenomaisesti php-cgi:tä.
Mitä klassinen CGI tarkoittaa PHP:n kohdalla?
Klassisessa CGI:ssä verkkopalvelin käynnistää jokaiselle pyynnölle uuden PHP-prosessin. Se on hidasta ja nykyään harvinaista. Yleisempi on php-cgi mod_fcgid:n tai FastCGI:n takana, missä prosessit käsittelevät useita pyyntöjä.
Pitääkö päivityksen jälkeen käynnistää jotain uudelleen?
Kyllä. FastCGI-ympäristöissä php-cgi-prosessit jatkavat toimintaansa jonkin aikaa. Käynnistä verkkopalvelin tai prosessinhallinta uudelleen ja varmista, ettei mikään php-cgi-prosessi ole päivitystä vanhempi.