
Analisi tecnica approfondita di PHP2Shell: concatenazione di due CVE del core di PHP, da un crash per esaurimento della memoria e un use-after-free a heap grooming, leak di ASLR ed esecuzione di codice remoto.

Ho iniziato a scrivere questa ricerca il 26 ottobre 2026, e non sono del tutto sicuro di quando la terminerò.
Al momento della stesura, ci sono ancora pochissime informazioni disponibili su PHP2Shell, in particolare per quanto riguarda l'analisi tecnica dettagliata delle vulnerabilità e del processo di sfruttamento.
Onestamente, mi stavo stancando di trovare spiegazioni che grattavano solo la superficie senza mostrare realmente cosa accadeva internamente. Volevo fare qualcosa di diverso: una trattazione tecnica approfondita e adeguata che esplorasse l'intero processo, esaminando ogni dettaglio importante e spiegando non solo COSA accade, ma PERCHÉ e COME accade.
Questa ricerca si basa sulla mia personale comprensione del codice sorgente di PHP, sui miei esperimenti e sulle indagini che ho condotto nel tentativo di comprendere queste vulnerabilità. Volevo mettere insieme tutti questi pezzi, condividere le mie scoperte e, si spera, rendere alcuni dei concetti sottostanti più facili da comprendere per gli altri.
Uno dei miei obiettivi principali era rendere tutto questo accessibile senza sacrificare la profondità tecnica. Voglio che qualcuno con conoscenze di base del linguaggio C e un'esperienza di programmazione generale possa seguire il discorso, anche senza alcuna precedente esperienza nello sfruttamento della memoria a basso livello.
Spero anche che questa ricerca possa contribuire a chiarire alcune cose che attualmente sono spiegate male o fraintese. Tuttavia, voglio essere trasparente: questa è la mia personale comprensione tecnica delle vulnerabilità, non un'analisi ufficiale né un riferimento infallibile. Sto ancora imparando, indagando e collegando i punti da solo. Potrebbero esserci errori, imprecisioni o cose che ho frainteso lungo il percorso.
Se noti qualcosa di errato, hai un'interpretazione diversa o pensi che qualcosa meriti ulteriori indagini, non esitare a contattarmi. Apprezzerei sinceramente correzioni, discussioni e contributi che potrebbero aiutare a rendere questa ricerca più accurata e utile per tutti.
Dopotutto, lo scopo di condividere tutto questo è imparare insieme e aiutare più persone a capire cosa accade realmente sotto il cofano.
Hai già familiarità con le basi?? Vai direttamente alla parte che ti interessa:
Se sei nuovo allo sfruttamento dell'heap o vuoi l'esperienza completa, continua a scorrere. L'ho scritto per essere letto dall'inizio alla fine.
Ci sono alcune cose che tutti dovrebbero tenere a mente prima di addentrarci. Diventeranno particolarmente utili man mano che procediamo nella ricerca. Come ho accennato prima, voglio che questa guida sia accessibile a tutti, quindi mi prenderò il tempo di spiegare anche i concetti più fondamentali. Se li conosci già, sentiti libero di saltare avanti!
In un programma tipico, la memoria è organizzata in diverse regioni, tra cui lo stack e l'heap.
Ad esempio, in C++:
int main() {
int a = 30; // Typically stored on the stack
int* b = new int(30); // b is typically on the stack,
// but the integer it points to is on the heap
}
Qui, a è una variabile locale che contiene il valore 30. Il puntatore b è anch'esso una variabile locale, ma contiene l'indirizzo di un intero allocato sull'heap.
PHP è scritto principalmente in C, quindi dobbiamo capire come funziona l'allocazione della memoria.
Il sistema operativo fornisce a un processo il proprio spazio di indirizzi virtuale. L'allocatore di memoria del processo gestisce poi le allocazioni all'interno della memoria a sua disposizione.
Ad esempio, in C++ abbiamo new, malloc() e altri modi per allocare memoria.
Gli allocatori spesso cercano di riutilizzare la memoria liberata invece di richiedere nuova memoria al sistema operativo ogni volta.
Inoltre, quando il ciclo di vita di un oggetto termina, i dati che erano memorizzati nella sua memoria non vengono necessariamente cancellati immediatamente. Quella memoria può semplicemente essere contrassegnata come disponibile per il riutilizzo.