Ukratko: FrankenPHP je aplikacijski poslužitelj na temelju Caddyja koji PHP ugrađuje u vlastiti program. Za FrankenPHP sigurnost nakon PHP2Shella to znači: ne računaju se PHP paketi distribucije, nego PHP verzija u FrankenPHP binarnom programu ili imageu kontejnera. Izradite ili preuzmite izdanje s ispravljenim PHP-om i ponovno pokrenite sve workere.
Zašto se FrankenPHP zakrpava drukčije
Kod klasičnih postavki distribucija isporučuje PHP kao paket, a ažuriranje zamjenjuje datoteke. FrankenPHP, naprotiv, sadrži PHP kao ugrađenu biblioteku. Tko koristi službeni binarni program ili image kontejnera izrađen na njemu, PHP dobiva u paketu. apt upgrade na hostu tu ništa ne mijenja.
PHP2Shell obuhvaća CVE-2026-109618 i CVE-2026-109619, svaki s CVSS v4.0 9,2. PHP projekt FrankenPHP izričito navodi među pogođenim načinima rada. Ispravljeni su PHP 8.5.12, 8.4.27, 8.3.36 i 8.2.35. Odlučujuće je, dakle, prema kojoj je PHP verziji izrađen Vaš FrankenPHP.
Worker način rada i PHP2Shell
FrankenPHP aplikacije može pokretati u worker načinu rada. Pritom se aplikacija učita jednom i zatim u istom procesu obrađuje mnogo zahtjeva zaredom. To donosi brzinu, ali produljuje trajanje svakog procesa.
CVE-2026-109619 opisuje unutarnje stanje zahtjeva koje može ostati sačuvano nakon oslobađanja memorije; kasniji zahtjev u istom workeru može ga iskoristiti prije nego što se vrati na početno stanje. U worker načinu rada međudjelovanje mnogih zahtjeva u jednom procesu uobičajeno je stanje. To nije razlog da se odreknete worker načina rada, ali jest jasan razlog da ažuriranja i ponovna pokretanja provedete osobito pažljivo. Tehničke pojedinosti nalaze se u članku CVE-2026-109619.
FrankenPHP sigurnost: provjerite verziju
Ugrađenu PHP verziju provjerite izravno u sustavu koji radi. Sljedeće naredbe samo čitaju; nazivi usluga i kontejnera su primjeri.
# Instalirani binarni program
frankenphp version
# U kontejneru koji radi (naziv kontejnera kao primjer)
docker exec app frankenphp version
docker exec app php -v
# Koji image stvarno radi? (digest prikazuje točno stanje)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
Zabilježite PHP verziju iz ispisa. Ako je prije ispravljenih stanja, sustav je ranjiv. Uvijek provjerite kontejner koji radi, a ne samo posljednji izrađeni image, jer novi image djeluje tek nakon zamjene kontejnera.
Instalirajte ažuriranje i ponovno pokrenite sve workere
Kako ažuriranje izgleda, ovisi o Vašoj instalaciji:
- Binarni program na hostu: instalirati novo FrankenPHP izdanje s ispravljenom PHP verzijom, ponovno pokrenuti uslugu.
- Kontejner: preuzeti osnovni image s ispravljenom PHP verzijom, iznova izraditi vlastiti image, bez predmemorije za osnovni sloj, zamijeniti kontejner.
- Samostalno kompilirano: iznova izraditi prema ispravljenoj PHP verziji, sva proširenja ponovno izraditi s istom verzijom.
# Primjer instalacije na hostu kao systemd usluga
systemctl restart frankenphp
# Primjer Docker Compose: iznova izraditi bez predmemorije i zamijeniti kontejner
docker compose build --pull --no-cache
docker compose up -d --force-recreate
Nakon toga ponovno provjerite PHP verziju u kontejneru koji radi i vrijeme pokretanja procesa. U worker načinu rada svaki worker mora biti ponovno pokrenut. Kod Kubernetesa vrijede dodatni koraci, opisani u članku Zakrpa PHP-a u Kubernetesu, a za kontejnere općenito u članku Zakrpa PHP-a u Docker kontejnerima.
Oznaka poput latest ili glavna verzija u nazivu imagea ne jamči da imate najnovije stanje. Osnovni image aktivno ponovno preuzmite i nakon toga provjerite PHP verziju u kontejneru koji radi.
Privremene mjere i ojačavanje
Ako se ažuriranje ne može odmah provesti, php.net preporučuje privremene mjere koje ne pružaju potpunu zaštitu. Kod FrankenPHP-a vrijednosti postavite u php.ini koji FrankenPHP učitava ili putem PHP postavki u Caddy konfiguraciji, a ne putem ini_set() u aplikaciji.
; php.ini u kontejneru ili na hostu
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
Uz funkciju uploada php.net navodi post_max_size = 32M. Na PHP-u 8.5 dodaje se fatal_error_backtraces=0. Ograničenje memorije pripada na razinu kontejnera, primjerice putem ograničenja memorije kontejnera, a ne putem RLIMIT_AS ili RLIMIT_DATA. Nakon svake promjene ponovno pokrenite sve workere.
Za trajan rad isplati se imagee referencirati s fiksnim digestom, redovito ih automatski iznova izrađivati i u lanac izrade uključiti skener imagea. Zakrpa osim toga ne uklanja zlonamjerni softver koji je ubačen prije. Sačuvajte zapisnike od 20. 10. 2026.; kod kontejnera to znači osigurati ih prije zamjene.
Tko FrankenPHP koristi kao statički izrađen binarni program, trebao bi znati da su tamo uz PHP čvrsto ugrađena i sva proširenja. Ažuriranje stoga uvijek znači zamjenu cijelog binarnog programa. Nakon zamjene provjerite verziju i popis učitanih proširenja je li sve dostupno kao prije te testirajte aplikaciju prije nego što odbacite staro stanje. U okruženjima s kontejnerima preporučuje se svaki image označiti datumom izrade. Tako u svakom trenutku možete rekonstruirati koje je stanje kada radilo i po potrebi ciljano se vratiti, a da ponovno ne padnete na ranjivo stanje. Dodjelu imagea, PHP verzije i vremena zabilježite u svojoj dokumentaciji.
Kako PHP SOS konkretno pomaže?
- Provjeravamo koja je PHP verzija stvarno ugrađena u Vaše FrankenPHP binarne programe i kontejnere koji rade.
- Putem usluge PHP zakrpa iznova izrađujemo imagee, zamjenjujemo kontejnere i ponovno pokrećemo sve workere, uz dokaz.
- Osiguravamo zapisnike prije zamjene i provjeravamo aplikaciju zbog tragova.
- Za trajan rad u okviru ojačavanja poslužitelja uspostavljamo automatizirane ponovne izrade i provjere imagea.
Česta pitanja
Pomaže li apt ili dnf ažuriranje kod FrankenPHP-a?
Samo ako sam FrankenPHP potječe iz tih izvora paketa i izrađen je prema zakrpanom PHP-u. Često je PHP čvrsto ugrađen u FrankenPHP binarni program ili u image kontejnera. Tada morate ažurirati binarni program ili image.
Zašto je worker način rada kod PHP2Shella posebno važan?
U worker načinu rada aplikacija ostaje u memoriji i obrađuje mnogo zahtjeva jedan za drugim u istom procesu. CVE-2026-109619 odnosi se upravo na unutarnje stanje koje može ostati sačuvano između zahtjeva u istom workeru. Ponovno pokretanje svih workera nakon ažuriranja stoga je obvezno.
Kako provjeriti koja je PHP verzija ugrađena u FrankenPHP?
FrankenPHP binarni program pri pozivu verzije ispisuje ugrađenu PHP verziju. U kontejneru naredbu možete izvršiti putem docker exec. Pazite da verziju provjerite u kontejneru koji stvarno radi, a ne u novoizrađenom imageu.
Postoje li za FrankenPHP posebne privremene mjere?
Vrijede opće napomene php.net-a. Vrijednosti postavljate u php.ini koji FrankenPHP učitava ili u PHP konfiguraciji Caddy datoteke, a ne putem ini_set() u aplikaciji. Zatim ponovno pokrenite sve workere.