Exploração do Heap: Use-After-Free e Heap Spraying
Compreenda os componentes internos de malloc do glibc, as condições de use-after-free e as técnicas de heap spraying.
Exploração do Heap: Use-After-Free e Heap Spraying é uma aula grátis de Cyber Security Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Cyber Security Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Cyber Security Academy inclui 4 aulas no total.
A memória dinâmica
A memória dinâmica é alocada em tempo de execução por meio de malloc()/free()/new/delete. Diferentemente da pilha, o layout da memória dinâmica é determinado pelos padrões de alocação e desalocação, não pela pilha de chamadas. Vulnerabilidades na memória dinâmica são comuns em navegadores, analisadores e serviços de rede.
Uso após liberação (UAF)
Uma vulnerabilidade de uso após liberação ocorre quando um programa continua usando uma região da memória depois de liberá-la. Se a região liberada for realocada com dados controlados pelo invasor, o programa passa a operar sobre os dados do invasor usando o ponteiro obsoleto.
Exemplo de UAF
Padrão de UAF:
// Vulnerable C code:
struct Object *obj = malloc(sizeof(*obj));
free(obj);
// Later, attacker causes a new malloc to fill the freed region
// with their data...
obj->method(); // now calls attacker's function pointer!Organização da memória dinâmica
Organização da memória dinâmica (ou preparação da memória dinâmica) é a técnica de manipular o alocador de memória para colocar objetos em posições específicas, permitindo a reutilização controlada da memória liberada. O invasor molda a memória dinâmica acionando alocações e liberações em uma sequência precisa.
Pulverização da memória dinâmica
Pulverização da memória dinâmica aloca grandes quantidades de dados controlados pelo invasor (código de shell + sequências de NOP) por toda a memória dinâmica. Com uma parte tão grande da memória preenchida, é provável que um ponteiro inválido aponte para os dados do invasor. Essa técnica costuma ser usada com UAF ou falhas de confusão de tipos.
// JavaScript heap spray:
var spray = [];
for(var i = 0; i < 100000; i++) {
spray[i] = unescape("%90%90...shellcode...");
}Liberação dupla
Uma liberação dupla ocorre quando a memória é liberada duas vezes. A segunda liberação corrompe os metadados do alocador de memória (ponteiros da lista livre), podendo permitir que um invasor controle onde a próxima alocação será posicionada — escrevendo em um endereço arbitrário.
Estouro da memória dinâmica
Assim como os estouros de pilha, um estouro da memória dinâmica escreve além do fim de uma alocação dessa memória. Diferentemente dos estouros de pilha, o alvo normalmente são os metadados da memória dinâmica (tamanho e ponteiros anterior/próximo) ou alocações adjacentes que contêm ponteiros de função ou ponteiros de tabela virtual.
Confusão de tipos
Confusão de tipos ocorre quando um trecho de memória alocado como um tipo é usado como outro tipo. Isso é comum em mecanismos JavaScript e em código C++. Se um invasor puder controlar a ordem das alocações, poderá fazer o mecanismo tratar os dados do invasor como um objeto confiável.
Componentes internos de ptmalloc e tcmalloc
Entender o alocador de memória ajuda no desenvolvimento de explorações. O ptmalloc da glibc usa compartimentos (não ordenados, pequenos e grandes) e compartimentos rápidos. O tcache (cache por encadeamento) é a primeira fonte de alocação. As explorações frequentemente têm como alvo a corrupção de compartimentos para controlar futuros endereços de alocação.
Mitigações
Mitigações para exploração da memória dinâmica:
- Randomização da memória dinâmica (parte do ASLR) — randomiza a base da memória dinâmica
- Desvinculação segura — verifica os ponteiros anterior/próximo antes de desvincular
- Detecção de envenenamento do tcache — adicionada na glibc 2.32
- Ofuscação de ponteiros — criptografa os ponteiros armazenados no tcache
- Linguagens seguras para a memória — Rust elimina UAF em tempo de compilação
Explorações da memória dinâmica em navegadores
A maioria das vulnerabilidades de dia zero em navegadores envolve vulnerabilidades da memória dinâmica nos mecanismos JavaScript (V8, SpiderMonkey). Os navegadores modernos usam cadeias de escape do ambiente isolado: falha na memória dinâmica do renderizador → escape para o processo do navegador → elevação de privilégios no OS. Cada etapa exige sua própria técnica.
Verificação rápida: exploração da memória dinâmica
Qual vulnerabilidade permite que um invasor controle a execução do programa usando um ponteiro obsoleto para uma memória que já foi liberada e realocada com dados do invasor?
Recapitulação da lição
Vulnerabilidades da memória dinâmica — UAF, liberação dupla, estouro da memória dinâmica e confusão de tipos — exploram o gerenciamento incorreto da memória dinâmica. O uso após liberação é a categoria de exploração moderna mais prevalente. A pulverização da memória dinâmica maximiza a chance de atingir os dados do invasor. Mitigações: ASLR, desvinculação segura e ofuscação de ponteiros. Linguagens seguras para a memória, como Rust, eliminam completamente essas categorias.
Perguntas Frequentes
A aula “Exploração do Heap: Use-After-Free e Heap Spraying” é grátis?
Sim — o texto completo de “Exploração do Heap: Use-After-Free e Heap Spraying” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Cyber Security Academy, atualize para CoddyKit PRO. O curso de Cyber Security Academy inclui 4 aulas no total.
O que vou aprender em “Exploração do Heap: Use-After-Free e Heap Spraying”?
Compreenda os componentes internos de malloc do glibc, as condições de use-after-free e as técnicas de heap spraying. Você pratica Cyber Security Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Cyber Security Academy?
Nenhuma experiência prévia é necessária. Cyber Security Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Exploração do Heap: Use-After-Free e Heap Spraying”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Cyber Security Academy?
Sim. Cada aula de Cyber Security Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Transbordamentos de Buffer na Pilha
- Programação Orientada a Retorno (ROP)
- Vulnerabilidades de Strings de Formatação
- Exploração do Heap: Use-After-Free e Heap Spraying