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.
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.
# 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í.
# 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, pro kontejnery obecně na stránce Záplatování PHP v kontejnerech Docker.
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.
; 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 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 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.