Pe 21 octombrie 2026, proiectul PHP a publicat actualizări de urgenta pentru două vulnerabilități critice de execuție remote a codului, cunoscute colectiv sub numele de PHP2Shell (CVE-2026-109618 și CVE-2026-109619). Ambele obțin scorul 9.2 pe CVSS v4.0 și rezidă în motorul PHP — nu într-un framework, bibliotecă sau cod de aplicație. Aceasta înseamnă că niciun patch la nivel de aplicație, validare input sau actualizare Composer nu poate mitiga riscul. Orice server web care rulează PHP (Apache cu mod_php, NGINX cu PHP-FPM, containere, VM-uri) este expus. Exploatarea poate avea loc înainte ca orice cod de aplicație să ruleze, printr-o cerere HTTP neautentificată. Dacă administrezi servere dedicate, VPS-uri sau clustere Kubernetes care servesc aplicații PHP — WordPress, Magento, Laravel, Symfony, Drupal sau dashboade interne — acest articol îți oferă planul concret de acțiune: versiunile exacte de actualizat, pachetele de distribuție confirmate, comenzi pentru reconstrucția imaginilor container, metodele de inventariere a proiectelor PHP în GitLab și indicatorii de compromitere pe care trebuie să îi monitorizezi starting 17 octombrie 2026.
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 în codul tău — este o defectare în motorul PHP care procesează cererile HTTP. Atacatorul trimite o cerere special construită (multipart, cu manipulare a PHPSESSID sau a limitelor de memorie) și motorul PHP execută cod arbitrar în contextul worker-ului PHP, înainte ca routerul, middleware-ul sau controllerul tău să fie invocați. GitLab a confirmat că produsele sale nu sunt afectate (GitLab.com, Self-Managed, Dedicated) deoarece aplicația nu e scrisă în PHP și nu rulează PHP pentru a servi cereri web. Dar acest lucru nu te scutură: dacă ai orice serviciu care rulează PHP — un site WordPress pe un VPS, un container php:8.3-apache în Kubernetes, un dashboard intern pe un server dedicat, un job CI care folosește imaginea php:8.2-cli — trebuie să actualizezi runtime-ul PHP în sine.
Pentru mai multe detalii despre această parte a subiectului, vezi Actualizare Importantă: Securitate și Performanță PHP Îmbunătățite pentru Hosting Partajat.
Două detalii critice din timeline-ul public: Amazon MadPot a detectat prima încercare de exploatare pe 17 octombrie 2026, patru zile înainte de divulgherea coordonată. Cloudflare a implementat reguli WAF înainte de patch-uri, dar le consideră doar măsuri temporare. Chainguard a publicat imagini patch-uite pe 21 octombrie la 07:41 UTC — peste șase ore înainte de termenul embargo-ului — permițând analiză diferențială a patch-urilor. Dacă serverul tău a fost expus pe internet între 17 și 21 octombrie, trebuie să presupui compromitere și să urmezi secțiunea de investigație de mai jos.
Versiunile PHP corrigate și pachetele de distribuție — ce trebuie să actualizezi acum
Proiectul PHP a lansat patru versiuni stabile patch-uite pe 21 octombrie 2026:
| Branșă PHP | 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 decembrie 2026 — planează migrarea | | PHP 8.6 RC | 8.6.0RC4 | RC3 nu conține fixul; imaginea php:8.6-rc era pe RC3 la 21 oct | | PHP 8.1 și mai vechi | Niciun release oficial | Backport-uri minime de sursă pentru 7.4, 8.0, 8.1; unele distribuții livreză pachete patch-uite |
Regulă de aur: dacă PHP-ul tău vine din pachete de distribuție (apt, dnf, apk), actualizează pachetul, nu compara php -v. Distribuțiile backport-ează fixul menținând numărul de versiune upstream. Versiunile pachetelor confirmate la 22 octombrie 2026:
# Ubuntu 26.04
apt update && apt install php8.5=8.5.4-0ubuntu1.5
# Ubuntu 24.04 (PHP 8.3)
apt update && apt install php8.3=8.3.6-0ubuntu0.24.04.13
# Ubuntu 22.04 (PHP 8.1 — backport distribuție)
apt update && apt install php8.1=8.1.2-1ubuntu2.28
# Debian 13 (PHP 8.4)
apt update && apt install php8.4=8.4.27-1~deb13u1
# Debian 12 (PHP 8.2)
apt update && apt install php8.2=8.2.35-1~deb12u1
# Alpine 3.24
apk upgrade php83=8.3.36-r0 php84=8.4.27-r0 php85=8.5.12-r0
# RHEL 9 (module streams)
dnf module update php:8.2 # 8.2.35-1 (RHSA-2026:87072)
dnf module update php:8.3 # 8.3.36-1 (RHSA-2026:87079)
# php:8.4 nu avea fix la 22 oct — verifică RHSA-2026:87071 pentru RHEL 10
După actualizare, restartează toate procesele care rulează PHP:
# PHP-FPM
systemctl restart php8.3-fpm # sau php8.2-fpm, php8.4-fpm etc.
# Apache cu mod_php
systemctl restart apache2 # sau httpd pe RHEL
# NGINX + PHP-FPM (restartează doar FPM; NGINX nu rulează PHP)
systemctl restart php8.3-fpm
Reconstruiește imaginile container — nu uita --pull
Dockerfile-urile care folosesc tag-uri flotante (php:8, php:8.3, php:8.3-apache, php:latest) trebuie reconstruite cu --pull pentru a prelua baza patch-uită:
docker build --pull -t registry.example.com/app:php2shell-fix .
docker push registry.example.com/app:php2shell-fix
# Actualizează deployment-ul Kubernetes / Docker Compose / Swarm
kubectl set image deployment/app app=registry.example.com/app:php2shell-fix
Dacă Dockerfile-ul pune tag explicit (FROM php:8.3.35-apache), schimbă tag-ul în versiunea fixată (php:8.3.36-apache) înainte de rebuild. Imaginile derivate (wordpress, drupal, bitnami/php-fpm, frankenphp) primesc fixul doar după ce maintainer-ii publică update — verifică upstream-ul înainte să reconstruești.
Notă pentru infrastructură gestionată: Dacă folosești servere dedicate sau VPS-uri administrate de un provider, verifică SLA-ul de patching OS. La dedicated-servers.ro patch-urile de securitate critice sunt aplicate în fereastra de mentenanță urmatoare sau on-demand la cerere; pentru medii containerizate pe serverspan.ro imagini de bază PHP sunt actualizate automat în registry-ul intern la lansarea patch-urilor upstream.
Cum localizezi proiectele PHP vulnerabile în GitLab și în infrastructura ta
GitLab oferă trei straturi de descoperire statică (cod sursă + imagini buildate) plus o comparare cu inventarul runtime. Folosește-le în această ordine:
1. Container Scanning — detectează PHP instalat ca pachet OS
Activează template-ul în .gitlab-ci.yml (sau la nivel de grup cu Scan Execution Policy):
include:
- template: Security/Container-Scanning.gitlab-ci.yml
Container Scanning raportează CVE-urile în pachete apt/apk/dnf. Limita: PHP compilat din sursă (imaginile oficiale php:*) nu are record de pachet — un proiect poate trece scanning-ul și tot rulează PHP vulnerabil.
2. GitLab Orbit — grafic interogabil al proiectelor cu PHP
Cu Orbit activat pe grupul top-level, poți interoga un agent:
„Listează toate proiectele care conțin cod PHP, inclusiv cele care compilează PHP sau folosesc imagini
phpoficiale.”
Orbit indexează branch-ul default și e în beta pe Premium/Ultimate (GitLab.com și Self-Managed). Nu parsează încă Dockerfile-uri (issue #1416) — folosește lista pentru a restrânge code search-ul.
3. Exact Code Search — găsește Dockerfile-uri și composer.json
Activează regex search (butonul .* în search box) la nivel de grup top-level:
Container base images (inclusiv 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 Dockerfile
grep -i '^FROM.*php' Dockerfile
# Sau în containerul rulând
docker exec <container> php -v
Compara cu tabelul de versiuni fixate de mai sus. Group Dependency List arată versiuni Composer/framework, nu runtime PHP.
4. Compară cu inventarul runtime — găsești gap-urile
Scanning-ul și code search-ul arată ce declari și build-ezi, nu ce rulează. PHP poate rula:
- Pe servere cu
mod_php/PHP-FPMactivat doar în configurație (gestionat manual sau Ansible/Puppet/Chef) - În containere deployate direct în cluster fără pipeline activ
- Pe VM-uri خارج GitLab
Acțiune: Extrage inventarul runtime din CMDB, Ansible facts, cloud asset inventory, sau Operational Container Scanning pentru Kubernetes (scanează imaginile care rulează efectiv în cluster). Orice runtime PHP care apare doar într-unul din cele două vizualizări (static vs. runtime) e un gap de investigat.
Verificare de compromitere și pași de respondere la incident
Dacă un server internet-facing a rulat PHP vulnerabil începând cu 17 octombrie 2026, analizează log-urile pentru:
| Indicator | Ce caută | |––––|–––-| | Cereri multipart urmate de erori memory_limit sau HTTP 500 repetate | Exploatare CVE-2026-109618 (heap overflow prin multipart parsing) | | Cookie-uri PHPSESSID anormal de mari sau malformate în response | Manipulare sesiune CVE-2026-109619 | | Restart-uri neexplicate ale worker-ilor PHP, sau procese shell pornite de worker-i PHP | RCE reușit | | Fișiere neașteptate pe document root, conexiuni outbound de la worker-i PHP, cron jobs noi | Post-exploitation | | Absența erorilor NU exclude compromiterea — exploit-ul poate returna HTTP 200 și lăsa worker-ul viu | — |
Dacă găsești semne de exploatare:
- Izonează serverul (security group, firewall, detach din load balancer)
- Captură memorie (
LiME,avml), disc (dd/dc3dd), log-uri înainte de patch/restart — restartul worker-ilor PHP poate șterge dovezi din memorie - Rotește toate credențialele, token-urile, cheile SSH/API pe care procesul PHP putea citi (variabile de mediu, fișiere config, vault mounts)
- Investighează lateral movement — CVE-2026-109619 poate expune memoria procesului chiar fără RCE
Notă: Scannerele pot flag-ui imaginea
gemnasium:6(depreciată din GitLab 17.9) pentru PHP-ul bundlat. E folosită doar ca CLI tool, nu servește request-uri HTTP — nu e exploatabilă. Versiune fixată deja livrată sub același tag.
–
Pași practici de acțiune imediată
- Inventariază toate host-urile, VM-urile, containerele și imaginile care rulează PHP (runtime, nu doar cod sursă)
- Actualizează runtime-ul PHP la versiunile fixate (tabelul de mai sus) — pachete de distribuție SAU rebuild container cu
--pull - Restartează toate procesele PHP (FPM, mod_php, CLI long-running)
- Activează Container Scanning + Scan Execution Policy pe grupul GitLab top-level
- Rulează Exact Code Search cu cele două query-uri regex; validează versiunea fiecărui rezultat
- Compară rezultatele statice cu inventarul runtime (Ansible, CMDB, K8s operational scanning)
- Analizează log-urile de la 17 octombrie 2026 încoace pe sistemele internet-facing pentru indicatorii de compromitere
- Documentă și închide fiecare gap identificat; rotește credențialele dacă e cazul
–
Concluzie
PHP2Shell demonstră o realitate dură: o vulnerabilitate în runtime-ul de bază nu se repară la nivel de aplicație. Niciun WAF, niciun framework, niciun composer update nu te scutură — trebuie să actualizezi motorul PHP pe fiecare instanță care procesează request-uri HTTP. Folosește instrumentele GitLab (Container Scanning, Orbit, Code Search) pentru a mapa expunerea statică, dar validează obligatoriu împotriva inventarului runtime — acolo se ascund serverele configurează manual, containerele orphan și VM-urile uitate. Dacă ai servere expuse pe internet în fereastra 17–21 octombrie, tratează-le ca potențial compromise și urmează protocolul de forensică înainte de patch. Pregătirea infrastructurii pentru patch-uri rapide de runtime — imagini de bază actualizate automate, pipeline-uri de rebuild/test/deploy, inventar runtime sincronizat — e diferența între o mentenanță planificată și o criză de securitate. Dedicated-servers.ro și serverspan.ro îți oferă infrastructură cu patch management proactiv și registry-uri container actualizate continuu — astfel încât次の PHP2Shell să te prindă pregătit.