Na kratko: FrankenPHP je aplikacijski strežnik na osnovi Caddy, ki PHP vgradi v lasten program. Za varnost FrankenPHP po PHP2Shell to pomeni: ne štejejo paketi PHP distribucije, temveč različica PHP v binarni datoteki FrankenPHP ali sliki vsebnika. Sestavite ali naložite izdajo z odpravljenim PHP in znova zaženite vse delavce.
Zakaj se FrankenPHP popravlja drugače
Pri klasičnih zgradbah PHP dostavi distribucija kot paket, posodobitev pa zamenja datoteke. FrankenPHP pa PHP vsebuje kot vgrajeno knjižnico. Kdor uporablja uradno binarno datoteko ali na njej temelječo sliko vsebnika, dobi PHP zraven. apt upgrade na gostitelju tega ne spremeni.
PHP2Shell obsega CVE-2026-109618 in CVE-2026-109619, vsaka s CVSS v4.0 9,2. Projekt PHP FrankenPHP izrecno navaja med prizadetimi načini delovanja. Odpravljeni so PHP 8.5.12, 8.4.27, 8.3.36 in 8.2.35. Odločilno je torej, s katero različico PHP je vaš FrankenPHP sestavljen.
Način Worker in PHP2Shell
FrankenPHP lahko aplikacije poganja v načinu Worker. Pri tem se aplikacija naloži enkrat in nato veliko zahtev zaporedoma obdela v istem procesu. To prinaša hitrost, a podaljša življenjsko dobo vsakega procesa.
CVE-2026-109619 opisuje notranje stanje zahteve, ki lahko po sprostitvi pomnilnika ostane; poznejša zahteva v istem delavcu ga lahko uporabi, preden je ponastavljeno. V načinu Worker je sodelovanje številnih zahtev v enem procesu običajen primer. To ni razlog, da bi se načinu Worker odpovedali, je pa jasen razlog, da posodobitve in ponovne zagone izvedete posebej skrbno. Tehnične podrobnosti so na strani CVE-2026-109619.
Varnost FrankenPHP: preverite različico
Vgrajeno različico PHP preverite neposredno v delujočem sistemu. Spodnji ukazi samo berejo; imena storitev in vsebnikov so primeri.
# Nameščena binarna datoteka
frankenphp version
# V delujočem vsebniku (ime vsebnika kot primer)
docker exec app frankenphp version
docker exec app php -v
# Katera slika dejansko teče? (Digest kaže natančno stanje)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
Zapišite različico PHP iz izpisa. Če je pred odpravljenimi stanji, je sistem ranljiv. Vedno preverite delujoči vsebnik, ne samo nazadnje sestavljene slike, kajti nova slika učinkuje šele po zamenjavi vsebnikov.
Namestite posodobitev in znova zaženite vse delavce
Kako je videti posodobitev, je odvisno od vaše namestitve:
- Binarna datoteka na gostitelju: namestite novo izdajo FrankenPHP z odpravljeno različico PHP, storitev znova zaženite.
- Vsebnik: pridobite osnovno sliko z odpravljeno različico PHP, lastno sliko znova sestavite brez predpomnilnika za osnovno plast, vsebnike zamenjajte.
- Samostojno prevedeno: znova sestavite z odpravljeno različico PHP, vse razširitve znova ustvarite z isto različico.
# Primer namestitve na gostitelju kot storitev systemd
systemctl restart frankenphp
# Primer Docker Compose: ponovno sestavite brez predpomnilnika in zamenjajte vsebnike
docker compose build --pull --no-cache
docker compose up -d --force-recreate
Nato znova preverite različico PHP v delujočem vsebniku in čas zagona procesov. V načinu Worker mora biti vsak delavec znova zagnan. Pri Kubernetesu veljajo dodatni koraki, opisani na strani Popravljanje PHP v Kubernetesu, za vsebnike na splošno pa na strani Popravljanje PHP v vsebnikih Docker.
Oznaka, kot je latest, ali glavna različica v imenu slike ne zagotavlja, da imate najnovejše stanje. Osnovno sliko aktivno znova potegnite in nato preverite različico PHP v delujočem vsebniku.
Vmesni ukrepi in utrditev
Če posodobitve ni mogoče izvesti takoj, php.net priporoča vmesne ukrepe, ki ne nudijo popolne zaščite. Pri FrankenPHP vrednosti nastavite v php.ini, ki jo FrankenPHP naloži, ali prek nastavitev PHP v konfiguraciji Caddy, ne z ini_set() v aplikaciji.
; php.ini v vsebniku ali na gostitelju
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
S funkcijo nalaganja datotek php.net navaja post_max_size = 32M. Pri PHP 8.5 se doda fatal_error_backtraces=0. Omejitev pomnilnika sodi na raven vsebnika, na primer prek omejitve pomnilnika vsebnika, ne prek RLIMIT_AS ali RLIMIT_DATA. Po vsaki spremembi znova zaženite vse delavce.
Za trajno delovanje se splača slike referencirati s fiksnim digestom, jih redno samodejno znova sestavljati in v verigo gradnje vključiti optični bralnik slik (image scanner). Popravek poleg tega ne odstrani škodljive programske opreme, ki je bila vnesena prej. Dnevnike hranite od 20. 10. 2026 naprej; pri vsebnikih to pomeni, da jih zavarujete, preden jih zamenjate.
Kdor FrankenPHP uporablja kot statično zgrajeno binarno datoteko, naj ve, da so tam poleg PHP trdno vgrajene tudi vse razširitve. Posodobitev zato vedno pomeni zamenjavo celotne binarne datoteke. Po zamenjavi preverite različico in seznam naloženih razširitev, ali je vse na voljo kot prej, in aplikacijo preizkusite, preden staro stanje zavržete. V okoljih z vsebniki je priporočljivo vsako sliko označiti z datumom gradnje. Tako lahko kadar koli sledite, katero stanje je kdaj teklo, in se v dvomu ciljno vrnete nazaj, ne da bi znova pristali na ranljivem stanju. Dodelitev slike, različice PHP in časa zapišite v svojo dokumentacijo.
Kako PHP SOS konkretno pomaga?
- Preverimo, katera različica PHP je dejansko v vaših binarnih datotekah FrankenPHP in delujočih vsebnikih.
- Prek storitve popravljanja PHP znova sestavimo slike, zamenjamo vsebnike in znova zaženemo vse delavce, z dokazom.
- Dnevnike zavarujemo pred zamenjavo in aplikacijo preverimo glede sledi.
- Za trajno delovanje v okviru utrditve strežnika vzpostavimo samodejno ponovno sestavljanje in preverjanje slik.
Pogosta vprašanja
Ali pri FrankenPHP pomaga posodobitev apt ali dnf?
Samo če sam FrankenPHP izvira iz teh virov paketov in je sestavljen s popravljenim PHP. Pogosto je PHP trdno vgrajen v binarno datoteko FrankenPHP ali v sliko vsebnika. Takrat morate posodobiti binarno datoteko ali sliko.
Zakaj je način Worker pri PHP2Shell posebej pomemben?
V načinu Worker aplikacija ostane v pomnilniku in veliko zahtev obdela zaporedoma v istem procesu. CVE-2026-109619 zadeva prav notranje stanje, ki lahko med zahtevami v istem delavcu ostane. Ponovni zagon vseh delavcev po posodobitvi je zato obvezen.
Kako preverim, katera različica PHP je v FrankenPHP?
Binarna datoteka FrankenPHP ob klicu različice izpiše vgrajeno različico PHP. V vsebniku lahko ukaz izvedete prek docker exec. Pazite, da različico preverite v dejansko delujočem vsebniku, ne v na novo sestavljeni sliki.
Ali za FrankenPHP obstajajo lastni vmesni ukrepi?
Veljajo splošni napotki php.net. Vrednosti nastavite v php.ini, ki jo FrankenPHP naloži, ali v nastavitvah PHP v datoteki Caddy, ne z ini_set() v aplikaciji. Nato znova zaženite vse delavce.