# Zabezpečení FrankenPHP

> Bezpečnost FrankenPHP po PHP2Shell: zkontrolujte vestavěnou verzi PHP, znovu sestavte binárku nebo image, čistě restartujte workery a zpevněte hodnoty.

Zdroj: https://phpsos.de/cs/server/frankenphp/  
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ě:** FrankenPHP je aplikační server založený na Caddy, který PHP vkládá do vlastního programu. Pro bezpečnost FrankenPHP po PHP2Shell to znamená: nerozhodují balíčky PHP z distribuce, ale verze PHP v binárce FrankenPHP nebo v image kontejneru. Sestavte nebo stáhněte verzi s opraveným PHP a restartujte všechny workery.

## Proč se FrankenPHP záplatuje jinak

U klasických nastavení dodává PHP distribuce jako balíček a aktualizace soubory vymění. FrankenPHP naproti tomu obsahuje PHP jako vestavěnou knihovnu. Kdo používá oficiální binárku nebo na ní postavenou image kontejneru, dostává PHP s sebou. `apt upgrade` na hostiteli na tom nic nezmění.

PHP2Shell zahrnuje CVE-2026-109618 a CVE-2026-109619, každou s CVSS v4.0 9,2. Projekt PHP uvádí FrankenPHP výslovně mezi postiženými provozními režimy. Opravena je PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35. Rozhodující je tedy to, proti jaké verzi PHP byl váš FrankenPHP sestaven.

## Režim worker a PHP2Shell

FrankenPHP může aplikace provozovat v režimu worker. Aplikace se přitom načte jednou a poté zpracovává mnoho požadavků za sebou ve stejném procesu. To přináší rychlost, ale prodlužuje životnost každého procesu.

CVE-2026-109619 popisuje vnitřní stav požadavku, který může po uvolnění paměti přetrvat; pozdější požadavek ve stejném workeru ho může využít, než bude obnoven. V režimu worker je souhra mnoha požadavků v jednom procesu normální stav. To není důvod režimu worker se vzdát, ale jasný důvod provádět aktualizace a restarty obzvlášť pečlivě. Technické podrobnosti najdete na stránce [CVE-2026-109619](https://phpsos.de/cs/php2shell/cve-2026-109619/).

## Bezpečnost FrankenPHP: zkontrolovat verzi

Vestavěnou verzi PHP zkontrolujte přímo v běžícím systému. Následující příkazy jen čtou; názvy služeb a kontejnerů jsou příklady.

```bash
# Nainstalovaná binárka
frankenphp version

# V běžícím kontejneru (název kontejneru jako příklad)
docker exec app frankenphp version
docker exec app php -v

# Která image skutečně běží? (digest ukazuje přesný stav)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
```

Poznamenejte si verzi PHP z výstupu. Pokud je před opravenými stavy, je systém zranitelný. Kontrolujte vždy běžící kontejner, nejen naposledy sestavenou image, protože nová image se projeví až po výměně kontejnerů.

## Nasadit aktualizaci a restartovat všechny workery

Jak aktualizace vypadá, závisí na vaší instalaci:

- **Binárka na hostiteli:** nainstalovat nové vydání FrankenPHP s opravenou verzí PHP, službu restartovat.
- **Kontejner:** stáhnout základní image s opravenou verzí PHP, vlastní image znovu sestavit, pro základní vrstvu bez cache, kontejner nahradit.
- **Vlastní kompilace:** znovu sestavit proti opravené verzi PHP, všechna rozšíření vytvořit znovu se stejnou verzí.

```bash
# Příklad instalace na hostiteli jako služba systemd
systemctl restart frankenphp

# Příklad Docker Compose: znovu sestavit bez cache a nahradit kontejner
docker compose build --pull --no-cache
docker compose up -d --force-recreate
```

Poté znovu zkontrolujte verzi PHP v běžícím kontejneru a čas spuštění procesů. V režimu worker musí být restartován každý worker. U Kubernetes platí další kroky popsané na stránce [Záplatování PHP v Kubernetes](https://phpsos.de/cs/server/kubernetes/), pro kontejnery obecně na stránce [Záplatování PHP v kontejnerech Docker](https://phpsos.de/cs/php2shell/docker-container-patchen/).

> **Důležité:**
> Tag jako `latest` nebo hlavní verze v názvu image nezaručuje, že máte nejnovější stav. Základní image aktivně stáhněte znovu a poté zkontrolujte verzi PHP v běžícím kontejneru.

## Přechodná opatření a zpevnění

Pokud aktualizace nemůže proběhnout okamžitě, doporučuje php.net přechodná opatření, která neposkytují úplnou ochranu. U FrankenPHP nastavíte hodnoty v php.ini, kterou FrankenPHP načítá, nebo přes nastavení PHP v konfiguraci Caddy, nikoli pomocí `ini_set()` v aplikaci.

```ini
; php.ini v kontejneru nebo na hostiteli
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`. Limit paměti patří na úroveň kontejneru, například pomocí limitu paměti kontejneru, nikoli přes `RLIMIT_AS` nebo `RLIMIT_DATA`. Po každé změně restartujte všechny workery.

Pro trvalý provoz se vyplatí odkazovat se na image s pevným digestem, pravidelně je automaticky znovu sestavovat a zařadit do řetězce sestavení skener image. Záplata navíc neodstraní škodlivý software zavlečený dříve. Uchovejte logy od 20. 10. 2026; u kontejnerů to znamená zajistit je před nahrazením.

Kdo používá FrankenPHP jako staticky sestavenou binárku, měl by vědět, že jsou v ní pevně zabudována vedle PHP i všechna rozšíření. Aktualizace proto vždy znamená vyměnit celou binárku. Po výměně zkontrolujte verzi a seznam načtených rozšíření, zda je vše dostupné jako dříve, a aplikaci otestujte, než starý stav zahodíte. V prostředích s kontejnery se doporučuje každou image označit datem sestavení. Tak můžete kdykoli dohledat, který stav kdy běžel, a v případě potřeby se cíleně vrátit zpět, aniž byste znovu spadli na zranitelný stav. Přiřazení image, verze PHP a času si zaznamenejte do dokumentace.

## Jak konkrétně pomáhá PHP SOS?

- Zkontrolujeme, jaká verze PHP skutečně sídlí ve vašich binárkách FrankenPHP a běžících kontejnerech.
- Prostřednictvím [služby záplatování PHP](https://phpsos.de/cs/leistungen/php-patch-service/) znovu sestavíme image, nahradíme kontejnery a restartujeme všechny workery, s dokladem.
- Zajistíme logy před výměnou a zkontrolujeme aplikaci na stopy.
- Pro trvalý provoz nastavíme v rámci [zpevnění serveru](https://phpsos.de/cs/leistungen/server-haertung/) automatizované přestavby a kontroly image.


## Časté dotazy

**Pomůže u FrankenPHP aktualizace přes apt nebo dnf?**  
Jen pokud samotný FrankenPHP pochází z těchto zdrojů balíčků a je sestaven proti zazáplatovanému PHP. Často je PHP pevně obsaženo v binárce FrankenPHP nebo v image kontejneru. Pak musíte aktualizovat binárku nebo image.

**Proč je worker režim u PHP2Shell obzvlášť důležitý?**  
V režimu worker zůstává aplikace v paměti a zpracovává mnoho požadavků po sobě ve stejném procesu. CVE-2026-109619 se týká právě vnitřního stavu, který může mezi požadavky ve stejném workeru přetrvat. Restart všech workerů po aktualizaci je proto povinný.

**Jak zjistím, jaká verze PHP je ve FrankenPHP?**  
Binárka FrankenPHP při zjištění verze vypíše vestavěnou verzi PHP. V kontejneru můžete příkaz spustit přes docker exec. Dbejte na to, abyste verzi kontrolovali v skutečně běžícím kontejneru, nikoli v nově sestavené image.

**Existují pro FrankenPHP zvláštní přechodná opatření?**  
Platí obecné pokyny php.net. Hodnoty nastavte v php.ini, kterou FrankenPHP načítá, nebo v nastavení PHP v souboru Caddy, nikoli pomocí ini_set() v aplikaci. Poté restartujte všechny workery.

## Zdroje

- [php.net: bezpečnostní oznámení](https://www.php.net/)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
