# Zaštita FrankenPHP-a

> FrankenPHP sigurnost nakon PHP2Shella: provjera ugrađene PHP verzije, ponovna izrada binarnog programa ili imagea, uredno ponovno pokretanje workera i ojačavanje.

Izvor: https://phpsos.de/hr/server/frankenphp/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**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](https://phpsos.de/hr/php2shell/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.

```bash
# 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.

```bash
# 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](https://phpsos.de/hr/server/kubernetes/), a za kontejnere općenito u članku [Zakrpa PHP-a u Docker kontejnerima](https://phpsos.de/hr/php2shell/docker-container-patchen/).

> **Važno:**
> 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.

```ini
; 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](https://phpsos.de/hr/leistungen/php-patch-service/) 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](https://phpsos.de/hr/leistungen/server-haertung/) 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.

## Izvori

- [php.net: sigurnosne objave](https://www.php.net/)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
