# FrankenPHP apsauga

> FrankenPHP sauga po PHP2Shell: patikrinkite integruotą PHP versiją, iš naujo sukurkite binary ar image, tvarkingai paleiskite worker iš naujo ir sutvirtinkite reikšmes.

Šaltinis: https://phpsos.de/lt/server/frankenphp/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** FrankenPHP yra programų serveris, pagrįstas Caddy, kuris PHP įterpia į savo programą. FrankenPHP saugai po PHP2Shell tai reiškia: svarbūs ne distribucijos PHP paketai, o PHP versija FrankenPHP binary ar konteinerio atvaizde. Sukurkite arba atsisiųskite variantą su ištaisytu PHP ir iš naujo paleiskite visus worker.

## Kodėl FrankenPHP pataisomas kitaip

Klasikinėse sąrankose PHP pateikia distribucija kaip paketą, o atnaujinimas pakeičia failus. FrankenPHP priešingai turi PHP kaip integruotą biblioteką. Kas naudoja oficialų binary ar ant jo sukurtą konteinerio atvaizdą, PHP gauna kartu. `apt upgrade` pagrindiniame kompiuteryje to nekeičia.

PHP2Shell apima CVE-2026-109618 ir CVE-2026-109619, kiekvienas su CVSS v4.0 9,2. PHP projektas FrankenPHP aiškiai nurodo tarp paveiktų veikimo režimų. Ištaisyti PHP 8.5.12, 8.4.27, 8.3.36 ir 8.2.35. Taigi lemia, su kuria PHP versija sukurtas jūsų FrankenPHP.

## Worker režimas ir PHP2Shell

FrankenPHP programas gali valdyti worker režimu. Tuomet programa įkeliama vieną kartą ir po to daug užklausų apdoroja paeiliui tame pačiame procese. Tai suteikia greitį, bet pailgina kiekvieno proceso gyvenimo trukmę.

CVE-2026-109619 aprašo vidinę užklausos būseną, kuri po atminties atlaisvinimo gali išlikti; vėlesnė užklausa tame pačiame worker gali ją panaudoti, kol ji dar nebuvo atstatyta. Worker režimu daugelio užklausų sąveika viename procese yra įprastas dalykas. Tai nėra priežastis atsisakyti worker režimo, bet aiški priežastis ypač kruopščiai atlikti atnaujinimus ir paleidimus iš naujo. Technines detales rasite puslapyje [CVE-2026-109619](https://phpsos.de/lt/php2shell/cve-2026-109619/).

## FrankenPHP sauga: patikrinkite versiją

Integruotą PHP versiją tikrinkite tiesiai veikiančioje sistemoje. Toliau pateiktos komandos tik skaito; tarnybų ir konteinerių pavadinimai yra pavyzdžiai.

```bash
# Įdiegtas binary
frankenphp version

# Veikiančiame konteineryje (konteinerio pavadinimas kaip pavyzdys)
docker exec app frankenphp version
docker exec app php -v

# Kuris image iš tikrųjų veikia? (digest parodo tikslią būseną)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
```

Užsirašykite PHP versiją iš išvesties. Jei ji ankstesnė už ištaisytas versijas, sistema pažeidžiama. Visada tikrinkite veikiantį konteinerį, o ne tik paskutinį sukurtą image, nes naujas image pradeda veikti tik pakeitus konteinerius.

## Įdiekite atnaujinimą ir iš naujo paleiskite visus worker

Kaip atrodo atnaujinimas, priklauso nuo jūsų diegimo:

- **Binary pagrindiniame kompiuteryje:** įdiekite naują FrankenPHP leidimą su ištaisyta PHP versija, iš naujo paleiskite tarnybą.
- **Konteineris:** gaukite bazinį image su ištaisyta PHP versija, savo image sukurkite iš naujo be bazinio sluoksnio talpyklos, pakeiskite konteinerį.
- **Savarankiškai kompiliuota:** iš naujo sukurkite su ištaisyta PHP versija, visus plėtinius sukurkite iš naujo su ta pačia versija.

```bash
# Pavyzdys: diegimas pagrindiniame kompiuteryje kaip systemd tarnyba
systemctl restart frankenphp

# Docker Compose pavyzdys: sukurti iš naujo be talpyklos ir pakeisti konteinerį
docker compose build --pull --no-cache
docker compose up -d --force-recreate
```

Po to dar kartą patikrinkite PHP versiją veikiančiame konteineryje ir procesų paleidimo laiką. Worker režimu kiekvienas worker turi būti paleistas iš naujo. Kubernetes galioja papildomi žingsniai, aprašyti puslapyje [PHP pataisymas Kubernetes](https://phpsos.de/lt/server/kubernetes/), o konteineriams apskritai puslapyje [PHP pataisymas Docker konteineriuose](https://phpsos.de/lt/php2shell/docker-container-patchen/).

> **Svarbu:**
> Žymė, pavyzdžiui, `latest`, ar pagrindinė versija image pavadinime negarantuoja, kad turite naujausią būseną. Aktyviai iš naujo atsisiųskite bazinį image ir po to patikrinkite PHP versiją veikiančiame konteineryje.

## Pereinamosios priemonės ir sutvirtinimas

Jei atnaujinimo nedelsiant atlikti negalima, php.net rekomenduoja pereinamąsias priemones, kurios nesuteikia visiškos apsaugos. FrankenPHP reikšmes nustatykite FrankenPHP įkeliamame php.ini arba per PHP nustatymus Caddy konfigūracijoje, o ne per `ini_set()` programoje.

```ini
; php.ini konteineryje arba pagrindiniame kompiuteryje
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
```

Su įkėlimo funkcija php.net nurodo `post_max_size = 32M`. PHP 8.5 papildomai nustatoma `fatal_error_backtraces=0`. Atminties riba turi būti konteinerio lygmeniu, pavyzdžiui, per konteinerio atminties limitą, o ne per `RLIMIT_AS` ar `RLIMIT_DATA`. Po kiekvieno pakeitimo iš naujo paleiskite visus worker.

Nuolatiniam darbui verta image nurodyti su fiksuotu digest, reguliariai automatiškai kurti iš naujo ir į kūrimo grandinę įtraukti image skaitytuvą. Pataisa taip pat nepašalina kenkėjiškos programinės įrangos, įterptos anksčiau. Išsaugokite žurnalus nuo 2026-10-20; konteineriams tai reiškia išsaugoti juos prieš pakeitimą.

Kas naudoja FrankenPHP kaip statiškai sukurtą binary, turėtų žinoti, kad ten kartu su PHP tvirtai įtraukti ir visi plėtiniai. Todėl atnaujinimas visada reiškia pakeisti visą binary. Po pakeitimo patikrinkite versiją ir įkeltų plėtinių sąrašą, ar viskas prieinama kaip anksčiau, ir išbandykite programą, prieš atmesdami senąją būseną. Konteinerių aplinkose rekomenduojama kiekvieną image pažymėti kūrimo data. Taip bet kada galėsite atsekti, kuri būsena kada veikė, ir prireikus tikslingai grįžti atgal, vėl nenukrisdami į pažeidžiamą būseną. Image, PHP versijos ir laiko priskyrimą užfiksuokite savo dokumentacijoje.

## Kaip PHP SOS padeda konkrečiai?

- Tikriname, kokia PHP versija iš tikrųjų yra jūsų FrankenPHP binary ir veikiančiuose konteineriuose.
- Per [PHP pataisų paslaugą](https://phpsos.de/lt/leistungen/php-patch-service/) iš naujo sukuriame image, keičiame konteinerius ir iš naujo paleidžiame visus worker, pateikdami įrodymą.
- Prieš pakeitimą išsaugome žurnalus ir tikriname programą dėl pėdsakų.
- Nuolatiniam darbui pagal [serverio sutvirtinimą](https://phpsos.de/lt/leistungen/server-haertung/) įdiegiame automatizuotą perkūrimą ir image patikras.


## Dažni klausimai

**Ar apt ar dnf atnaujinimas padeda su FrankenPHP?**  
Tik jei pats FrankenPHP ateina iš šių paketų šaltinių ir yra sukurtas su pataisytu PHP. Dažnai PHP yra tvirtai įtrauktas į FrankenPHP binary arba konteinerio atvaizdą (image). Tuomet reikia atnaujinti binary ar image.

**Kodėl worker režimas PHP2Shell atveju ypač svarbus?**  
Worker režimu programa lieka atmintyje ir daug užklausų apdoroja paeiliui tame pačiame procese. CVE-2026-109619 liečia būtent vidinę būseną, kuri tarp užklausų tame pačiame worker gali išlikti. Todėl po atnaujinimo visų worker paleidimas iš naujo yra privalomas.

**Kaip patikrinti, kokia PHP versija yra FrankenPHP viduje?**  
FrankenPHP binary iškvietus versiją išveda integruotą PHP versiją. Konteineryje komandą galite vykdyti per docker exec. Pasirūpinkite, kad tikrintumėte versiją iš tikrųjų veikiančiame konteineryje, o ne naujai sukurtame image.

**Ar FrankenPHP turi savų pereinamųjų priemonių?**  
Galioja bendri php.net nurodymai. Reikšmes nustatote FrankenPHP įkeliamame php.ini arba Caddy failo PHP konfigūracijoje, o ne per ini_set() programoje. Po to iš naujo paleiskite visus worker.

## Šaltiniai

- [php.net: saugumo pranešimai](https://www.php.net/)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
