
Análise técnica aprofundada do PHP2Shell: encadeando duas CVEs do núcleo do PHP, desde um crash por falta de memória e um use-after-free até heap grooming, vazamentos de ASLR e execução remota de código.

Comecei a escrever esta pesquisa em 26 de outubro de 2026, e não tenho certeza absoluta de quando irei concluí-la.
No momento em que escrevo, ainda há muito pouca informação disponível sobre o PHP2Shell, particularmente no que diz respeito a análises técnicas detalhadas das vulnerabilidades e do processo de exploração.
Honestamente, eu estava ficando cansado de encontrar explicações que apenas arranhavam a superfície sem realmente mostrar o que acontecia internamente. Eu queria fazer algo diferente: um passo a passo técnico adequado e aprofundado que explore todo o processo, examinando cada detalhe importante e explicando não apenas O QUE acontece, mas POR QUE e COMO acontece.
Esta pesquisa é baseada no meu próprio entendimento do código-fonte do PHP, nos meus experimentos e nas investigações que conduzi enquanto tentava entender essas vulnerabilidades. Eu queria juntar todas essas peças, compartilhar minhas descobertas e, esperançosamente, tornar alguns dos conceitos subjacentes mais fáceis de entender para os outros.
Um dos meus principais objetivos era tornar isso acessível sem sacrificar a profundidade técnica. Quero que alguém com conhecimento básico de C e experiência geral em programação consiga acompanhar, mesmo sem qualquer experiência prévia em exploração de memória de baixo nível.
Também espero que esta pesquisa possa ajudar a esclarecer algumas coisas que atualmente são mal explicadas ou mal compreendidas. No entanto, quero ser transparente: este é o meu próprio entendimento técnico das vulnerabilidades, não uma análise oficial ou uma referência infalível. Ainda estou aprendendo, investigando e conectando os pontos por conta própria. Pode haver erros, imprecisões ou coisas que eu tenha entendido mal ao longo do caminho.
Se você notar algo incorreto, tiver uma interpretação diferente ou achar que algo merece uma investigação mais aprofundada, por favor, não hesite em entrar em contato comigo. Eu realmente agradeceria correções, discussões e contribuições que pudessem ajudar a tornar esta pesquisa mais precisa e útil para todos.
Afinal, o objetivo de compartilhar tudo isso é aprender juntos e ajudar mais pessoas a entender o que realmente acontece nos bastidores.
Já está familiarizado com o básico?? Vá direto para a parte que lhe interessa:
Se você é novo em exploração de heap ou quer a experiência completa, continue rolando. Escrevi isto para ser lido do início ao fim.
Há algumas coisas que todos devem ter em mente antes de começarmos. Elas se tornarão particularmente úteis à medida que avançamos na pesquisa. Como mencionei anteriormente, quero que este walkthrough seja acessível a todos, então vou dedicar tempo para explicar até os conceitos mais fundamentais. Se você já está familiarizado com eles, sinta-se à vontade para pular!
Em um programa típico, a memória é organizada em diferentes regiões, incluindo a stack e o heap.
Por exemplo, em 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
}
Aqui, a é uma variável local que contém o valor 30. O ponteiro b também é uma variável local, mas contém o endereço de um inteiro alocado no heap.
O PHP é escrito principalmente em C, então precisamos entender como funciona a alocação de memória.
O sistema operacional fornece a um processo seu próprio espaço de endereçamento virtual. O alocador de memória do processo então gerencia as alocações dentro da memória disponível para ele.
Por exemplo, em C++, temos new, malloc() e outras formas de alocar memória.
Os alocadores frequentemente tentam reutilizar memória liberada em vez de solicitar nova memória ao sistema operacional a cada vez.
Além disso, quando o tempo de vida de um objeto termina, os dados que estavam armazenados em sua memória não são necessariamente apagados imediatamente. Essa memória pode simplesmente ser marcada como disponível para reutilização.
Para entender melhor isso, vamos dar uma pequena olhada no seguinte código: