
Analyse technique approfondie de PHP2Shell : enchaînement de deux CVE du cœur de PHP, depuis un plantage par épuisement de mémoire et un use-after-free jusqu'au heap grooming, aux fuites ASLR et à l'exécution de code à distance.

J'ai commencé à écrire cette recherche le 26 octobre 2026, et je ne sais pas encore exactement quand je la terminerai.
Au moment de la rédaction, il existe encore très peu d'informations disponibles sur PHP2Shell, en particulier lorsqu'il s'agit d'une analyse technique détaillée des vulnérabilités et du processus d'exploitation.
Honnêtement, j'en avais assez de trouver des explications qui ne faisaient qu'effleurer le sujet sans réellement montrer ce qui se passait en interne. Je voulais faire quelque chose de différent : une véritable analyse technique approfondie qui explore l'ensemble du processus, examine chaque détail important et explique non seulement CE qui se passe, mais POURQUOI et COMMENT cela se produit.
Cette recherche est fondée sur ma propre compréhension du code source de PHP, mes expérimentations et les investigations que j'ai menées en cherchant à comprendre ces vulnérabilités. Je voulais rassembler toutes ces pièces, partager mes découvertes et, je l'espère, rendre certains des concepts sous-jacents plus faciles à comprendre pour les autres.
L'un de mes principaux objectifs était de rendre cela accessible sans sacrifier la profondeur technique. Je souhaite qu'une personne ayant des connaissances de base en C et une expérience générale de la programmation puisse suivre, même sans expérience préalable de l'exploitation mémoire de bas niveau.
J'espère également que cette recherche pourra aider à clarifier certaines choses actuellement mal expliquées ou mal comprises. Cependant, je tiens à être transparent : il s'agit de ma propre compréhension technique des vulnérabilités, et non d'une analyse officielle ou d'une référence infaillible. J'apprends encore, j'investigue et je relie les points moi-même. Il peut y avoir des erreurs, des inexactitudes ou des choses que j'ai mal comprises en cours de route.
Si vous remarquez quelque chose d'incorrect, si vous avez une interprétation différente ou si vous pensez que quelque chose mérite d'être approfondi, n'hésitez pas à me contacter. J'apprécierais sincèrement les corrections, les discussions et les contributions qui pourraient aider à rendre cette recherche plus précise et plus utile à tous.
Après tout, tout l'intérêt de partager cela est d'apprendre ensemble et d'aider davantage de personnes à comprendre ce qui se passe réellement sous le capot.
Vous connaissez déjà les bases ? Allez directement à la partie qui vous intéresse :
Si vous débutez dans l'exploitation du tas ou si vous voulez l'expérience complète, continuez simplement à faire défiler. Je l'ai écrit pour être lu du début à la fin.
Il y a quelques points que chacun devrait garder en tête avant de se lancer. Ils deviendront particulièrement utiles au fil de la recherche. Comme je l'ai mentionné plus tôt, je veux que ce walkthrough soit accessible à tous, je prendrai donc le temps d'expliquer même les concepts les plus fondamentaux. Si vous les connaissez déjà, n'hésitez pas à sauter cette partie !
Dans un programme typique, la mémoire est organisée en différentes régions, notamment la pile et le tas.
Par exemple, en 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
}
Ici, a est une variable locale contenant la valeur 30. Le pointeur b est également une variable locale, mais il contient l'adresse d'un entier alloué sur le tas.
PHP est principalement écrit en C, nous devons donc comprendre comment fonctionne l'allocation mémoire.
Le système d'exploitation fournit à un processus son propre espace d'adressage virtuel. L'allocateur mémoire du processus gère ensuite les allocations dans la mémoire qui lui est disponible.
Par exemple, en C++, nous disposons de new, malloc() et d'autres moyens d'allouer de la mémoire.
Les allocateurs tentent souvent de réutiliser la mémoire libérée plutôt que de demander de la nouvelle mémoire au système d'exploitation à chaque fois.