Detalii despre vulnerabilitățile critice din PHP au fost dezvăluite și au fost publicate actualizări corective.

S-au publicat actualizări corective pentru PHP 8.5.12, 8.4.27, 8.3.36 și 8.2.35, precum și patch-uri pentru ramurile deja neacceptate PHP 7.4, PHP 8.0 și PHP 8.1 (versiunile vulnerabile din 5.4 până în 7.3 rămân fără patch-uri), în care au fost corectate două vulnerabilități critice:

  • CVE-2026-109618 — execuție de cod de la distanță, provocată de faptul că, în cazul epuizării memoriei disponibile pentru proces, handler-ul de eroare de memorie poate întrerupe interpretatorul PHP într-o stare în care doar o parte din structurile interne asociate cu procesarea cererii sunt inițializate. Ulterior, funcția de finalizare a procesării cererii accesează aceste structuri ca și cum ar fi fost deja inițializate, deși memoria pentru ele nu este alocată.

    Principala metodă de atac constă în manipularea cererilor multipart pentru a crea condiții care să ducă la epuizarea memoriei disponibile pentru proces. Pentru a ocoli limita post_max_size, antetul Content-Length poate să nu fie specificat, iar un număr uriaș de antete HTTP poate fi trimis. Este posibilă și realizarea de atacuri punctuale asupra anumitor operațiuni din aplicațiile PHP care consumă excesiv memorie. Prezența unui exploit este confirmată pentru mod_php, deoarece acesta apelează funcția shutdown() chiar și în caz de eroare. PHP-FPM va închide procesul fiu în caz de eroare, ceea ce îngreunează realizarea atacului, dar teoretic nu o exclude.

  • CVE-2026-109619 — execuție de cod de la distanță, cauzată de accesarea memoriei după eliberare din cauza curățării incorecte a stării globale asociate cu o cerere specifică. În cazul întreruperii cererii din cauza unei erori fatale, timp de așteptare sau a unei lipsuri de memorie, starea globală poate să nu fie resetată, iar pointerele rămân active, în ciuda eliberării memoriei la care se referă. Când se procesează următoarea cerere în același proces, poate avea loc accesarea stării globale vechi prin intermediul pointerului rămas.

    Pentru utilizare, poate fi creat un mediu care epuizează memoria disponibilă în timpul procesării cererilor multipart în cod pentru a indica progresul încărcării (session.upload_progress). Ca vector principal și confirmat al atacului este menționat handler-ul fatal_error_backtraces în PHP 8.5, care nu resetează starea de urmărire la finalizare. În primul caz, atacul este posibil pe mod_php și PHP-FPM, iar în al doilea doar pe mod_php. De asemenea, se menționează o posibilitate neconfirmată de a desfășura un atac în configurațiile ale căror setări conțin directive care provoacă emiterea de avertismente în etapa incipientă a procesării cererii (de exemplu, avertismente legate de utilizarea parametrilor învechiți).

Se afirmă că blocarea completă a vulnerabilităților este posibilă doar prin instalarea actualizării. Următoarele măsuri pot reduce probabilitatea desfășurării cu succes a atacurilor, dar nu fac sistemul complet sigur:

  • Setarea în php.ini a parametrului „memory_limit=-1”, ceea ce îngreunează controlul de către atacator asupra epuizării limitelor de memorie.
  • Setarea parametrului „post_max_size = 8M”, dacă nu este necesară încărcarea fișierelor mari. Valoarea parametrului „upload_max_filesize” ar trebui să fie mai mică decât parametrul „post_max_size”.
  • Stabilirea unei limite pentru consumul permis de memorie la nivel de sistem, prin cgroup memory.max sau parametrii de consum de memorie ai containerului, dar nu prin limitele de sistem RLIMIT_AS și RLIMIT_DATA, care doar provocă apeluri problematice longjmp().
  • Dacă performanța nu este critică, se poate limita numărul de cereri procesate de un singur proces de muncă prin pm.max_requests=1 în PHP-FPM și MaxRequestsPerChild în Apache httpd.
  • Setarea la nivel de php.ini sau configurație server (nu prin ini_set() sau FPM .user.ini, deoarece parametrul trebuie să funcționeze înainte de a începe procesarea cererii) a parametrului „session.upload_progress.enabled=0.
  • Atunci când se utilizează versiunea PHP 8.5, trebuie setat parametrul „fatal_error_backtraces=0”.
  • Eliminarea setărilor învechite sau eronate legate de cereri specifice (de tip assert.* și căi incorecte în open_basedir), care duc la emiterea de mesaje de diagnosticare înainte de inițializare.
  • Eliminarea în codul PHP a situațiilor care conduc la atingerea timeout-urilor și erorilor fatale, cum ar fi cele legate de eșecurile în handler-ele callback și procesarea încărcărilor.
  • Pentru a bloca prima vulnerabilitate în codul versiunilor vechi de PHP, se poate înlocui apelul longjmp() din handler-ul de epuizare a memoriei libere cu _exit().
  • De asemenea, se poate reduce valoarea parametrului max_input_nesting_level din php.ini și se pot bloca cererile multipart, așa cum a fost arătat în anunțul preliminar.

Starea remedierii vulnerabilităților în distribuții poate fi evaluată pe aceste pagini: Debian, Ubuntu, SUSE, RHEL, Gentoo, Arch,
Fedora, FreeBSD.

Anexa 1: Vulnerabilitățile au fost identificate folosind modelele AI GPT‑5.6 și Gemini 4 Argon. Compania OpenAI a publicat utilitarul php2shell-checker pentru a verifica expunerea site-urilor și a fișierelor executabile locale la vulnerabilități, dar acest utilitar verifică doar numărul versiunii PHP returnat de serverul HTTP sau prin comanda „php -v”, fără o analiză detaliată.

Anexa 2: Autorul prototipului exploit-ului care folosește vulnerabilitatea cauzată de eliberarea dublă a memoriei (double-free) a declarat că problema rămâne nerezolvată în versiunea PHP 8.5.12 și exploit-ul continuă să funcționeze. Anterior, reprezentanții PHP au afirmat că această vulnerabilitate nu este legată de corecturile planificate și nu reprezintă o problemă reală. Totuși, autorul exploit-ului a susținut că reprezintă o vulnerabilitate complet diferită.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster