# php-cgi: zastaralý režim s rizikem

> Zranitelnost php-cgi u PHP2Shell: najděte nastavení CGI a FastCGI, zazáplatujte je, ukončete všechny staré procesy a naplánujte přechod na PHP-FPM.

Zdroj: https://phpsos.de/cs/server/php-cgi/  
Stav: 25.10.2026  
Poskytovatel: PHP SOS, Nouzová pomoc pro PHP a bezpečnost serverů. Okamžitá pomoc přes WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20den%2C%20PHP%20SOS%2C%20pot%C5%99ebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20PHP%20serverem.%20Firma%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**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.

```bash
# 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čí.

```bash
# Ú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](https://phpsos.de/cs/server/windows-iis-php/).

> **Jednejte ihned:**
> 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čí.

```ini
; 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](https://phpsos.de/cs/server/nginx-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](https://phpsos.de/cs/leistungen/php-migration-legacy/).
- V rámci [zpevnění serveru](https://phpsos.de/cs/leistungen/server-haertung/) 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.

## Zdroje

- [php.net: bezpečnostní oznámení](https://www.php.net/)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [php.net: podporované verze](https://www.php.net/supported-versions.php)
- [BSI](https://www.bsi.bund.de/)
