PHP2Shell: due vulnerabilità critiche in PHP. Come proteggere i server Linux

22 ottobre 2026 11 min di lettura

PHP2Shell: scopri le vulnerabilità CVE-2026-109618 e CVE-2026-109619, i rischi per Apache e PHP-FPM e come aggiornare PHP su Debian e Ubuntu.

PHP2Shell: due vulnerabilità critiche in PHP. Come proteggere i server Linux

Il 21 ottobre 2026 sono state divulgate due gravi vulnerabilità di sicurezza che interessano PHP, uno dei linguaggi di programmazione più diffusi per lo sviluppo di siti web e applicazioni online.

Le vulnerabilità, identificate come CVE-2026-109618 e CVE-2026-109619 e conosciute collettivamente con il nome di PHP2Shell, hanno ricevuto entrambe un punteggio CVSS 4.0 di 9,2 su 10.

Il rischio principale è la possibilità che un attaccante riesca, in determinate condizioni, a eseguire codice da remoto sul server senza autenticazione.

La vicenda è particolarmente importante perché il problema non riguarda necessariamente il codice sviluppato per un’applicazione, ma direttamente l’interprete PHP, cioè il componente che esegue il codice delle applicazioni web.

Questo significa che anche un sito sviluppato seguendo le migliori pratiche di sicurezza può risultare vulnerabile se utilizza una versione di PHP interessata dal problema.

In questo articolo vediamo cosa è successo, come funzionano le due vulnerabilità, quali server possono essere interessati e soprattutto come verificare e aggiornare PHP su Debian e Ubuntu.

Cosa è successo il 21 ottobre 2026

La vicenda è iniziata il 20 ottobre, quando sono emersi anticipatamente dettagli relativi a due vulnerabilità critiche nel motore PHP.

La divulgazione coordinata era inizialmente prevista per il 22 ottobre, ma la diffusione anticipata di informazioni tecniche ha portato il PHP Security Team ad accelerare la pubblicazione degli aggiornamenti.

Il 21 ottobre sono state rilasciate le versioni corrette e pubblicati gli advisory ufficiali.

Numerose organizzazioni di cybersecurity hanno richiamato l’attenzione sulla necessità di aggiornare rapidamente i sistemi esposti a Internet.

Le due vulnerabilità sono particolarmente pericolose perché possono consentire una Remote Code Execution, abbreviata RCE.

Una vulnerabilità RCE permette a un attaccante di eseguire istruzioni su un sistema remoto. Nel caso di PHP, il codice viene inizialmente eseguito con i privilegi del processo compromesso.

Questo non significa necessariamente ottenere immediatamente i privilegi di amministratore del server, ma può comunque consentire attività molto gravi, come accedere ai file dell’applicazione, leggere dati riservati, recuperare credenziali o tentare ulteriori compromissioni.

Perché PHP2Shell è diverso da una normale vulnerabilità web

Per capire il problema dobbiamo considerare come funziona normalmente un’applicazione PHP.

Quando un utente apre una pagina web, il browser invia una richiesta HTTP al server. Apache o Nginx ricevono la richiesta e, quando necessario, la passano all’interprete PHP.

PHP esegue il codice dell’applicazione, eventualmente interroga un database e genera una risposta che viene restituita al browser.

Quando parliamo di vulnerabilità web, spesso pensiamo a SQL Injection, Cross-Site Scripting oppure a errori nell’autenticazione.

In questi casi il problema riguarda generalmente il codice dell’applicazione o il modo in cui vengono gestiti gli input dell’utente.

Con PHP2Shell, invece, il problema si trova a un livello differente.

Le vulnerabilità interessano il funzionamento interno dell’interprete PHP, in particolare alcune operazioni di gestione della memoria e del ciclo di vita delle richieste.

Nel caso di Apache con mod_php è stato dimostrato un percorso di sfruttamento che può raggiungere la vulnerabilità prima ancora che il codice dell’applicazione venga eseguito.

È proprio questo uno degli aspetti più delicati: la sicurezza del codice applicativo non è sufficiente a proteggere da una vulnerabilità presente nel runtime sottostante.

CVE-2026-109618: corruzione della memoria durante un errore Out Of Memory

La prima vulnerabilità, CVE-2026-109618, riguarda la gestione della memoria quando PHP incontra una condizione di Out Of Memory, abbreviata OOM.

Una condizione OOM si verifica quando un processo non riesce a ottenere la memoria necessaria per completare un’operazione.

PHP mette a disposizione una direttiva chiamata memory_limit, utilizzata per limitare la quantità di memoria che uno script può utilizzare.

Quando un’operazione supera il limite previsto, PHP deve interromperla e gestire correttamente l’errore.

La vulnerabilità nasce proprio in questa fase.

In determinate circostanze, la gestione dell’errore può lasciare alcune strutture interne in uno stato parzialmente inizializzato. Durante la successiva pulizia della richiesta, PHP può utilizzare queste strutture come se fossero valide.

Questo comportamento può provocare una corruzione della memoria e, attraverso un attacco opportunamente costruito, arrivare all’esecuzione di codice da remoto.

Uno dei percorsi di sfruttamento documentati coinvolge l’elaborazione di richieste HTTP di tipo multipart/form-data, comunemente utilizzate dai form web e dai sistemi di caricamento dei file.

Il problema non dipende necessariamente dall’accettazione di un file dannoso da parte dell’applicazione, ma può manifestarsi durante l’elaborazione della richiesta da parte dell’interprete stesso.

CVE-2026-109619: il problema dello Use After Free

La seconda vulnerabilità, CVE-2026-109619, è legata alla gestione dello stato interno tra richieste successive.

Per capire il problema dobbiamo ricordare che molti processi PHP vengono riutilizzati per gestire più richieste nel corso della propria esistenza.

Durante l’elaborazione di una richiesta, PHP mantiene in memoria diverse strutture e informazioni temporanee.

Quando la richiesta termina, queste risorse devono essere eliminate o reinizializzate correttamente.

In alcune condizioni di errore, però, determinati riferimenti possono continuare a puntare a memoria già liberata.

Questa situazione è conosciuta come Use After Free.

Il programma tenta cioè di utilizzare una porzione di memoria dopo averla liberata.

Se una richiesta successiva riutilizza quei riferimenti, può verificarsi una corruzione della memoria, potenzialmente sfruttabile per modificare il comportamento del processo.

Anche per questa vulnerabilità sono stati dimostrati scenari di esecuzione di codice da remoto.

Le due CVE hanno quindi cause tecniche differenti, ma condividono un elemento fondamentale: riguardano il motore PHP e non una particolare applicazione sviluppata con questo linguaggio.

Quali versioni di PHP sono vulnerabili?

Il PHP Security Team ha pubblicato aggiornamenti per i rami supportati.

Ramo PHP Prima versione corretta
PHP 8.5 8.5.12
PHP 8.4 8.4.27
PHP 8.3 8.3.36
PHP 8.2 8.2.35

Le versioni precedenti all’interno di questi rami sono interessate dalle vulnerabilità, salvo che il fornitore del sistema operativo abbia già integrato le correzioni tramite backport.

Le versioni PHP 8.1 e precedenti non ricevono più il normale supporto del progetto PHP. Alcuni fornitori possono comunque distribuire patch specifiche, ma in questi casi è consigliabile pianificare una migrazione verso un ramo supportato.

Apache con mod_php e PHP-FPM: quali sono le differenze?

Le vulnerabilità possono interessare diverse modalità di esecuzione di PHP:

  • Apache con mod_php
  • PHP-FPM
  • php-cgi
  • FrankenPHP
  • LiteSpeed

Non tutte le configurazioni presentano però lo stesso livello di esposizione.

Apache con mod_php è lo scenario considerato maggiormente a rischio, perché è stato dimostrato un percorso di sfruttamento che non richiede l’esecuzione del codice applicativo.

Anche PHP-FPM può essere vulnerabile, ma i percorsi di sfruttamento possono richiedere condizioni differenti.

Questo non significa che PHP-FPM possa essere escluso dagli aggiornamenti.

La raccomandazione è aggiornare tutte le installazioni vulnerabili utilizzate per gestire richieste web.

Come verificare la versione PHP su Debian e Ubuntu

Passiamo adesso alla parte pratica.

Il primo controllo consiste nell’identificare quali versioni di PHP sono installate sul server.

Verificare la versione PHP da terminale

Possiamo iniziare con:

php -v

Il comando restituisce la versione PHP utilizzata nell’ambiente a riga di comando.

Attenzione però: questa potrebbe non essere la stessa versione utilizzata da Apache o da un altro server web.

Visualizzare i pacchetti PHP installati

Su Debian e Ubuntu possiamo utilizzare:

dpkg -l | grep '^ii' | grep php

Questo comando permette di individuare i pacchetti installati, compresi l’interprete PHP e le relative estensioni.

Per ottenere un elenco con nome e versione completa dei pacchetti PHP possiamo eseguire:

dpkg-query -W \
  -f='${db:Status-Abbrev} ${binary:Package} ${Version}\n' \
  'php*' 2>/dev/null | grep '^ii'

La versione completa del pacchetto è importante perché può contenere informazioni sugli aggiornamenti di sicurezza distribuiti dalla distribuzione.

Verificare quale PHP utilizza Apache

La prima cosa da fare è capire come Apache esegue PHP.

apache2ctl -M | grep -E 'php|proxy_fcgi'

Se troviamo:

php_module (shared)

Apache ha caricato il modulo PHP.

Possiamo verificare quale versione del modulo è abilitata con:

ls -l /etc/apache2/mods-enabled/php*.load

Se invece troviamo:

proxy_fcgi_module (shared)

Apache dispone del modulo necessario per utilizzare un backend FastCGI, ma dobbiamo verificare nella configurazione se il sito utilizza effettivamente PHP-FPM.

Possiamo cercare i riferimenti ai socket PHP-FPM:

grep -R -E 'php[0-9.]+-fpm.sock|SetHandler|ProxyPassMatch' \
  /etc/apache2/sites-enabled/ \
  /etc/apache2/conf-enabled/

Per esempio, una configurazione che contiene:

/run/php/php8.4-fpm.sock

indica che il relativo VirtualHost è configurato per comunicare con PHP 8.4-FPM.

Possiamo quindi verificare la versione dell’eseguibile:

php-fpm8.4 -v

Se il server ospita più siti, occorre verificare la configurazione del VirtualHost specifico.

Come aggiornare PHP con APT

Una volta identificati i pacchetti PHP utilizzati dal server possiamo procedere con gli aggiornamenti.

Prima di intervenire su un server di produzione è opportuno verificare la compatibilità delle applicazioni, programmare l’intervento e disporre di un piano di ripristino.

Aggiornare l’indice dei pacchetti

sudo apt update

Questo comando aggiorna l’elenco delle versioni disponibili nei repository configurati, senza modificare i pacchetti installati.

Verificare gli aggiornamenti disponibili

apt list --upgradable 2>/dev/null | grep php

Possiamo anche controllare la versione installata e quella candidata all’aggiornamento:

apt policy php8.4-fpm

Naturalmente dobbiamo adattare il nome del pacchetto alla versione PHP utilizzata.

Aggiornare solamente PHP

Se utilizziamo PHP-FPM 8.4 possiamo eseguire una simulazione:

sudo apt install --only-upgrade --dry-run php8.4-fpm

Dopo aver verificato le modifiche previste:

sudo apt install --only-upgrade php8.4-fpm

Se Apache utilizza mod_php:

sudo apt install --only-upgrade libapache2-mod-php8.4

APT può aggiornare anche le dipendenze necessarie, come php8.4-common.

È importante controllare tutti i componenti PHP installati, comprese le estensioni, ed evitare di aggiornare esclusivamente il metapacchetto generico php.

I comandi mostrati si riferiscono a PHP 8.4: se il server utilizza un altro ramo, bisogna adattarli.

Riavviare Apache o PHP-FPM

Dopo l’aggiornamento è necessario riavviare i processi che utilizzano PHP.

Se Apache utilizza mod_php:

sudo apache2ctl configtest
sudo systemctl restart apache2

Se utilizziamo PHP-FPM 8.4:

sudo systemctl restart php8.4-fpm

Verifichiamo poi che il servizio sia attivo:

systemctl status php8.4-fpm

Il riavvio è importante perché i processi già in esecuzione potrebbero continuare a utilizzare componenti caricati prima dell’aggiornamento.

Attenzione ai backport di sicurezza

Questo è uno degli aspetti più importanti quando lavoriamo con distribuzioni come Debian e Ubuntu.

Una distribuzione Linux non sempre aggiorna un software alla versione upstream più recente.

Può invece integrare una correzione di sicurezza nella versione già distribuita.

Questo meccanismo viene chiamato backport.

Di conseguenza, una versione PHP apparentemente precedente a quelle corrette dal progetto PHP non è necessariamente vulnerabile.

Per determinare se il server è protetto dobbiamo verificare la versione completa del pacchetto e consultare gli advisory ufficiali della distribuzione.

In particolare, non dobbiamo considerare il solo output di php -v come prova definitiva dell’applicazione delle patch.

Mitigazioni temporanee: cosa fare se non possiamo aggiornare subito

In alcuni ambienti produttivi potrebbe non essere possibile applicare immediatamente gli aggiornamenti.

Il PHP Security Team ha documentato alcune misure temporanee per ridurre determinati percorsi di sfruttamento.

Tra queste rientrano, a seconda della vulnerabilità e della configurazione, modifiche alle direttive:

memory_limit = -1
session.upload_progress.enabled = Off

La prima disabilita il limite di memoria imposto direttamente da PHP e richiede particolare attenzione, perché può aumentare il rischio di esaurimento delle risorse del server.

La seconda disabilita la funzionalità di monitoraggio dell’avanzamento degli upload associata alle sessioni PHP.

Queste impostazioni devono essere valutate consultando gli advisory ufficiali, considerando la versione e la configurazione del server e riavviando i processi interessati.

Nessuna di queste mitigazioni rappresenta una correzione completa delle vulnerabilità.

Quando non è possibile aggiornare rapidamente un sistema esposto a Internet, è opportuno considerare anche misure più incisive, come limitarne l’accessibilità pubblica o sospendere temporaneamente il servizio.

Dopo l’aggiornamento: verificare che il server sia protetto

Una volta installati gli aggiornamenti, è necessario verificare che i servizi funzionino correttamente e che le patch siano effettivamente presenti.

Possiamo iniziare controllando nuovamente i pacchetti installati:

dpkg -l | grep '^ii' | grep php

Successivamente possiamo verificare lo stato dei servizi:

systemctl status apache2
systemctl status php8.4-fpm

Naturalmente il secondo comando è necessario soltanto se utilizziamo PHP-FPM.

Per esaminare gli ultimi eventi del servizio PHP-FPM possiamo utilizzare:

journalctl -u php8.4-fpm -n 50

È inoltre opportuno controllare gli error log di Apache e PHP e verificare il funzionamento delle applicazioni.

E se il server fosse già stato compromesso?

Questo è un aspetto particolarmente importante.

Quando viene divulgata una vulnerabilità critica, aggiornare il software impedisce lo sfruttamento futuro del problema corretto, ma non elimina eventuali conseguenze di una compromissione già avvenuta.

Per questo motivo dovremmo analizzare anche i log precedenti all’aggiornamento.

Tra gli elementi da approfondire troviamo errori ripetuti di memoria, crash anomali dei processi PHP, richieste HTTP sospette e processi inattesi avviati dall’utente del web server.

È utile controllare anche eventuali file PHP sconosciuti, modifiche inattese alle applicazioni, nuove attività pianificate e connessioni di rete sospette.

Nessuno di questi elementi dimostra, da solo, che sia avvenuto un attacco. Tuttavia possono costituire indicatori utili per avviare ulteriori verifiche.

Se emergono evidenze credibili di compromissione, è necessario gestire l’evento attraverso un processo strutturato di incident response, preservando le informazioni utili all’analisi.

Conclusioni: cosa ci insegna PHP2Shell

Le vulnerabilità PHP2Shell dimostrano quanto sia importante mantenere aggiornati non soltanto i software applicativi, ma anche tutti i componenti sui quali questi si basano.

Abbiamo visto due vulnerabilità critiche nell’interprete PHP che possono consentire, in determinate condizioni, l’esecuzione di codice da remoto senza autenticazione.

Abbiamo analizzato i meccanismi di corruzione della memoria, le differenze tra Apache con mod_php e PHP-FPM e le procedure per verificare e aggiornare PHP sui server Debian e Ubuntu.

Ma la lezione più importante va oltre queste due CVE.

La sicurezza di un’applicazione dipende anche dal sistema operativo, dalle librerie, dall’interprete, dal web server e dal modo in cui tutti questi componenti vengono mantenuti.

Un’organizzazione che dispone di un inventario aggiornato dei propri server, monitora gli advisory di sicurezza e possiede procedure affidabili di patch management può reagire molto più rapidamente quando viene pubblicata una vulnerabilità critica.

Conoscere la vulnerabilità è soltanto il primo passo. Sapere dove si trova il software interessato e riuscire ad aggiornarlo rapidamente è ciò che permette davvero di ridurre il rischio.