Publicat în

PHP2Shell: CVE-2026-109618 și CVE-2026-109619 — Ghid complet de patching și investigare pentru infrastructură Linux

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.

–

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ă.

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_php sau PHP-FPM activat 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_limit sau HTTP 500 repetate
  • Cookie-uri PHPSESSID de 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:

  1. Izonează serverul imediat
  2. Pornește investigație de incident
  3. Captură memorie, disc, log-uri înainte de patching și restart — restartarea worker-ilor PHP poate șterge dovezi
  4. 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ă

  1. 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)
  2. 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>)
  3. Rebuild-uiește și redeploy-ează toate imaginile container cu tag-uri flotante (docker build --pull)
  4. Activează Container Scanning + Scan Execution Policy pe toate grupurile GitLab
  5. Rulează Exact Code Search cu cele două query-uri de mai sus; validează versiunea fiecărui rezultat
  6. Compară lista statică cu runtime inventory; investighează gap-urile
  7. Auditează log-urile de la 17 oct 2026 pe serverele internet-facing; rotește credențialele dacă e cazul
  8. 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ă.

–

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *