Stručně: php-cgi je nejstarší způsob provozu PHP za webovým serverem a dosud běží na mnoha serverech, často bez povšimnutí. Zranitelnost php-cgi z PHP2Shell se tohoto provozního režimu výslovně týká. Zazáplatujte, ukončete všechny běžící procesy php-cgi a naplánujte přechod na PHP-FPM.
Co je php-cgi a kde ještě běží
PHP existuje v několika variantách: jako program pro příkazovou řádku, jako modul Apache, jako PHP-FPM a jako php-cgi. php-cgi je program, který webový server spouští a předává mu požadavky přes CGI nebo FastCGI. Bez vlastní správy procesů je jednodušší než PHP-FPM, ale také hůře ovladatelný.
Typickými místy nálezu jsou starší hostingové panely, Apache s mod_fcgid, vlastní wrapper skripty pro více verzí PHP a PHP ve Windows s IIS přes FastCGI. V agenturách a úřadech se navíc najdou servery, které byly před lety zřízeny a od té doby se jen provozují.
Zranitelnost php-cgi u PHP2Shell
PHP2Shell zahrnuje zranitelnosti CVE-2026-109618 a CVE-2026-109619 v samotném PHP, každou s CVSS v4.0 9,2. Obě umožňují spuštění škodlivého kódu bez přihlášení. Projekt PHP uvádí php-cgi výslovně mezi postiženými provozními režimy, vedle PHP-FPM, mod_php, FrankenPHP a LiteSpeed.
Opraveny jsou PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35. Pro PHP 8.1 a starší už oficiální aktualizace neexistují, jen minimální backporty ve zdrojovém kódu pro 7.4, 8.0 a 8.1. Právě nastavení s php-cgi běží nadprůměrně často na starých verzích. php-cgi navíc není postiženo poprvé: už v roce 2024 způsobila rozruch zranitelnost v php-cgi ve Windows (CVE-2024-4577). Takové zastaralé záležitosti proto zasluhují zvláštní pozornost.
Najít php-cgi na serveru
Následující příkazy jen čtou a pomáhají php-cgi vypátrat. Cesty a názvy modulů jsou příklady.
# Běžící procesy php-cgi s časem spuštění a uživatelem
ps -eo pid,lstart,user,cmd | grep -E 'php-cgi|php[0-9.]*-cgi' | grep -v grep
# Nainstalované programy php-cgi
ls /usr/bin/php*-cgi /usr/lib/cgi-bin/php* 2>/dev/null
# Apache: je načten mod_fcgid nebo 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
Pokud najdete záznamy FcgidWrapper nebo handlery ukazující na program php-cgi, tento provozní režim běží. U každého nalezeného programu zkontrolujte verzi pomocí -v. U balíčků distribucí dokládá záplatu changelog s čísly CVE, protože backporty číslo verze často nemění.
Zazáplatovat a ukončit všechny procesy
Aktualizaci nasaďte přes správu balíčků nebo zdroj, ze kterého php-cgi pochází. Poté musí všechny běžící procesy php-cgi zmizet. U mod_fcgid drží Apache procesy nějakou dobu v zásobě; úplný restart Apache je ukončí.
# Úplně restartovat Apache (Debian/Ubuntu, resp. rodina RHEL)
systemctl restart apache2 # nebo: systemctl restart httpd
# Kontrola: existují ještě procesy php-cgi starší než aktualizace?
ps -eo pid,lstart,cmd | grep -E 'php-cgi' | grep -v grep
Pokud php-cgi běží přes vlastního správce procesů nebo službu panelu, restartujte ho. Ve Windows s IIS recyklujte aplikační pooly, viz PHP ve Windows a IIS.
Pokud php-cgi běží s PHP 8.1 nebo starším na veřejně dostupném serveru, oficiální záplata chybí. Okamžitě nastavte přechodná opatření a podle doporučení BSI (německý Spolkový úřad pro informační bezpečnost) zvažte dočasné odpojení serveru od sítě.
Přechodná opatření u php-cgi
php.net doporučuje přechodná opatření, která neposkytují úplnou ochranu. U php-cgi patří hodnoty do php.ini, kterou příslušný program načítá, nebo do konfigurace serveru. Soubory .user.ini a ini_set() pro session.upload_progress.enabled podle php.net nestačí.
; php.ini instalace php-cgi
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
S funkcí nahrávání souborů uvádí php.net post_max_size = 32M. Na PHP 8.5 přibývá fatal_error_backtraces=0. Limity paměti nastavte přes cgroups pro službu webového serveru, nikoli přes RLIMIT_AS nebo RLIMIT_DATA. Poté restartujte všechny procesy.
Cesta k PHP-FPM
Dlouhodobě není php-cgi dobrou volbou. PHP-FPM nabízí pooly pro každý web, vlastní uživatele, hranice pro každý pool, stavové stránky a řízené restarty. Přechod je většinou dobře naplánovatelný: nainstalovat PHP-FPM, založit pooly, přepnout webový server na FastCGI do PHP-FPM, odstranit wrapper skripty. Jak vypadá čistá architektura, ukazuje stránka Zabezpečení Nginx s PHP-FPM. Pokud navíc běží stará verze PHP, spojte přechod s upgradem.
Dokud k přechodu nedojde, měli byste stávající konfiguraci kriticky zkontrolovat. Webový server by měl php-cgi předávat jen soubory s příponou .php a žádné cesty, které ukazují na neexistující soubory. V adresářích pro nahrávání nesmí být možné spouštění PHP. U wrapper skriptů, které pro každý web načítají vlastní php.ini, zkontrolujte, zda tyto soubory přechodné hodnoty znovu neruší. Pokud leží program php-cgi přímo ve veřejně dostupném adresáři jako cgi-bin, patří odtud odstranit. Takové zastaralé záležitosti pocházejí často z instalačních návodů minulých let a při pozdějších úpravách se prostě zapomenou. Každý nález zdokumentujte s cestou a účelem, aby pozdější přestavba nic nepřehlédla.
Důležité zůstává: záplata neodstraní škodlivý software zavlečený dříve. Uchovejte logy od 20. 10. 2026.
Jak konkrétně pomáhá PHP SOS?
- Vypátráme instalace php-cgi, wrappery a handlery a přiřadíme je k webům.
- Zazáplatujeme, ukončíme všechny staré procesy a stav zdokumentujeme.
- Pro PHP 8.1 a starší s vámi naplánujeme migraci na podporovanou verzi PHP.
- V rámci zpevnění serveru nahradíme php-cgi PHP-FPM s oddělenými pooly.
Časté dotazy
Používám php-cgi, aniž bych o tom věděl?
Je to častější, než se zdá. Starší panely, nastavení FastCGI s mod_fcgid a PHP ve Windows s IIS často spouštějí PHP jako php-cgi. Seznam procesů nebo Server API ve phpinfo to spolehlivě ukáže.
Je FastCGI totéž co php-cgi?
Ne tak docela. FastCGI je protokol. PHP-FPM i php-cgi mohou mluvit FastCGI, php-cgi je ale starší, jednodušší program bez poolů a správy procesů. PHP2Shell se php-cgi výslovně týká.
Co znamená klasické CGI u PHP?
U klasického CGI spouští webový server pro každý požadavek nový proces PHP. To je pomalé a dnes vzácné. Častěji je php-cgi za mod_fcgid nebo FastCGI, kde procesy zpracovávají více požadavků.
Musím po aktualizaci něco restartovat?
Ano. U nastavení FastCGI běží procesy php-cgi ještě nějakou dobu dál. Restartujte webový server, resp. správce procesů, a zkontrolujte, že žádný proces php-cgi není starší než aktualizace.