<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php2shell - Matteo Cisilino</title>
	<atom:link href="https://www.cisilino.com/tag/php2shell/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cisilino.com</link>
	<description>Guide su WordPress, server e sicurezza</description>
	<lastBuildDate>Thu, 29 Oct 2026 18:54:14 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
	<item>
		<title>PHP2Shell: come ho protetto i server in attesa della patch</title>
		<link>https://www.cisilino.com/2026/10/29/php2shell-cve-2026-109618-mitigazione-server/</link>
					<comments>https://www.cisilino.com/2026/10/29/php2shell-cve-2026-109618-mitigazione-server/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Thu, 29 Oct 2026 18:53:44 +0000</pubDate>
				<category><![CDATA[Server e database]]></category>
		<category><![CDATA[CVE-2026-109618]]></category>
		<category><![CDATA[CVE-2026-109619]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[ISPConfig]]></category>
		<category><![CDATA[mitigazione]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php2shell]]></category>
		<category><![CDATA[server management]]></category>
		<category><![CDATA[sicurezza server]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=845</guid>

					<description><![CDATA[<p>Due falle gravi nel core di PHP (CVE-2026-109618 e CVE-2026-109619): cosa sono, quali versioni sono colpite, lo script di mitigazione e come ho aggiornato i server.</p>
<p>The post <a href="https://www.cisilino.com/2026/10/29/php2shell-cve-2026-109618-mitigazione-server/">PHP2Shell: come ho protetto i server in attesa della patch</a> first appeared on <a href="https://www.cisilino.com">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Il 20 ottobre 2026 sono state rese pubbliche due falle gravi nel core di PHP. Il nome comune è <strong>PHP2Shell</strong> e gli identificativi sono CVE-2026-109618 e CVE-2026-109619. Il punteggio CVSS è 9,2. Permettono di eseguire codice sul server senza autenticarsi, e gli attacchi sono già stati osservati.</p>
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/php2shell-cve-2026-109618-mitigazione-server.webp" alt="Schema PHP2Shell: cinque cerchi collegati a un riquadro con il simbolo del terminale" width="1200" height="630"/></figure>
<p>In questo articolo spiego cosa sono e quali versioni di PHP sono coinvolte. Racconto come ho messo in sicurezza i server che gestisco mentre la patch non c&#8217;era, e come sono arrivato all&#8217;aggiornamento definitivo. Trovi anche lo script che ho usato e i comandi per lanciarlo.</p>
<h2 class="wp-block-heading">Cos&#8217;è PHP2Shell</h2>
<p>Il problema sta nel modo in cui PHP legge le richieste di tipo <code>multipart/form-data</code>. È il formato che il browser usa per inviare i file. PHP lo interpreta prima che parta qualsiasi script.</p>
<p>Per questo non serve un modulo di upload. Può bastare una sola richiesta a un qualsiasi file PHP del sito.</p>
<p>Le due falle, in sintesi:</p>
<ul class="wp-block-list">
<li><strong>CVE-2026-109618.</strong> Se la memoria si esaurisce mentre PHP legge la richiesta, alcuni dati si corrompono. La corruzione emerge nella pulizia finale della richiesta e può portare a eseguire codice.</li>
<li><strong>CVE-2026-109619.</strong> Parte dello stato di una richiesta resta in memoria. Una richiesta successiva, sullo stesso processo, lo riusa.</li>
</ul>
<p>Questi dettagli tecnici vengono dall&#8217;<a href="https://github.com/NCSC-NL/php2shell/wiki" target="_blank" rel="noopener">analisi del NCSC olandese</a> e da altre fonti pubbliche. Non ho provato a sfruttare le falle sui miei server.</p>
<h2 class="wp-block-heading">Quali versioni di PHP sono coinvolte</h2>
<p>Le versioni corrette sono uscite il 21 ottobre 2026: <strong>PHP 8.5.12, 8.4.27, 8.3.36 e 8.2.35</strong>. Ogni versione precedente a queste è colpita.</p>
<p>I rami 8.1 e più vecchi non hanno una versione corretta ufficiale, perché sono fuori supporto. PHP ha pubblicato solo dei backport minimi del codice sorgente per 7.4, 8.0 e 8.1. Per rami ancora più vecchi non risulta nulla.</p>
<p>Il rischio riguarda ogni modo di eseguire PHP. Il più esposto è mod_php. Contano anche PHP-FPM, php-cgi, FrankenPHP e LiteSpeed. Riguarda poi ogni applicazione che gira sopra: WordPress, Joomla, Drupal, Nextcloud, phpMyAdmin, Roundcube e il pannello ISPConfig.</p>
<p>Su Debian c&#8217;è un dettaglio da conoscere. Debian applica le correzioni come backport e non cambia il numero di versione di PHP. Un server può mostrare un numero basso ed essere già corretto. Per questo lo script non confronta le versioni. Controlla se il changelog del pacchetto installato cita le due CVE.</p>
<h2 class="wp-block-heading">La mitigazione, in attesa della patch</h2>
<p>Quando le falle sono diventate pubbliche, le patch non erano ancora disponibili per le distribuzioni. Non volevo lasciare i server scoperti, quindi ho ridotto il rischio con uno script.</p>
<p><strong>La mitigazione non è una patch.</strong> Disattivare <code>session.upload_progress</code> chiude solo uno dei percorsi noti della CVE-2026-109619 e non fa nulla contro la CVE-2026-109618. Serviva a restringere il margine di attacco fino all&#8217;aggiornamento, non a sostituirlo.</p>
<h3 class="wp-block-heading">Cosa fa lo script</h3>
<p>Lo script è pensato per Debian 12 e 13. Funziona con Apache (mod_php, FastCGI, suPHP, PHP-FPM) e con Nginx (PHP-FPM). Riconosce i server gestiti con ISPConfig, sia Apache sia Nginx.</p>
<p>Le opzioni:</p>
<ul class="wp-block-list">
<li>Senza opzioni controlla e basta. Per ogni pacchetto PHP verifica che il changelog citi le due CVE. Segnala i processi che usano ancora un binario vecchio, legge le impostazioni attive e le porte web in ascolto.</li>
<li><code>--update</code> aggiorna prima l&#8217;indice dei pacchetti.</li>
<li><code>--logs</code> cerca indicatori sospetti: file PHP recenti nelle cartelle di upload o cache, pattern tipici delle webshell, riferimenti a php2shell nei log. È un&#8217;euristica e non prova una compromissione.</li>
<li><code>--harden</code> applica la messa in sicurezza descritta qui sotto.</li>
<li><code>--dry-run</code>, insieme a <code>--harden</code>, mostra cosa farebbe senza modificare nulla.</li>
<li><code>--skip-disable-functions</code>, insieme a <code>--harden</code>, non tocca <code>disable_functions</code>.</li>
<li><code>--rollback</code> toglie quanto applicato da <code>--harden</code>.</li>
</ul>
<h3 class="wp-block-heading">Cosa cambia con &#8211;harden</h3>
<p>Per ogni versione di PHP presente in <code>/etc/php</code>, lo script crea il file <code>mods-available/cve-hardening.ini</code>. Lo abilita con <code>phpenmod</code> per i SAPI fpm, apache2 e cgi. Così la protezione vale per tutti i siti in una volta.</p>
<p>I <code>php.ini</code> originali restano intatti. La CLI non viene toccata, quindi composer, artisan e wp-cli continuano a funzionare.</p>
<p>Il file imposta tre cose:</p>
<ul class="wp-block-list">
<li><code>session.upload_progress.enabled = Off</code></li>
<li><code>expose_php = Off</code></li>
<li><code>disable_functions</code> con exec, passthru, shell_exec, system, proc_open, popen e pcntl_exec, aggiunte a quelle già presenti.</li>
</ul>
<p>Poi lo script testa la configurazione e ricarica PHP-FPM e Apache solo se il test passa. Prima di scrivere fa un backup in <code>/var/backups/php-cve-hardening/</code>.</p>
<h3 class="wp-block-heading">I limiti da conoscere</h3>
<ul class="wp-block-list">
<li><code>disable_functions</code> può rompere alcune applicazioni, per esempio WordPress con certi plugin o Magento. Se succede, usa <code>--rollback</code> oppure rilancia con <code>--skip-disable-functions</code>.</li>
<li>Le direttive <code>php_admin_value</code> nei pool PHP-FPM hanno la precedenza sul file globale. Lo script le segnala ma non le modifica.</li>
<li>Con ISPConfig i file in <code>pool.d</code> sono rigenerati dal pannello. Gli override vanno corretti dal pannello, in Sites, Website, Options, Custom php.ini settings, non a mano.</li>
<li>I <code>php.ini</code> per singolo sito (modalità FastCGI o suPHP di ISPConfig) e le versioni PHP in <code>/opt</code> non sono gestiti. Vanno controllati a parte.</li>
</ul>
<h2 class="wp-block-heading">Come lanciare lo script</h2>
<p>Lo script è qui: <a href="https://cisilino.com/mscripts/php20261.sh">https://cisilino.com/mscripts/php20261.sh</a></p>
<p>Prima di eseguire qualsiasi cosa da internet, leggila. Puoi scaricarlo e aprirlo:</p>
<pre class="wp-block-code"><code>wget -qO php20261.sh https://cisilino.com/mscripts/php20261.sh
less php20261.sh</code></pre>
<p>Se vuoi lanciarlo direttamente da remoto, servono i privilegi di root. Questi sono i comandi, nell&#8217;ordine che consiglio.</p>
<p>1. Solo controllo, con aggiornamento dell&#8217;indice dei pacchetti:</p>
<pre class="wp-block-code"><code>wget -qO- https://cisilino.com/mscripts/php20261.sh | sudo bash -s -- --update</code></pre>
<p>2. Simulazione della messa in sicurezza, senza modifiche:</p>
<pre class="wp-block-code"><code>wget -qO- https://cisilino.com/mscripts/php20261.sh | sudo bash -s -- --harden --dry-run</code></pre>
<p>3. Applicazione:</p>
<pre class="wp-block-code"><code>wget -qO- https://cisilino.com/mscripts/php20261.sh | sudo bash -s -- --harden</code></pre>
<p>4. Rimozione, se qualcosa si rompe:</p>
<pre class="wp-block-code"><code>wget -qO- https://cisilino.com/mscripts/php20261.sh | sudo bash -s -- --rollback</code></pre>
<p>Dopo <code>--harden</code> e dopo <code>--rollback</code> non serve riavviare nulla a mano: lo script ricarica da solo PHP-FPM e Apache, dopo aver testato la configurazione. Il riavvio serve invece dopo l&#8217;aggiornamento del pacchetto PHP, perché i processi in esecuzione tengono in memoria il binario vecchio:</p>
<pre class="wp-block-code"><code>sudo systemctl restart 'php*-fpm' apache2</code></pre>
<p>Gli apici attorno a <code>php*-fpm</code> servono. Senza, è la shell a espandere l&#8217;asterisco, non systemctl. Se il server usa solo Nginx, togli <code>apache2</code>.</p>
<p>L&#8217;esito dello script è anche un codice di uscita: 0 se è tutto a posto, 1 se ci sono avvisi, 2 se il sistema è vulnerabile o serve un&#8217;azione.</p>
<h2 class="wp-block-heading">Sui server con ISPConfig: ispconfig-multipart-guard</h2>
<p><a href="https://www.ispconfig.org/blog/php2shell-critical-php-vulnerabilities-cve-2026-109618-cve-2026-109619/" target="_blank" rel="nofollow noopener"><img decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/ispconfig-logo.png" alt="Logo di ISPConfig" width="239" height="90"></a></p>
<p>Chi usa ISPConfig ha un&#8217;arma in più. Il progetto ha rilasciato lo script <strong>ispconfig-multipart-guard</strong>, descritto <a href="https://www.ispconfig.org/blog/php2shell-critical-php-vulnerabilities-cve-2026-109618-cve-2026-109619/" target="_blank" rel="nofollow noopener">nell&#8217;avviso ufficiale di ISPConfig</a>.</p>
<p>Il principio è semplice. Se il problema è nelle richieste multipart, il web server le ferma prima che arrivino a PHP:</p>
<ul class="wp-block-list">
<li>blocca le richieste <code>Content-Type: multipart/...</code> per tutti i siti, per alcuni siti scelti o per il pannello di controllo;</li>
<li>con Nginx risponde 415 alle richieste PHP dei siti bloccati e i file statici non cambiano. Con Apache risponde 403, anche per i file statici;</li>
<li>di default blocca solo il pannello ISPConfig. I siti vanno bloccati con comandi come <code>block all</code> o <code>block esempio.it</code>;</li>
<li>crea un cron che ogni 5 minuti ripristina i suoi hook, se ISPConfig riscrive la configurazione;</li>
<li>ha una lista di IP autorizzati che possono ancora caricare file.</li>
</ul>
<p>Funziona con Debian e Ubuntu, con ISPConfig 3.2 o 3.3 (e anche senza ISPConfig), con Nginx o con Apache 2.4 e successivi.</p>
<p>Il prezzo è che sui siti bloccati gli upload non funzionano. Valgono anche i media dei CMS, gli allegati dei moduli e quelli del webmail, e gli import di phpMyAdmin. Le pagine normali e i moduli urlencoded continuano a funzionare. Anche questa è una misura provvisoria e non una correzione.</p>
<p>Questo script e il mio non sono alternativi. Il mio agisce sulla configurazione di PHP, quello di ISPConfig sul web server. Non li ho confrontati sul campo e non posso dirti come si comportano insieme su ogni configurazione.</p>
<h2 class="wp-block-heading">L&#8217;aggiornamento definitivo, in due passaggi</h2>
<p>Le mitigazioni dovevano durare poco. Ho aggiornato i server non appena gli aggiornamenti sono stati disponibili, in due passaggi:</p>
<ol class="wp-block-list">
<li><strong>Compilazione diretta.</strong> In attesa che la distribuzione in uso sul singolo server rilasciasse il suo pacchetto, ho compilato PHP dai sorgenti nelle versioni corrette.</li>
<li><strong>Pacchetto ufficiale.</strong> Quando il pacchetto ufficiale della distribuzione è stato rilasciato per quel server, ho sostituito la compilazione con il pacchetto.</li>
</ol>
<p>Il secondo passaggio conta. Un PHP compilato a mano non si aggiorna da solo con il resto del sistema. Il pacchetto della distribuzione sì, e lo script può verificarlo leggendo il changelog.</p>
<h2 class="wp-block-heading">Cosa fare adesso</h2>
<ol class="wp-block-list">
<li>Aggiorna PHP alla 8.5.12, 8.4.27, 8.3.36 o 8.2.35. Su Debian puoi anche usare il pacchetto della distribuzione quando il changelog cita le due CVE.</li>
<li>Riavvia PHP-FPM e Apache, poi rilancia lo script senza opzioni. Non deve più segnalare problemi.</li>
<li>Se usi PHP 8.1 o precedente, pianifica il passaggio a un ramo supportato. Per quei rami non c&#8217;è una versione ufficiale corretta.</li>
<li>Tieni disattivato <code>session.upload_progress</code> fino al prossimo rilascio di correzioni, se la tua applicazione non lo usa.</li>
<li>Controlla i log e i file recenti, con <code>--logs</code> o a mano, cercando file PHP comparsi nelle cartelle di upload.</li>
<li>Non dimenticare PHP dentro container, immagini e appliance di terzi. Vanno aggiornati a parte.</li>
<li>Se il tuo sito usa WordPress, il <a href="https://www.cisilino.com/2026/10/29/cisilino-site-defense-network/">plugin Cisilino Site Defense Network</a> non risolve PHP2Shell. Protegge però il login e tiene un registro delle attività, utile per capire cosa succede sul sito.</li>
</ol>
<h2 class="wp-block-heading">Fonti</h2>
<ul class="wp-block-list">
<li><a href="https://www.ispconfig.org/blog/php2shell-critical-php-vulnerabilities-cve-2026-109618-cve-2026-109619/" target="_blank" rel="nofollow noopener">ISPConfig: PHP2Shell, vulnerabilità critiche di PHP (CVE-2026-109618, CVE-2026-109619)</a></li>
<li><a href="https://github.com/NCSC-NL/php2shell/wiki" target="_blank" rel="noopener">NCSC-NL: wiki su PHP2Shell</a></li>
</ul>
<p>ISPConfig, PHP, Debian e gli altri nomi citati sono marchi dei rispettivi proprietari. Sono indicati solo per identificare i prodotti.</p><p>The post <a href="https://www.cisilino.com/2026/10/29/php2shell-cve-2026-109618-mitigazione-server/">PHP2Shell: come ho protetto i server in attesa della patch</a> first appeared on <a href="https://www.cisilino.com">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/2026/10/29/php2shell-cve-2026-109618-mitigazione-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
