Pe 21 octombrie 2026, proiectul PHP a publicat corecturi pentru două vulnerabilități critice de remote code execution, denumite colectiv PHP2Shell (CVE-2026-109618 și CVE-2026-109619), ambele evaluate la 9.2 CVSS v4.0. Ce face aceste flaw-uri periculoase nu este un bug într-un framework sau o bibliotecă, ci o problemă în motorul PHP însuși: un request neautentificat poate executa cod arbitră înainte ca orice cod de aplicație să ruleze. GitLab a confirmat că platforma sa nu este afectată (nu e scrisă în PHP), dar orice server web care servește request-uri prin PHP — Apache cu mod_php, NGINX cu PHP-FPM, containere, VM-uri bare-metal — este expus. Exploit-urile au fost observate de honeypot-urile Amazon din 17 octombrie, încă sub embargo. Pentru echipele de operare, mesajul e simplu: upgrade-ul runtime-ului PHP e singura mitigatie reală; validarea input-urilor, Composer update-uri sau WAF-uri nu ajută pentru că motorul PHP procesează request-ul înainte de bootstrap-ul aplicației.
Ghid ServerSpan relevant: CVE-2026-12184: Ghid de Patch pentru DoS în PHP-FPM (8.3.32 / 8.4.21 / 8.5.6).
Ce este PHP2Shell și de ce nu poți mitiga la nivel de aplicație
Cele două CVE-uri afectează parsarea request-urilor multipart și gestionarea sesiunilor în nucleul PHP. CVE-2026-109618 permite RCE printr-un request multipart special creat care declanșează o corupere de memorie exploatabilă; CVE-2026-109619 expune memoria procesului și poate duce la information disclosure chiar fără RCE complet. Ambele se declanșează în faza de startup a request-ului, înainte ca auto_prepend_file, middleware-uri sau codul tău să aibă șansă să intervină. Asta înseamnă că:
- Nu există patch la nivel de framework (Laravel, Symfony, WordPress core etc. nu pot fixa asta)
- Composer update nu rezolvă — vulnerabilitatea e în binarul
php/php-fpm/ modulul Apache - WAF-uri și rate-limiting pot reduce suprafața de atac dar nu elimină cauza radicală
Unicul fix efectiv: înlocuiește runtime-ul PHP cu o versiune patch-uită pe fiecare host și în fiecare imagine container. Dacă folosești pachete de distribuție (apt, dnf, apk), trebuie să upgrad-ezi pachetul specific, nu doar să verifici php -v — distribuțiile backportează fix-urile păstrând numărul de versiune upstream.
Versiunile PHP afectate și pachetele de distribuție patch-uite (octombrie 2026)
Tabelul de mai jos sintetizează versiunile upstream fixes și pachetele de distribuție confirmate la 22 octombrie 2026. Restartează toate procesele PHP (php-fpm, Apache, containere) după upgrade.
| Branch Upstream | Versiune Fixată | Notă | |––––––|––––––|––| | PHP 8.5.x | 8.5.12 | Activ | | PHP 8.4.x | 8.4.27 | Activ | | PHP 8.3.x | 8.3.36 | Activ | | PHP 8.2.x | 8.2.35 | EOL 31 dec 2026 | | PHP 8.6 RC | 8.6.0RC4 | RC3 (imagine oficială la 21 oct) nu are fix | | PHP 8.1 și mai vechi | Niciun release oficial | Există backport-uri minime sursă pentru 7.4, 8.0, 8.1; unele distribuții livrez pachete patch-uite |
Pachete de distribuție confirmate (22 oct 2026):
| Distribuție | Pachet Fixat | |––––-|–––––| | Ubuntu 26.04 | php8.5 8.5.4-0ubuntu1.5 | | Ubuntu 24.04 | php8.3 8.3.6-0ubuntu0.24.04.13 | | Ubuntu 22.04 | php8.1 8.1.2-1ubuntu2.28 | | Debian 13 | php8.4 8.4.27-1~deb13u1 | | Debian 12 | php8.2 8.2.35-1~deb12u1 | | Alpine 3.24 | php83 8.3.36, php84 8.4.27, php85 8.5.12 | | RHEL 10 | php 8.3.36-1.el10_2 (RHSA-2026:87070), php8.4 8.4.27-1.el10_2 (RHSA-2026:87071) | | RHEL 9 | php 8.0.30-8.el9_8.1 (RHSA-2026:87151), php:8.2 8.2.35-1 (RHSA-2026:87072), php:8.3 8.3.36-1 (RHSA-2026:87079); php:8.4 fără fix la 22 oct | | RHEL 8 | php:7.4 7.4.33-8 (RHSA-2026:87080); stream-uri retractate (7.2, 7.3, 8.0) nu primesc fix |
Notă importantă: Ubuntu și RHEL (pentru 7.4 și 8.0) păstrează versiunea upstream veche și backportează fix-ul. Compară versiunea pachetului (
dpkg -l | grep php8.3,rpm -q php8.2), nu output-ulphp -v.
Rebuild-ul imaginilor container e obligatoriu. Dacă folosești tag-uri flotante (php:8, php:8.3, php:8.3-apache, php:latest), reconstruiește cu --pull:
docker build --pull -t registry.example.com/app:php2shell-fix .
docker push registry.example.com/app:php2shell-fix
# Redeploy în Kubernetes / Swarm / Nomad
Imaginile derivate (wordpress, drupal, bitnami/php-fpm, frankenphp) primesc fix-ul doar după ce maintainer-ii upstream publică o imagine nouă — verifică Docker Hub / GHCR înainte de rebuild.
Detectarea și remedierea la scară largă cu GitLab (Container Scanning, Orbit, Code Search)
GitLab oferă trei capacități complementare pentru a localiza proiectele care rulează PHP vulnerabil în întreaga organizație. Ordinea recomandată:
1. Container Scanning — detectează PHP instalat ca pachet OS
Activează template-ul în .gitlab-ci.yml sau, mai eficient, o scan execution policy la nivel de grup pentru a-l forța pe toate proiectele:
include:
- template: Security/Container-Scanning.gitlab-ci.yml
Container Scanning raportează CVE-urile în pachetele apt/apk/dnf odata ce intră în baza de date a scanner-ului. Limitare: PHP compilat din sursă (inclusiv imaginile oficiale php:*) nu are înregistrare de pachet — un proiect poate trece scanning-ul și tot rula PHP vulnerabil.
2. GitLab Orbit — graf interogabil de proiecte, pipeline-uri, findings și cod sursă
Cu Orbit activat pe grupul top-level, un agent poate lista toate proiectele care conțin cod PHP, inclusiv cele care compilează PHP sau folosesc imagini php:* oficiale (pe care Container Scanning le ratează). La 22 oct 2026, Orbit nu parsează încă Dockerfile-urile (issue #1416), dar lista sa servește ca scop pentru pasul 3. Poți întreba Orbit și ce proiecte au findings deschise pentru CVE-2026-109618/109619 după ce scan-urile au rulat. Orbit e în beta pentru Premium/Ultimate pe GitLab.com și Self-Managed.
3. Exact Code Search — găsește Dockerfile-uri și proiecte Composer
Rulează la nivel de grup top-level cu regex mode (butonul .* în search box):
Imagini de bază container (inclusiv derivate: wordpress, frankenphp, bitnami/php-fpm):
lang:Dockerfile ^FROM.*php
Proiecte Composer (și acoperă cazurile cu FROM $BASE_IMAGE):
file:composer\.json$
Exact Code Search acoperă doar branch-ul default. Pe GitLab.com e activat implicit pentru planuri plătite. Pe Self-Managed trebuie să instalezi Zoekt. GitLab Dedicated nu suportă Exact Code Search.
Pentru fiecare rezultat, confirmă versiunea: citește linia FROM php:<tag> sau rulează php -v în containerul rulând. Lista de dependențe a grupului arată pachete Composer și versiuni de framework, nu versiunea runtime-ului PHP.
4. Compară cu inventarul runtime (gap analysis)
Scanning-ul static și code search-ul arată ce proiectele declară și construiesc, nu ce rulează efectiv. PHP poate rula în afara proiectelor GitLab: servere web cu mod_php / PHP-FPM activat doar în config, host-uri configurate manual, containere în clustere fără pipeline activ. Pentru Kubernetes, Operational Container Scanning (agentul GitLab pentru clustere) scanează imaginile care rulează efectiv, cu aceeași limitare de detectare doar-pachete. Tratează orice runtime PHP care apare într-o singură vizualizare (statică sau runtime) ca un gap de investigat.
Verificarea semnelor de compromis și analiză post-incident
Rapoartele de exploatare difera. Cercetătorii de securitate au raportat o încercare de exploit pe 17 octombrie (înainte de divulgare publică), urmate de alte rapoarte după release. Proiectul PHP n-a identificat exploit-uri funcționale la momentul release-ului. Dacă un server internet-facing a rulat PHP vulnerabil, analizează log-urile de la 17 octombrie 2026 încolo pentru:
- Request-uri multipart urmate de erori
memory_limitsau răspunsuri HTTP 500 repetitive - Cookie-uri
PHPSESSIDanormal de mari sau malformate în răspuns - Restart-uri neexplicate ale worker-ilor PHP, sau procese shell pornite de workeri PHP
- Fișiere neașteptate pe document root, conexiuni outbound din workeri PHP, sau intrări cron neașteptate
Atenție: Un exploit reușit poate returna HTTP 200 și lăsa workerul rulând — lipsa erorilor nu exclude compromisul. Dacă găsești semne, izolează serverul și inițiază investigația de incident. Când e posibil, capturează memorie, disc și log-uri înainte de patchare și restart — restartul workerilor PHP poate șterge dovezi. CVE-2026-109619 poate expune memoria procesului chiar fără RCE; rorotează orice credențiale, token-uri sau chei pe care procesul PHP le putea citi.
Notă: Scannerele pot flag-ui imaginea
gemnasium:6(depreciată din GitLab 17.9) pentru PHP-ul său bundlat. E folosită doar ca tool CLI și nu gestionează request-uri HTTP, deci nu e exploatabilă; o versiune fixată a fost livrată sub același tag.
Pași practici de acționat azi
- Inventariează toate host-urile și containerele care servește request-uri HTTP prin PHP (bare-metal, VM, Kubernetes, Swarm, serverless)
- Upgradează runtime-ul PHP la versiunile fixate de mai sus; pe distribuții, upgrad-ează pachetul specific și compară versiunea pachetului, nu
php -v - Restartează toate procesele PHP (systemd:
systemctl restart php8.3-fpm, Apache:systemctl restart httpd, containere: redeploy) - Rebuild-uiește toate imaginile container cu tag-uri flotante folosind
docker build --pull; actualizează tag-urile pinate la versiunile fixate - Activează Container Scanning via scan execution policy pe toate grupurile GitLab
- Rulează Exact Code Search cu cele două query-uri de mai sus pentru a găsi proiectele ratate de scanning
- Activează GitLab Orbit pe grupul top-level și interoghează agentul pentru proiecte PHP și findings CVE-2026-109618/109619
- Compară rezultatele statice cu inventarul runtime (Ansible, cloud inventory, Operational Container Scanning) — investighează gap-urile
- Auditează log-urile de la 17 octombrie pentru semne de compromis; roate credențialele expuse
- Documentează tot procesul și actualizează playbook-urile de incident response pentru viitoare vulnerabilități de tip „engine-level”
Concluzie
PHP2Shell demonstră o realitate dură: când vulnerabilitatea se află în runtime-ul de limbaj, nu există scurtături la nivel de aplicație. Singura soluție robustă e upgrade-ul sistematic al fiecărui binar PHP care touch-ează traffic HTTP — pe servere, VM-uri, containere, imagini de bază, derivă. Combinând Container Scanning (pachete OS), Exact Code Search (Dockerfile-uri, Composer) și GitLab Orbit (vizibilitate la nivel de organizație), echipele de platformă pot acoperi suprafața de atac completă și să valideze remedierea la scară. Dar scanning-ul static nu e suficient: gap-analysis-ul față de inventarul runtime e pasul care separă conformitatea de securitatea reală. Dacă administrezi infrastructură care servește PHP, momentul de acționat a fost 21 octombrie; al doilea cel mai bun moment e acum.
Pentru mai multe detalii despre această parte a subiectului, vezi Performanța la nivel de aplicație: Optimizarea PHP 8.5 și NGINX pentru VPS-uri cu trafic intens.
Pentru servere dedicate optimizate pentru workload-uri PHP critice și management securizat al patch-urilor, eksplorează soluțiile de la dedicated-servers.ro și infrastructura managed de la serverspan.ro.