Descoperirea a două vulnerabilități critice de executare de cod la distanță (RCE) în motorul PHP, denumite colectiv PHP2Shell, a scos la suprafață o realitate neplăcută: orice server web care rulează PHP — indiferent de framework, aplicație sau strat de autentificare — era expus la compromitere totală înainte ca orice cod de aplicație să fie executat. Anunțate oficial pe 21 octombrie 2026 de proiectul PHP, faltele CVE-2026-109618 și CVE-2026-109619 au primit scorul maxim de 9.2 pe CVSS v4.0. Ce face acest incident excepțional nu este doar severitatea, ci faptul că exploatarea a început înainte de divulgarea coordonată: honeypot-urile Amazon au înregistrat primele încercări de exploatare pe 17 octombrie, în timp ce detaliile erau încă sub embargo. Articolul de față oferă un ghid tehnic, acționabil, pentru echipele de securitate și platformă care trebuie să localizeze, să patch-eze și să auditeze fiecare instanță PHP din infrastructură — inclusiv cele uitate în containere CI, dashboards interni sau imagini de bază derivate.
Ghid ServerSpan relevant: CVE-2026-12184: Ghid de Patch pentru DoS în PHP-FPM (8.3.32 / 8.4.21 / 8.5.6).
De ce patching-ul la nivel de aplicație nu funcționează și ce versiuni trebuie să folosești
Diferența fundamentală față de vulnerabilitățile obișnuite din biblioteci sau framework-uri este că PHP2Shell rezidă în motorul PHP însuși, la nivelul parsării request-urilor HTTP înainte ca orice cod de aplicație să fie încărcat. Validarea input-ului, autentificarea, actualizarea Composer sau a framework-urilor (Laravel, Symfony, WordPress, Drupal, Magento) nu mitigatează riscul. Confirmarea oficială de la proiectul PHP menționează explicit că un request neautentificat pe Apache cu mod_php poate atinge RCE înainte de orice bootstrap al aplicației.
Versiunile corectate lansate la 21 octombrie 2026, 14:00 UTC:
| Branșă PHP | Versiune corectată | Notă | |––––|––––––-|––| | PHP 8.5.x | 8.5.12 | — | | PHP 8.4.x | 8.4.27 | — | | PHP 8.3.x | 8.3.36 | — | | PHP 8.2.x | 8.2.35 | EOL: 31 decembrie 2026 | | PHP 8.6 RC | 8.6.0RC4 | Imaginea oficială php:8.6-rc era pe RC3 la 21 octombrie — nu conține fixul | | PHP 8.1 și mai vechi | Niciun release oficial | Există backport-uri minime de sursă pentru 7.4, 8.0, 8.1; unele distribuții liverează pachete patch-uite |
Critical: Dacă PHP provine din pachetele distribuției tale (apt, dnf, apk), upgrade-ează pachetul, nu compiles from source. Versiunile pachetelor păstrate de vendor-uri (Ubuntu, Debian, RHEL, Alpine) mențin numărul de versiune upstream vechi și backport-ează fixul. Compară versiunea pachetului, nu output-ul php -v. Iată pachetele corectate conform tracker-urilor de securitate la 22 octombrie 2026:
Pentru mai multe detalii despre această parte a subiectului, vezi Actualizare Importantă: Securitate și Performanță PHP Îmbunătățite pentru Hosting Partajat.
- 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-urile retrase (7.2, 7.3, 8.0) nu primesc fix
După upgrade, restartează fiecare proces care rulează PHP (php-fpm, Apache/mod_php, containere). Pentru containere: reconstruiește imaginile cu docker build --pull dacă folosești tag-uri flotante (php:8, php:8.3, php:8.3-apache, php:latest). Imaginile care pun la punct versiunea patch (php:8.3.35-apache) necesită actualizarea tag-ului înainte de rebuild. Imaginile derivate (wordpress, drupal, bitnami/php-fpm, frankenphp) primesc fixul doar după ce maintainer-ii publică update-uri — verifică upstream înainte de rebuild.
Localizează proiectele PHP din grupurile GitLaB: scanning static vs. inventar runtime
Orice proiect care servește request-uri web prin PHP are nevoie de runtime patch-uit — inclusiv cele uitate: site-uri marketing, dashboards interne, job-uri CI care rulează PHP. GitLab oferă trei niveluri de descoperire statică; folosește-le în această 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 aplică o scan execution policy la nivel de grup pentru a-l activa pe toate proiectele. Rezultatele apar în Vulnerability Report pe default branch. Limitare: Container Scanning detectează doar PHP instalat prin pachete (apt, apk, dnf). PHP compilat din sursă — inclusiv imaginile oficiale php:* — nu are record de pachet, deci un proiect poate trece scanning-ul și tot rula PHP vulnerabil.
2. GitLab Orbit — graful de cunoaștere al proiectelor
Orbit indexează proiecte, pipeline-uri, findings de securitate și cod sursă într-un graf interogabil. 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 imaginile oficiale php:* (pe care Container Scanning le ratează). Orbit nu parsează încă Dockerfile-uri (issue #1416), deci folosește lista pentru a restricționa code search-ul următor. Poți interoga și proiectele cu findings deschise pentru CVE-2026-109618/109619 odată ce scan-urile au rulat. Orbit indexează doar default branch și e în beta pentru Premium/Ultimate pe GitLab.com și Self-Managed.
3. Exact Code Search — găsește Dockerfile-uri și composer.json
Rulează la nivel de grup top-level cu regular expression mode activat (toggle .* dreapta căsuței de căutare):
- Imagini de bază container:
lang:Dockerfile ^FROM.*php— găsește oriceFROMcu nume/tag care conținephp(incluzând derivate:wordpress,frankenphp,bitnami/php-fpm). Așteaptă false positive-uri pe care le eliminate citind rezultatul. - Proiecte Composer:
file:composer\.json$— găsește proiecte PHP chiar dacă nu au Dockerfile sau dacă Dockerfile-ul folosește build args (FROM $BASE_IMAGE).
Exact Code Search acoperă doar default branch. Pe GitLab.com e activat implicit pentru planurile plătite. Pe Self-Managed, admin-ul trebuie să instaleze 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 rulant și compară cu tabelul de mai sus. Lista de dependențe de grup arată pachete Composer și versiuni framework, dar nu versiunea runtime PHP.
4. Compară cu inventarul runtime — găsește găurile
Container Scanning și Code Search arată ce proiectele declară și construiesc, nu ce rulează. PHP poate rula în afara proiectelor GitLab: servere web cu mod_php sau PHP-FPM configurate manual, host-uri manageate prin Ansible/Puppet/Chef, containere în clustere fără pipeline activ. Pentru Kubernetes, Operational Container Scanning scanează imaginile care rulează în clustere (aceeași limitare: doar pachete OS). Tratează fiecare runtime PHP care apare în doar una din cele două viziuni (statică vs. runtime) ca pe o gaură de investigat.
Remediere la scară cu GitLab Duo Agent Platform
Descoperirea este doar jumătate; remedierea la zeci sau sute de proiecte necesită automatizare. GitLab Duo Agent Platform permite rularea pașilor de mai sus pe toate proiectele prin Orbit și Code Search, apoi delegarea muncii repetitive agentilor, lăsând oamenii pe review și merge.
Automatizează fixul. Folosește Agentic Chat pentru a crea un epic cu un issue per proiect afectat și atribuie Developer Flow fiecăruia. Flow-ul deschide un merge request care actualizează tag-ul imaginii de bază sau pachetul la versiunea corectată. Un flow trigger pe evenimentul Assign pornește remedierea în momentul atribuirii issue-ului. Activează Code Review Flow cu custom review instructions pentru o primă review automată care urmează standardele tale. Review-uiește și merge-uiește fiecare MR, apoi închide issue-ul odată ce versiunea corectată e deployată.
Impune cu policies. Policy-ul de merge request approval din Pasul 1 blochează orice schimbare care reintroduce o versiune PHP vulnerabilă fără aprobare, iar scan execution policy-ul menține Container Scanning activ în fiecare proiect — o regresie apare în Vulnerability Report.
Căutările găsesc candidați, dar un inginer securitate/platformă trebuie să revizuiască fiecare match, să rezolve CI includes, și să distinge între ce declară codul și ce rulează efectiv. Un skill exemplu de la echipa GitLab Developer Advocacy (php2shell-inventory) rulează pe GitLab Duo Agent Platform și cu agenți care folosesc GitLab MCP server sau glab CLI (Claude Code, Codex, Cursor). Skill-ul verifică: imagini container, job-uri CI, pachete OS, variabile configuration management, pin-uri Composer, environment-uri. Returnează un tabel de findings citate cu dovezi de deployment și gap-uri deschise. Este read-only — nu face modificări, MR-urile de remediere rămân un pas separat, revizuit. Nu poate confirma ce rulează pe host-uri la care nu are acces — verifică-le direct. Adaptează skill-ul la mediul tău înainte de utilizare.
Verifică semnele de compromitere: logs, memorie, credențiale
Rapoartele de exploatare difere. Cercetătorii de securitate au raportat o încercare de exploatare pe 17 octombrie 2026, înainte de divulgare publică, urmate de altele după release. Proiectul PHP nu a identificat exploit-uri funcționale la momentul lansării. Dacă un server internet-facing a rulat PHP vulnerabil, revizuiește log-urile de la 17 octombrie 2026 încolo pentru:
- Request-uri multipart urmate de erori de memory limit sau răspunsuri HTTP 500 repetitive
- Cookie-uri de răspuns
PHPSESSIDneobișnuit de mari sau malformate - Restart-uri neexplicate ale worker-ilor PHP, sau procese shell pornite de workeri PHP
- Fișiere neașteptate pe serverul web PHP, conexiuni outbound de la workeri PHP, sau intrări cron neașteptate
Atenție: 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, izolează serverul și inițiază investigație de incident. Unde e posibil, capturează memorie, disc și log-uri înainte de patching și restart. Restartarea workerilor PHP poate șterge dovezi. CVE-2026-109619 poate expune memoria procesului chiar și atunci când atacatorul nu atinge executare de cod. Rotirește orice credențiale, token-uri sau chei pe care procesul PHP le putea citi.
Notă: Scanerele pot flag-ui imaginea de dependency scanning Gemnasium (
gemnasium:6), deprecată din GitLab 17.9, pentru PHP-ul său bundlat. E folosită doar ca tool linie de comandă și nu gestionează request-uri HTTP, deci nu e exploatabilă. O versiune corectată a fost livrată deja sub același tag.
–
Pași practici immediati
- Inventariează toate host-urile și containerele care rulează PHP (inclusiv CI jobs, imagini de bază derivate, servere cu mod_php/PHP-FPM configurate manual).
- Upgrade-ează runtime-ul PHP la versiunile corectate (tabelul de mai sus) sau pachetele distribuției respective — restartează toate procesele PHP.
- Reconstruiește imaginile container cu
docker build --pull; actualizează tag-urile la versiuni patch-uite fixe înainte de rebuild. - Activează Container Scanning + Scan Execution Policy pe grupul top-level GitLab; rulează Exact Code Search pentru
lang:Dockerfile ^FROM.*phpșifile:composer\.json$. - Compară rezultatele statice cu inventarul runtime (CMDB, Ansible, Kubernetes Operational Container Scanning) — investighează discrepanțele.
- Auditează log-urile de la 17 octombrie 2026 pentru indicatorii de compromitere listai mai sus; rotiți credențialele accesibile procesului PHP.
- Automatizează remedierea la scară cu GitLab Duo Agent Platform (Agentic Chat → Developer Flow → Code Review Flow) și impune regression policy-uri.
–
PHP2Shell ne amintește că vulnerabilitățile la nivel de runtime necesită o abordare de defense in depth: patching rapid la nivel de OS/container, descoperire continuă prin scanning static și runtime, automatizare a remedierei la scară, și forensic rigorosă pentru detectarea compromiterilor trecute. Echipele care integrează aceste practici în pipeline-urile GitLab și în procesele de change management reduc fereastra de expunere de la zile la minute. Pentru infrastructură dedicată care rulează workload-uri PHP critice, asigură-te că server-ele sunt monitorizate la nivel de hardware și OS — o platformă ca dedicated-servers.ro oferă control total și izolare pentru a aplica patch-uri critice fără compromiseri de performanță sau securitate. La fel, pentru soluții de gazdare gestionată cu suport expert Linux, serverspan.ro pune la dispoziție administrare proactivă și hardening continuu.