• Passa al contenuto principale
  • Skip to header right navigation
  • Skip to site footer
Fabbri Enrico

Fabbri Enrico

Appunti, idee, qualsiasi cosa possa servire

  • IT
    • MacOS
    • Windows
    • Synology
    • Networking
    • Ubiquiti
    • Storage
    • Web
    • VMWare
  • Le mie passioni
    • Tesla
    • Apple
    • DJI
    • BMW GS
    • Bambu Lab
    • Xbox
  • Contatti
Schermo di un portatile con codice sorgente in penombra e riflessi viola

PHP2Shell: come aggiornare PHP e riavviare FPM

Articolo aggiornato al 23 ottobre 2026. La situazione è ancora in evoluzione: lo aggiornerò se il PHP Group o le distribuzioni rilasciano nuove correzioni.

Avete un sito WordPress, un gestionale web o un’applicazione interna scritta in PHP? Allora questa settimana c’è un aggiornamento da fare prima di tutto il resto. Il 21 ottobre il PHP Group ha pubblicato due advisory critici, CVE-2026-109618 e CVE-2026-109619, ribattezzati “PHP2Shell”: entrambi permettono a un attaccante non autenticato di eseguire codice sul server con l’utente del web server, ed entrambi hanno un punteggio CVSS 4.0 di 9.2.

Il punto che mi preoccupa di più è che il problema non sta nell’applicazione ma nel motore PHP stesso: su Apache con mod_php l’attacco avviene durante l’avvio della richiesta, prima che venga eseguita una sola riga del vostro codice. Non serve avere un plugin vulnerabile. E i tentativi di sfruttamento ci sono già: Amazon ne ha registrato uno sui suoi honeypot il 17 ottobre, quattro giorni prima della pubblicazione, e watchTowr ne segnala dal 21 ottobre.

Perché succede

Le due vulnerabilità sono diverse ma della stessa famiglia:

  • CVE-2026-109618 (“RCE via OOM corruption”): se PHP esaurisce la memoria mentre la richiesta è inizializzata solo a metà, la procedura di chiusura legge dati non validi. Una richiesta multipart/form-data costruita apposta basta a provocare questa condizione restando apparentemente dentro i limiti configurati.
  • CVE-2026-109619 (“RCE via stale global state”): alcuni stati globali (sessioni, errori, estensioni) sopravvivono alla richiesta che li ha creati e vengono riutilizzati dalla richiesta successiva sullo stesso worker, prima che PHP li reinizializzi.

Chi è coinvolto

Tutte le versioni precedenti a 8.2.35, 8.3.36, 8.4.27 e 8.5.12, che sono le release corrette. Secondo gli advisory l’esecuzione di codice è confermata su Apache mod_php, mentre su PHP-FPM è confermato il percorso legato alle sessioni; FrankenPHP e LiteSpeed sono considerati probabilmente vulnerabili. In pratica: qualunque PHP che risponde a richieste web.

PHP 8.1 e precedenti non ricevono più correzioni ufficiali da php.net. Alcune distribuzioni le hanno comunque portate sui loro pacchetti: AlmaLinux, ad esempio, ha aggiornato anche gli stream 7.2, 7.3, 7.4 e 8.0 su AlmaLinux 8. Se però avete un PHP 7.x compilato a mano o fuori supporto, quello resta scoperto.

Attenzione: nelle PMI il PHP dimenticato è spesso su Windows, dentro un gestionale o un pacchetto tipo XAMPP che si porta dietro il suo php-cgi.exe. Cercatelo anche lì, non solo sui server Linux.

Prima di iniziare

Fate l’inventario di quali PHP girano davvero. Su un server Linux questo ciclo vi mostra i binari presenti e la loro versione:

for p in /usr/bin/php /usr/bin/php[0-9]* /opt/alt/php*/usr/bin/php; do [ -x "$p" ] && echo "$p $("$p" -r 'echo PHP_VERSION;')"; done

Non fidatevi però solo del numero di versione: le distribuzioni correggono spesso con un backport senza cambiare la versione upstream, quindi una Debian o una AlmaLinux aggiornata può continuare a dire, ad esempio, 8.2.33. Quello che conta è la versione del pacchetto confrontata con il bollettino di sicurezza della vostra distribuzione. Prima di aggiornare, come sempre, uno snapshot della VM o un backup recente.

L’aggiornamento

Su Debian e Ubuntu, compresi i repository di Ondřej Surý:

sudo apt-get update
apt list --upgradable 2>/dev/null | grep php
sudo apt-get install --only-upgrade 'php8.3*'
dpkg -l 'php*' | awk '/^ii/{print $2, $3}'

Sostituite 8.3 con la vostra versione e ripetete per ognuna installata. Su RHEL, AlmaLinux e Rocky:

sudo dnf clean metadata && sudo dnf upgrade 'php*'
rpm -q php-common

Per le immagini Docker ufficiali scaricate il nuovo tag, ricostruite le vostre immagini con docker build --pull e ricreate i container. Plesk e cPanel distribuiscono i loro pacchetti PHP: controllate gli aggiornamenti dal pannello.

Il riavvio non è facoltativo

È l’errore che vedo più spesso: si aggiorna il pacchetto e ci si ferma lì. Un processo già avviato continua a usare il vecchio PHP finché non viene riavviato.

# PHP-FPM su Debian/Ubuntu
sudo systemctl restart php8.3-fpm
# PHP-FPM su RHEL/AlmaLinux
sudo systemctl restart php-fpm
# Apache con mod_php (un reload non basta)
sudo systemctl restart apache2   # oppure httpd

Per essere sicuri che nessun processo stia ancora usando le librerie vecchie, cercate i file mappati in memoria che risultano cancellati dal disco. Se il comando non restituisce nulla, siete a posto:

sudo grep -lE ' /(usr|lib|opt).*\(deleted\)$' /proc/[0-9]*/maps

Se non potete aggiornare subito

Gli advisory sono chiari: l’unica mitigazione completa è l’aggiornamento. Esistono però alcune misure temporanee che riducono l’esposizione:

  • disattivare il progresso degli upload, se l’applicazione non lo usa, con session.upload_progress.enabled = 0 nel php.ini o nel pool FPM;
  • su PHP 8.5, impostare fatal_error_backtraces = 0;
  • se l’applicazione non riceve upload, bloccare le richieste multipart/form-data sul reverse proxy o sul WAF;
  • su FPM, valutare pm.max_requests = 1 se le prestazioni lo permettono, così ogni worker serve una sola richiesta.

Dopo ogni modifica riavviate tutti i worker. L’advisory cita anche memory_limit = -1 contro la prima vulnerabilità, ma io lo sconsiglio: toglie la protezione contro gli script fuori controllo e non copre comunque tutti i casi. Se un server proprio non si può correggere a breve, il National Cyber Security Centre britannico consiglia di toglierlo dalla rete, e sono d’accordo.

Se il problema persiste

Se il pacchetto corretto non compare, il mirror della vostra distribuzione potrebbe essere ancora indietro: ripulite la cache dei metadati e riprovate dopo qualche ora. Se avete esposto per giorni un PHP vulnerabile su Internet, l’aggiornamento chiude la porta ma non vi dice se qualcuno è già entrato: controllate i log del web server per richieste multipart anomale, i file PHP modificati di recente nelle cartelle web e i processi avviati dall’utente del web server.

Vi è capitato di trovare qualche PHP dimenticato durante l’inventario, magari dentro un gestionale? Raccontate nei commenti dove l’avete scovato e come l’avete aggiornato: possono essere utili ad altri.

Enrico Fabbri

Enrico Fabbri, classe 1989, appassionato da sempre da tutto ciò che circonda il mondo della tecnologia.
Se una cosa funziona, sento la necessità di scoprire come e perché.

Post precedente:Portatile su una scrivania in legno illuminata da una lampada di notteAlways On VPN bloccata in Windows 11 dopo KB5127648
Post successivo:GTA 6 esce il 19 novembre: data, prezzi e come prepararsiIllustrazione ufficiale di GTA 6 con Jason e Lucia sotto le palme di Vice City, un elicottero e una moto da corsa ai lati

Interazioni del lettore

Lascia un commento Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.