Pe 21 octombrie 2026, proiectul PHP a publicat o lansare de securitate de urgență care adresază două vulnerabilități critice de execuție a codului la distanță (RCE), denumite colectiv PHP2Shell (CVE-2026-109618 și CVE-2026-109619). Ambele au scorul 9.2 pe CVSS v4.0 și rezidă în motorul PHP, nu în framework-uri sau biblioteci. Asta înseamnă că niciun patch la nivel de aplicație, validare de input, autentificare sau actualizare Composer nu ajută — vulnerabilitatea este declanșată înainte ca orice cod de aplicație să ruleze, confirmată pe Apache cu mod_php. Dacă serverul tău servește request-uri HTTP prin PHP, e vulnerabil. Amazon a înregistrat prima încercare de exploatare pe 17 octombrie, patru zile înainte de divulgarea publică. Acest ghid acoperă versiunile fixe, pachetele de distribuție, descoperirea automată a proiectelor afectate și verificarea semnelor de compromitere.
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 afectează orice server care rulează PHP
PHP2Shell nu este o vulnerabilitate de framework — este un defect în motorul PHP legat de gestionarea memoriei și a erorilor, căi pe care aproape orice request HTTP le traversează. Pe Apache cu mod_php, un request neautentificat poate atinge execuția de cod arbitrár înainte ca index.php sau orice middleware să fie încărcat. WordPress, Drupal, Magento, Laravel, Symfony — toate rulează peste motorul vulnerabil. GitLab a confirmat că nu e afectat (aplicația nu e scrisă în PHP și nu îl rulează pentru a servi request-uri web), dar orice infrastructură care găzduiește aplicații PHP e expusă.
Pentru mai multe detalii despre această parte a subiectului, vezi Actualizare Importantă: Securitate și Performanță PHP Îmbunătățite pentru Hosting Partajat.
Două CVE-uri distincte:
- CVE-2026-109618: RCE prin request-uri multipart care declanșează erori de limită de memorie
- CVE-2026-109619: Expunere a memoriei procesului, chiar dacă atacatorul nu atinge RCE
Ambele au fost descoperite独立: CaliF într-un audit asistențat de AI (1 august, raportat 11 august) și Wiz Research (24 august). Embargo a scăpat pe 20 octombrie (Huntress a publicat detalii), forțând lansarea anticipată a patch-urilor pe 21 octombrie, 14:00 UTC.
–
Versiunile PHP patchuite și pachetele de distribuție — ce trebuie să actualizezi acum
Regula de aur: actualizează runtime-ul PHP pe fiecare gazdă și în fiecare imagine container. Nu te baza pe php -v dacă folosești pachete de distribuție — Ubuntu, Debian, RHEL mențin numărul de versiune upstream și backport-ă fix-ul. Compară versiunea pachetului.
Versiunile upstream fixe (lansate 21 octombrie 2026)
| Branșă | Versiune fixă | Notă | |–––|–––––|––| | PHP 8.5.x | 8.5.12 | Suport activ | | PHP 8.4.x | 8.4.27 | Suport activ | | PHP 8.3.x | 8.3.36 | Suport activ | | PHP 8.2.x | 8.2.35 | EOL 31 decembrie 2026 — planifică migrarea | | PHP 8.6 RC | 8.6.0RC4 | RC3 e vulnerabil; imaginea php:8.6-rc era pe RC3 la 21 oct | | PHP 8.1 și mai vechi | Niciun release oficial | Doar backport-uri sursă minime pentru 7.4, 8.0, 8.1; unele distribuții livr pachete patchuite |
Pachete de distribuție confirmate patched (stare 22 octombrie 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 retrase (7.2, 7.3, 8.0) fără fix |
Comenzi practice de verificare pe Ubuntu/Debian:
# Verifică versiunea pachetului instalat (nu php -v!)
apt list --installed | grep ^php
# Upgrade doar pachetele PHP
apt update && apt upgrade php8.3 php8.3-fpm php8.3-cli php8.3-common -y
# Restart obligatoriu după upgrade
systemctl restart php8.3-fpm nginx apache2
Pe RHEL/AlmaLinux/Rocky:
dnf update php* -y
# sau pentru stream-uri specifice
dnf module update php:8.3 -y
systemctl restart php-fpm httpd nginx
Rebuild obligatoriu al imaginilor container
Dacă folosești tag-uri flotante (php:8, php:8.3, php:8.3-apache, php:latest), rebuild-ează cu --pull:
docker build --pull -t myapp:php2shell-fixed .
docker push myapp:php2shell-fixed
# Redepploiează în Kubernetes/ECS/Compose
Dacă pin-uiești versiunea patch (php:8.3.35-apache), actualizează tag-ul în Dockerfile la php:8.3.36-apache (sau 8.4.27, 8.5.12) și rebuild-uiește. Imaginile derivate (wordpress, drupal, bitnami/php-fpm) primesc fix-ul doar după ce maintainer-ii publică imagini noi — verifică upstream înainte de rebuild.
–
Cum să localizezi toate proiectele PHP vulnerabile în infrastructura ta
Proiectele uitate — dashboard-uri interne, site-uri marketing, job-uri CI care construiesc imagini — sunt cel mai mare risc. GitLab oferă trei straturi de descoperire statică; folosește-le în ordine.
1. Container Scanning — detectează PHP instalat ca pachet OS
Activează template-ul în .gitlab-ci.yml:
include:
- template: Security/Container-Scanning.gitlab-ci.yml
Sau la nivel de grup cu Scan Execution Policy — forțează scanning pe toate proiectele. Rezultatele apar în Vulnerability Report pe branch-ul default. Adaugă Merge Request Approval Policy cu container scanning pentru a bloca merge-uri care reintroduc PHP vulnerabil.
Limitare: Container scanning vede doar PHP instalat prin apt/apk/dnf. PHP compilat din sursă sau imagini php:* oficiale nu au înregistrare de pachet — trec scanning-ul neschimbate.
2. GitLab Orbit — indexează 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. Orbit nu parsează încă Dockerfile-uri (issue #1416), dar lista sa scope-uiește code search-ul următor. Poți întreba Orbit: „Care proiecte au findings deschise pentru CVE-2026-109618 sau CVE-2026-109619?” — odată ce scan-urile au rulat. Orbit indexează doar branch-ul default și e în beta pentru Premium/Ultimate pe GitLab.com și Self-Managed.
3. Exact Code Search — găsește Dockerfile-uri și proiecte Composer
Activează Exact Code Search (pe GitLab.com e on by default pentru planuri plătite; pe Self-Managed necesită instalare Zoekt). Rulează la nivel de grup top-level cu regex mode (butonul .* dreapta casetei de căutare):
Imagini de bază container (incluzând derivate: wordpress, frankenphp, bitnami/php-fpm):
lang:Dockerfile ^FROM.*php
Proiecte Composer ( chiar fără Dockerfile sau cu FROM $BASE_IMAGE):
file:composer\.json$
Pentru fiecare rezultat, confirmă versiunea:
# În containerul rulând
docker exec <container> php -v
# Sau citește Dockerfile-ul
grep ^FROM Dockerfile
Compară cu tabelul de versiuni fixe de mai sus. Lista de dependențe a grupului arată pachete Composer și versiuni framework, nu versiunea runtime PHP.
4. Compară cu inventarul tău de runtime
Scanning-ul static și code search-ul arată ce proiectele declară și construiesc, nu ce rulează. PHP poate rula în afara proiectelor GitLab:
- Web servere cu
mod_phpsauPHP-FPMactivat doar în config - Host-uri configure manual (Ansible, Puppet, Chef)
- Containere care rulează în clustere fără pipeline activ
Pentru Kubernetes, Operational Container Scanning (agent GitLab) scanează imaginile care rulează în clustere — aceeași detecție doar-pachet. Tratează fiecare runtime PHP care apare doar într-una din cele două vizualizări (static vs. runtime) ca un gap de investigat.
–
Verificare de compromitere: semne de exploatare și pași de urgență
Rapoartele de exploatare difera. Cercetătorii de securitate au raportat încercare pe 17 octombrie (înainte de divulgare publică), urmate de alte rapoarte post-lansare. Proiectul PHP nu a identificat exploit-uri funcționale la momentul release-ului. Dacă un server internet-facing a rulat PHP vulnerabil, revizuiește log-urile de la 17 octombrie 2026 onward pentru:
- Request-uri multipart urmate de erori
memory_limitsau HTTP 500 repetate - Cookie-uri
PHPSESSIDde răspuns anormal de mari sau malformate - Restart-uri neexplicate ale worker-ilor PHP, sau procese shell pornite de worker-i PHP
- Fișiere neașteptate pe web server PHP, conexiuni outbound de la worker-i PHP, sau intrări cron neașteptate
Critical: Un exploit reușit poate returna HTTP 200 și lăsa worker-ul rulând — absența erorilor nu exclude compromiterea. Dacă găsești semne:
- Izonează serverul imediat
- Pornește investigație de incident
- Captură memorie, disc, log-uri înainte de patching și restart — restartarea worker-ilor PHP poate șterge dovezi
- Rotește toate credențialele, token-urile, cheile pe care procesul PHP le putea citi
Notă: Scanerele pot flag-ui imaginea gemnasium:6 (depreciată din GitLab 17.9) pentru PHP-ul său bundlat. E folosit doar ca tool CLI, nu gestionează request-uri HTTP, deci nu e exploatabil. Versiune fixată deja livrată sub același tag.
–
Pași practici de acțiune imediată
- Inventariează toate gazdele și containerele care rulează PHP (Ansible, Puppet, cloud inventory,
kubectl get pods -A -o jsonpath='{.items[*].spec.containers[*].image}' | tr ' ' '\n' | grep php | sort -u) - Upgradează runtime-ul PHP la versiunea fixată corespunzătoare (tabelul de mai sus) și restart-ează toate procesele PHP (
systemctl restart php*-fpm nginx apache2/kubectl rollout restart deployment/<php-deployment>) - Rebuild-uiește și redeploy-ează toate imaginile container cu tag-uri flotante (
docker build --pull) - Activează Container Scanning + Scan Execution Policy pe toate grupurile GitLab
- Rulează Exact Code Search cu cele două query-uri de mai sus; validează versiunea fiecărui rezultat
- Compară lista statică cu runtime inventory; investighează gap-urile
- Auditează log-urile de la 17 oct 2026 pe serverele internet-facing; rotește credențialele dacă e cazul
- Documentează tot procesul pentru audit și post-mortem
–
Concluzie
PHP2Shell demonstrează cât de critică e separarea între codul aplicației și runtime-ul care îl execută. Niciun WAF, validare de input, sau update de framework nu mitigează o vulnerabilitate declanșată în motorul PHP înainte ca aplicația să fie încărcată. Singura mitigere reală e upgrade-ul runtime-ului pe fiecare instanță — bare-metal, VM, container, Kubernetes pod, funcție serverless. Folosește instrumentele de descoperire automată (Container Scanning, Orbit, Code Search) pentru a scala investigația, dar validează manual versiunea pe fiecare runtime pe care îl găsești. Și reține: absența erorilor în log-uri nu dovedește lipsa compromiterii. Pentru infrastructură dedicată care rulează workload-uri PHP la scală, dedicated-servers.ro oferă servere fizice cu control total al stack-ului de patching, iar serverspan.ro completează cu soluții de monitoring și management de infrastructură care simplifică inventarierea și remedierea la scară largă.
–