Stručne: FrankenPHP je aplikačný server na báze Caddy, ktorý vkladá PHP do vlastného programu. Pre bezpečnosť FrankenPHP po PHP2Shell to znamená: nerozhodujú balíky PHP distribúcie, ale verzia PHP v binárke FrankenPHP alebo v obraze kontajnera. Zostavte alebo stiahnite verziu s opraveným PHP a reštartujte všetkých workerov.
Prečo sa FrankenPHP záplatuje inak
Pri klasických nastaveniach dodáva PHP distribúcia ako balík a aktualizácia vymení súbory. FrankenPHP naopak obsahuje PHP ako vloženú knižnicu. Kto používa oficiálnu binárku alebo obraz kontajnera na nej postavený, dostane PHP v balíku. apt upgrade na hostiteľovi na tom nič nezmení.
PHP2Shell zahŕňa CVE-2026-109618 a CVE-2026-109619, každá s CVSS v4.0 9.2. Projekt PHP uvádza FrankenPHP výslovne medzi dotknutými režimami prevádzky. Opravené sú PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35. Rozhodujúce je teda to, proti ktorej verzii PHP bol váš FrankenPHP zostavený.
Režim worker a PHP2Shell
FrankenPHP môže prevádzkovať aplikácie v režime worker. Aplikácia sa pritom načíta raz a potom spracúva mnoho požiadaviek za sebou v tom istom procese. To prináša rýchlosť, ale predlžuje životnosť každého procesu.
CVE-2026-109619 opisuje vnútorný stav požiadavky, ktorý môže po uvoľnení pamäte zostať zachovaný; neskorší požiadavok v tom istom workeri ho môže použiť skôr, než sa vynuluje. V režime worker je súhra mnohých požiadaviek v jednom procese bežným prípadom. To nie je dôvod vzdať sa režimu worker, ale jasný dôvod, aby sa aktualizácie a reštarty vykonávali obzvlášť starostlivo. Technické podrobnosti nájdete na stránke CVE-2026-109619.
Bezpečnosť FrankenPHP: kontrola verzie
Vloženú verziu PHP skontrolujte priamo v bežiacom systéme. Nasledujúce príkazy iba čítajú; názvy služieb a kontajnerov sú príklady.
# Nainštalovaná binárka
frankenphp version
# V bežiacom kontajneri (názov kontajnera ako príklad)
docker exec app frankenphp version
docker exec app php -v
# Ktorý obraz skutočne beží? (digest ukazuje presný stav)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
Poznačte si verziu PHP z výstupu. Ak je pred opravenými stavmi, systém je zraniteľný. Vždy kontrolujte bežiaci kontajner, nielen naposledy zostavený obraz, pretože nový obraz účinkuje až po výmene kontajnerov.
Nasaďte aktualizáciu a reštartujte všetkých workerov
Ako aktualizácia vyzerá, závisí od vašej inštalácie:
- Binárka na hostiteľovi: nainštalovať nové vydanie FrankenPHP s opravenou verziou PHP, reštartovať službu.
- Kontajner: stiahnuť základný obraz s opravenou verziou PHP, znovu zostaviť vlastný obraz bez cache pre základnú vrstvu, vymeniť kontajner.
- Vlastná kompilácia: znovu zostaviť proti opravenej verzii PHP, všetky rozšírenia vytvoriť nanovo s tou istou verziou.
# Príklad inštalácie na hostiteľovi ako služba systemd
systemctl restart frankenphp
# Príklad Docker Compose: nové zostavenie bez cache a výmena kontajnera
docker compose build --pull --no-cache
docker compose up -d --force-recreate
Potom znova skontrolujte verziu PHP v bežiacom kontajneri a čas spustenia procesov. V režime worker musí byť každý worker reštartovaný. Pri Kubernetes platia ďalšie kroky, opísané na stránke Záplatovanie PHP v Kubernetes, pre kontajnery všeobecne na stránke Záplatovanie PHP v kontajneroch Docker.
Tag ako latest alebo hlavná verzia v názve obrazu nezaručuje, že máte najnovší stav. Základný obraz aktívne stiahnite znova a potom skontrolujte verziu PHP v bežiacom kontajneri.
Prechodné opatrenia a spevnenie
Ak aktualizácia nie je možná okamžite, php.net odporúča prechodné opatrenia, ktoré neposkytujú úplnú ochranu. Pri FrankenPHP nastavte hodnoty v php.ini, ktorú FrankenPHP načíta, alebo cez nastavenia PHP v konfigurácii Caddy, nie cez ini_set() v aplikácii.
; php.ini v kontajneri alebo na hostiteľovi
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
S funkciou nahrávania php.net uvádza post_max_size = 32M. Pri PHP 8.5 pribúda fatal_error_backtraces=0. Obmedzenie pamäte patrí na úroveň kontajnera, napríklad cez limit pamäte kontajnera, nie cez RLIMIT_AS alebo RLIMIT_DATA. Po každej zmene reštartujte všetkých workerov.
Pre trvalú prevádzku sa oplatí odkazovať na obrazy s pevným digestom, pravidelne ich automaticky znovu zostavovať a do reťazca zostavenia zaradiť skener obrazov. Záplata navyše neodstráni škodlivý softvér, ktorý bol zavlečený predtým. Uchovajte logy od 20. 10. 2026; pri kontajneroch to znamená zálohovať ich pred výmenou.
Kto používa FrankenPHP ako staticky zostavenú binárku, mal by vedieť, že sú tam popri PHP pevne zabudované aj všetky rozšírenia. Aktualizácia preto vždy znamená výmenu celej binárky. Po výmene skontrolujte verziu a zoznam načítaných rozšírení, či je všetko dostupné ako predtým, a aplikáciu otestujte, skôr než starý stav zahodíte. V prostrediach s kontajnermi sa odporúča označiť každý obraz dátumom zostavenia. Takto môžete kedykoľvek dohľadať, ktorý stav kedy bežal, a v prípade potreby sa cielene vrátiť, bez toho, aby ste znova skončili na zraniteľnom stave. Priradenie obrazu, verzie PHP a času si zaznamenajte vo svojej dokumentácii.
Ako konkrétne pomáha PHP SOS?
- Skontrolujeme, aká verzia PHP skutočne stojí vo vašich binárkach FrankenPHP a bežiacich kontajneroch.
- Cez službu záplatovania PHP znovu zostavíme obrazy, vymeníme kontajnery a reštartujeme všetkých workerov, s dôkazom.
- Zabezpečíme logy pred výmenou a skontrolujeme aplikáciu na stopy.
- Pre trvalú prevádzku zavedieme automatizované opätovné zostavenia a kontroly obrazov v rámci spevnenia servera (hardening).
Časté otázky
Pomôže pri FrankenPHP aktualizácia cez apt alebo dnf?
Iba ak FrankenPHP pochádza z týchto zdrojov balíkov a je zostavené proti zaplátanému PHP. Často je PHP pevne súčasťou binárky FrankenPHP alebo obrazu kontajnera. Potom musíte aktualizovať binárku alebo obraz.
Prečo je režim worker pri PHP2Shell obzvlášť dôležitý?
V režime worker zostáva aplikácia v pamäti a spracúva mnoho požiadaviek za sebou v tom istom procese. CVE-2026-109619 sa týka práve vnútorného stavu, ktorý môže medzi požiadavkami v tom istom workeri zostať zachovaný. Reštart všetkých workerov po aktualizácii je preto povinný.
Ako skontrolujem, aká verzia PHP je vo FrankenPHP?
Binárka FrankenPHP pri zistení verzie vypíše vloženú verziu PHP. V kontajneri môžete príkaz spustiť cez docker exec. Dbajte na to, aby ste verziu kontrolovali v skutočne bežiacom kontajneri, nie v novo zostavenom obraze.
Existujú pre FrankenPHP vlastné prechodné opatrenia?
Platia všeobecné upozornenia od php.net. Hodnoty nastavte v php.ini, ktorú FrankenPHP načíta, alebo v konfigurácii PHP v súbore Caddy, nie cez ini_set() v aplikácii. Potom reštartujte všetkých workerov.