Īsi: php-cgi ir vecākais veids, kā darbināt PHP aiz tīmekļa servera, un joprojām darbojas daudzos serveros, bieži nemanīts. PHP2Shell php-cgi ievainojamība šo darbības režīmu skar skaidri. Ielāpojiet, beidziet visus darbojošos php-cgi procesus un plānojiet pāreju uz PHP-FPM.
Kas ir php-cgi un kur tas vēl darbojas
PHP pastāv vairākās formās: kā komandrindas programma, kā Apache modulis, kā PHP-FPM un kā php-cgi. php-cgi ir programma, ko startē tīmekļa serveris un kurai tas pārsūta pieprasījumus caur CGI vai FastCGI. Bez savas procesu pārvaldības tā ir vienkāršāka nekā PHP-FPM, bet arī sliktāk kontrolējama.
Tipiskas atrašanās vietas ir vecāki hostinga paneļi, Apache ar mod_fcgid, pašu rakstīti apvalka skripti vairākām PHP versijām un PHP sistēmā Windows ar IIS caur FastCGI. Aģentūrās un iestādēs sastopami arī serveri, kas pirms gadiem izveidoti un kopš tā laika tikai darbināti.
php-cgi ievainojamība PHP2Shell gadījumā
PHP2Shell ietver ievainojamības CVE-2026-109618 un CVE-2026-109619 pašā PHP, katru ar CVSS v4.0 9.2. Abas ļauj izpildīt ļaunprātīgu kodu bez autentifikācijas. PHP projekts php-cgi skaidri min starp skartajiem darbības režīmiem līdzās PHP-FPM, mod_php, FrankenPHP un LiteSpeed.
Labotas ir PHP 8.5.12, 8.4.27, 8.3.36 un 8.2.35. PHP 8.1 un vecākām versijām oficiālu atjauninājumu vairs nav, tikai minimāli pirmkoda backporti 7.4, 8.0 un 8.1. Tieši php-cgi iestatījumi darbojas virs vidējā biežuma uz vecām versijām. php-cgi turklāt nav skarts pirmo reizi: jau 2024. gadā ievainojamība php-cgi sistēmā Windows (CVE-2024-4577) izraisīja uzmanību. Šāda veida mantojumam tāpēc jāpievērš īpaša uzmanība.
php-cgi atrašana serverī
Turpmākās komandas tikai lasa un palīdz izsekot php-cgi. Ceļi un moduļu nosaukumi ir piemēri.
# Darbojošies php-cgi procesi ar startēšanas laiku un lietotāju
ps -eo pid,lstart,user,cmd | grep -E 'php-cgi|php[0-9.]*-cgi' | grep -v grep
# Instalētās php-cgi programmas
ls /usr/bin/php*-cgi /usr/lib/cgi-bin/php* 2>/dev/null
# Apache: vai ir ielādēts mod_fcgid vai mod_cgi?
apache2ctl -M 2>/dev/null | grep -Ei 'fcgid|cgi'
grep -RniE 'FcgidWrapper|AddHandler.*php|Action.*php' /etc/apache2 /etc/httpd 2>/dev/null
Ja atrodat FcgidWrapper ierakstus vai handlerus, kas norāda uz php-cgi programmu, šis darbības režīms darbojas. Katrai atrastajai programmai pārbaudiet versiju ar -v. Distributīvu pakotņu gadījumā ielāpu apliecina izmaiņu žurnāls ar CVE numuriem, jo backporti versijas numuru bieži nemaina.
Ielāpošana un visu procesu beigšana
Ieinstalējiet atjauninājumu ar pakotņu pārvaldību vai avotu, no kura nāk php-cgi. Pēc tam visiem darbojošajiem php-cgi procesiem jāpazūd. Ar mod_fcgid Apache procesus kādu laiku patur; pilnīga Apache pārstartēšana tos beidz.
# Pilnībā pārstartēt Apache (Debian/Ubuntu attiecīgi RHEL saime)
systemctl restart apache2 # vai: systemctl restart httpd
# Kontrole: vai vēl ir php-cgi procesi, kas vecāki par atjauninājumu?
ps -eo pid,lstart,cmd | grep -E 'php-cgi' | grep -v grep
Ja php-cgi darbojas ar savu procesu pārvaldnieku vai paneļa pakalpojumu, pārstartējiet to. Sistēmā Windows ar IIS pārstrādājiet lietojumprogrammu pūlus, skatiet PHP sistēmā Windows un IIS.
Ja php-cgi darbojas ar PHP 8.1 vai vecāku publiski sasniedzamā serverī, oficiāla ielāpa nav. Nekavējoties iestatiet pagaidu pasākumus un pēc BSI ieteikuma apsveriet serveri uz laiku atvienot no tīkla.
Pagaidu pasākumi php-cgi gadījumā
php.net iesaka pagaidu pasākumus, kas nesniedz pilnīgu aizsardzību. php-cgi gadījumā vērtībām jābūt php.ini, ko ielādē attiecīgā programma, vai servera konfigurācijā. .user.ini faili un ini_set() attiecībā uz session.upload_progress.enabled saskaņā ar php.net nav pietiekami.
; php-cgi instalācijas php.ini
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
Ja ir augšupielādes funkcija, php.net min post_max_size = 32M. PHP 8.5 gadījumā klāt nāk fatal_error_backtraces=0. Atmiņas ierobežojumus iestatiet ar cgroups tīmekļa servera pakalpojumam, nevis ar RLIMIT_AS vai RLIMIT_DATA. Pēc tam pārstartējiet visus procesus.
Ceļš uz PHP-FPM
Ilgtermiņā php-cgi nav laba izvēle. PHP-FPM piedāvā pūlus katrai vietnei, atsevišķus lietotājus, ierobežojumus katram pūlam, statusa lapas un kontrolētu pārstartēšanu. Pāreja parasti ir labi plānojama: instalēt PHP-FPM, izveidot pūlus, tīmekļa serveri pārslēgt uz FastCGI pie PHP-FPM, noņemt apvalka skriptus. Kā izskatās sakārtota uzbūve, parāda lapa Nginx ar PHP-FPM aizsardzība. Ja papildus darbojas veca PHP versija, savienojiet pāreju ar jaunināšanu.
Līdz pārejai esošo konfigurāciju vajadzētu kritiski pārbaudīt. Tīmekļa serverim php-cgi jānodod tikai faili ar paplašinājumu .php, nevis ceļi, kas norāda uz neesošiem failiem. Augšupielāžu direktorijos PHP izpildei jābūt neiespējamai. Apvalka skriptus, kas katrai vietnei ielādē savu php.ini, pārbaudiet, vai šie faili pagaidu vērtības neatceļ. Ja php-cgi programma atrodas tieši publiski sasniedzamā direktorijā, piemēram, cgi-bin, tā tur jānoņem. Šāds mantojums bieži nāk no iepriekšējo gadu instalēšanas pamācībām un vēlākās pārbūvēs vienkārši tiek aizmirsts. Dokumentējiet katru atradumu ar ceļu un nolūku, lai vēlākā pārbūvē nekas netiktu palaists garām.
Svarīgi paliek: ielāps nenoņem ļaunprātīgu programmatūru, kas tika ievadīta iepriekš. Saglabājiet žurnālus no 2026. gada 20. oktobra.
Kā PHP SOS palīdz konkrēti?
- Mēs izsekojam php-cgi instalācijas, apvalkus un handlerus un piesaistām tos vietnēm.
- Mēs ielāpojam, beidzam visus vecos procesus un dokumentējam stāvokli.
- PHP 8.1 un vecākām versijām mēs kopā ar jums plānojam migrāciju uz atbalstītu PHP versiju.
- Savas servera nostiprināšanas ietvaros mēs php-cgi aizstājam ar PHP-FPM ar atsevišķiem pūliem.
Biežāk uzdotie jautājumi
Vai es izmantoju php-cgi, to nezinot?
Tas notiek biežāk, nekā domā. Vecāki paneļi, FastCGI iestatījumi ar mod_fcgid un PHP sistēmā Windows ar IIS bieži startē PHP kā php-cgi. Procesu saraksts vai Server API phpinfo to uzticami parāda.
Vai FastCGI ir tas pats, kas php-cgi?
Ne gluži. FastCGI ir protokols. Gan PHP-FPM, gan php-cgi var runāt FastCGI, taču php-cgi ir vecāka, vienkāršāka programma bez pūliem un procesu pārvaldības. PHP2Shell php-cgi skar skaidri.
Ko nozīmē klasiskais CGI PHP gadījumā?
Klasiskā CGI gadījumā tīmekļa serveris katram pieprasījumam startē jaunu PHP procesu. Tas ir lēni un mūsdienās reti. Biežāk php-cgi ir aiz mod_fcgid vai FastCGI, kur procesi apstrādā vairākus pieprasījumus.
Vai pēc atjauninājuma kaut kas jāpārstartē?
Jā. FastCGI iestatījumos php-cgi procesi kādu laiku turpina darboties. Pārstartējiet tīmekļa serveri attiecīgi procesu pārvaldnieku un pārbaudiet, ka neviens php-cgi process nav vecāks par atjauninājumu.