php2shell: come abbiamo messo in sicurezza i nostri server

4 minuti di lettura

Il 21 ottobre sono uscite due falle critiche nel cuore di PHP. La correzione per i nostri server è arrivata a tarda sera, con lo stesso numero di versione di prima. Cosa abbiamo fatto nell'attesa e come abbiamo verificato.

Il 21 ottobre 2026 sono state rese pubbliche due falle nel cuore di PHP, il linguaggio su cui girano WordPress, Laravel e buona parte del web. I codici sono CVE-2026-109618 e CVE-2026-109619 (le CVE sono le sigle con cui si catalogano le vulnerabilità); in rete le hanno chiamate php2shell.

Gravità 9.2 nella scala CVSS 4.0. Permettono di eseguire codice sul server da remoto, senza fare login. In pratica chi le sfrutta può comandare la macchina come se fosse sua.

Cosa è successo quel giorno

Le correzioni ufficiali sono uscite lo stesso giorno: PHP 8.5.12, 8.4.27, 8.3.36 e 8.2.35. Nelle stesse ore giravano già sfruttamenti reali, quindi aspettare il mattino dopo era fuori discussione.

Cloudflare ha esteso anche ai piani gratuiti le regole del suo WAF, il firewall applicativo che esamina le richieste prima che arrivino al sito. Con un avvertimento onesto: gli attaccanti modificano gli attacchi per aggirare le regole, quindi il filtro aiuta ma da solo non basta.

Il nostro problema: l'aggiornamento non c'era

I nostri server usano CloudLinux con cPanel, che distribuisce PHP con pacchetti propri. La sera del 21 la versione corretta di quei pacchetti non era ancora uscita.

Sui server giravano cinque versioni di PHP-FPM, il servizio che esegue PHP per i siti: 7.4, 8.2, 8.3, 8.4 e 8.5. Abbiamo lavorato su due fronti.

1. Chiudere la via d'attacco confermata

La via d'attacco confermata passa da session.upload_progress, una funzione di PHP che tiene traccia dell'avanzamento dei caricamenti di file. L'abbiamo spenta su tutte le versioni installate, con un file di configurazione dedicato e un riavvio di PHP-FPM:

for d in /opt/cpanel/ea-php*/root/etc/php.d; do
  echo "session.upload_progress.enabled = 0" > $d/zz-php2shell.ini
done
/scripts/restartsrv_apache_php_fpm

Il ciclo passa da ogni versione di PHP presente sul server, così nessuna resta indietro. Va detto chiaro: questa mitigazione chiude la via d'attacco confermata, non tutte quelle possibili. Era un tampone in attesa della correzione vera.

2. Il filtro davanti

I nostri server accettano sulle porte web solo traffico che arriva da Cloudflare. Chi prova a colpire un sito puntando dritto al server trova la porta chiusa, quindi le nuove regole del WAF si applicavano a ogni singola richiesta.

Una correzione con lo stesso numero di versione

CloudLinux ha rilasciato i pacchetti corretti alle 22:55 ora italiana, con un dettaglio che poteva trarre in inganno: il numero di versione di PHP non è cambiato.

La 8.5.11 è rimasta 8.5.11, ma il pacchetto è diventato 8.5.11-2.el9.cloudlinux.1. Lo stesso per la 8.4.26, diventata 8.4.26-2…cloudlinux.1, e per la 7.4.33, passata a 7.4.33-18…cloudlinux.13.

Chi guardava solo il numero di versione vedeva 8.5.11 prima e dopo, e non poteva sapere se era protetto. Bisognava leggere la revisione del pacchetto.

La mattina dopo

Abbiamo aggiornato i pacchetti e controllato le revisioni su ogni server con un comando:

rpm -qa 'ea-php*-php-cli' | sort

Il criterio era semplice. Ogni riga deve finire in .cloudlinux.1, quella della 7.4 in .cloudlinux.13. Una riga diversa vuol dire un PHP ancora da aggiornare.

Il file di mitigazione l'abbiamo lasciato al suo posto. Con la correzione installata fa da seconda cintura, e ai siti non dà alcun fastidio.

Cosa ci portiamo a casa

Fonti

note di lavoro

Ultime dal laboratorio.

la prossima storia

Qual è la prossima storia?

Raccontateci cosa non funziona. Il primo incontro serve a capire se conviene fare qualcosa, e se la risposta è no ve lo diciamo subito.

Telefono
351 240 7196
Studio
Via Vincenzo Arangio Ruiz 83, 80122 Napoli
Il messaggio che partirà Scegliete qualcosa qui sopra…
Apri WhatsApp col messaggio pronto

Oppure chiamateci: 351 240 7196 · [email protected]