Pe scurt: FrankenPHP este un server de aplicații bazat pe Caddy, care încorporează PHP în propriul program. Pentru securitatea FrankenPHP după PHP2Shell, asta înseamnă: nu contează pachetele PHP ale distribuției, ci versiunea PHP din binarul FrankenPHP sau din imaginea de container. Construiți sau descărcați o variantă cu PHP corectat și reporniți toți workerii.
De ce FrankenPHP se actualizează altfel
La configurațiile clasice, distribuția livrează PHP ca pachet, iar o actualizare înlocuiește fișierele. FrankenPHP, în schimb, conține PHP ca bibliotecă încorporată. Cine folosește binarul oficial sau o imagine de container construită pe el primește PHP odată cu el. Un apt upgrade pe gazdă nu schimbă nimic în această privință.
PHP2Shell cuprinde CVE-2026-109618 și CVE-2026-109619, fiecare cu CVSS v4.0 9.2. Proiectul PHP include explicit FrankenPHP printre modurile de operare afectate. Sunt remediate PHP 8.5.12, 8.4.27, 8.3.36 și 8.2.35. Decisiv este deci cu ce versiune PHP a fost construit FrankenPHP-ul dumneavoastră.
Modul worker și PHP2Shell
FrankenPHP poate rula aplicații în modul worker. În acest caz, aplicația este încărcată o singură dată și procesează apoi multe cereri una după alta în același proces. Aceasta aduce viteză, dar prelungește durata de viață a fiecărui proces.
CVE-2026-109619 descrie o stare internă a unei cereri care poate rămâne după eliberarea memoriei; o cerere ulterioară din același worker o poate folosi înainte ca ea să fie resetată. În modul worker, interacțiunea mai multor cereri într-un singur proces este cazul normal. Nu este un motiv să renunțați la modul worker, dar este un motiv clar să aplicați actualizările și repornirile cu deosebită grijă. Detalii tehnice găsiți la CVE-2026-109619.
Securitate FrankenPHP: verificați versiunea
Verificați versiunea PHP încorporată direct în sistemul care rulează. Comenzile următoare doar citesc; numele serviciilor și ale containerelor sunt exemple.
# Binarul instalat
frankenphp version
# În containerul care rulează (numele containerului ca exemplu)
docker exec app frankenphp version
docker exec app php -v
# Ce imagine rulează de fapt? (digest-ul arată starea exactă)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
Notați versiunea PHP din rezultat. Dacă este anterioară stărilor remediate, sistemul este vulnerabil. Verificați întotdeauna containerul care rulează, nu doar ultima imagine construită, deoarece o imagine nouă are efect abia după înlocuirea containerelor.
Instalați actualizarea și reporniți toți workerii
Cum arată actualizarea depinde de instalarea dumneavoastră:
- Binar pe gazdă: instalați o nouă versiune FrankenPHP cu versiune PHP remediată, reporniți serviciul.
- Container: preluați imaginea de bază cu versiune PHP remediată, reconstruiți imaginea proprie, fără cache pentru stratul de bază, înlocuiți containerul.
- Compilat singur: reconstruiți cu versiunea PHP remediată, regenerați toate extensiile cu aceeași versiune.
# Exemplu de instalare pe gazdă ca serviciu systemd
systemctl restart frankenphp
# Exemplu Docker Compose: reconstruiți fără cache și înlocuiți containerul
docker compose build --pull --no-cache
docker compose up -d --force-recreate
Apoi verificați din nou versiunea PHP din containerul care rulează și ora de pornire a proceselor. În modul worker, fiecare worker trebuie să fie repornit. La Kubernetes se aplică pași suplimentari, descriși la Actualizarea PHP în Kubernetes, iar pentru containere în general la Actualizarea PHP în containere Docker.
Un tag precum latest sau o versiune principală în numele imaginii nu garantează că aveți cea mai recentă stare. Preluați activ din nou imaginea de bază și verificați apoi versiunea PHP din containerul care rulează.
Măsuri provizorii și securizare
Dacă actualizarea nu se poate face imediat, php.net recomandă măsuri provizorii care nu oferă o protecție completă. La FrankenPHP setați valorile în php.ini încărcat de FrankenPHP sau prin setările PHP din configurația Caddy, nu prin ini_set() în aplicație.
; php.ini în container sau pe gazdă
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
Cu funcție de încărcare, php.net indică post_max_size = 32M. Pe PHP 8.5 se adaugă fatal_error_backtraces=0. Limita de memorie aparține la nivelul containerului, de exemplu prin limita de memorie a containerului, nu prin RLIMIT_AS sau RLIMIT_DATA. După fiecare modificare, reporniți toți workerii.
Pentru funcționarea pe termen lung merită să referiți imaginile cu digest fix, să le reconstruiți periodic în mod automat și să includeți un scanner de imagini în lanțul de build. Un patch nu elimină, în plus, programele malițioase introduse anterior. Păstrați jurnalele începând cu 20.10.2026; la containere, asta înseamnă să le salvați înainte de înlocuire.
Cine folosește FrankenPHP ca binar construit static ar trebui să știe că acolo, pe lângă PHP, sunt încorporate fix și toate extensiile. O actualizare înseamnă de aceea întotdeauna înlocuirea întregului binar. După înlocuire, verificați versiunea și lista extensiilor încărcate, pentru a vedea dacă totul este disponibil ca înainte, și testați aplicația înainte de a renunța la vechea stare. În mediile cu containere se recomandă marcarea fiecărei imagini cu data build-ului. Astfel puteți reconstitui oricând ce stare a rulat și când și, în caz de îndoială, puteți reveni țintit, fără a ajunge din nou la o stare vulnerabilă. Consemnați în documentația dumneavoastră corespondența dintre imagine, versiunea PHP și moment.
Cum ajută PHP SOS concret?
- Verificăm ce versiune PHP se află de fapt în binarele FrankenPHP și în containerele dumneavoastră care rulează.
- Prin serviciul de patch PHP reconstruim imaginile, înlocuim containerele și repornim toți workerii, cu dovadă.
- Salvăm jurnalele înainte de înlocuire și verificăm aplicația pentru urme.
- Pentru funcționarea pe termen lung configurăm reconstruiri automate și verificări de imagini în cadrul securizării serverelor.
Întrebări frecvente
Ajută o actualizare apt sau dnf la FrankenPHP?
Doar dacă FrankenPHP însuși provine din aceste surse de pachete și este construit cu PHP actualizat. Adesea PHP este încorporat fix în binarul FrankenPHP sau în imaginea de container. Atunci trebuie să actualizați binarul sau imaginea.
De ce este modul worker deosebit de important la PHP2Shell?
În modul worker, aplicația rămâne în memorie și procesează multe cereri una după alta în același proces. CVE-2026-109619 privește exact starea internă care poate rămâne între cereri în același worker. O repornire a tuturor workerilor după actualizare este de aceea obligatorie.
Cum verific ce versiune PHP se află în FrankenPHP?
Binarul FrankenPHP afișează versiunea PHP încorporată la apelul de versiune. În container puteți rula comanda prin docker exec. Aveți grijă să verificați versiunea în containerul care rulează efectiv, nu în imaginea construită recent.
Există măsuri provizorii proprii pentru FrankenPHP?
Se aplică indicațiile generale de la php.net. Setați valorile în php.ini încărcat de FrankenPHP sau în configurația PHP din fișierul Caddy, nu prin ini_set() în aplicație. Apoi reporniți toți workerii.