\n\n\n\n\n\n\n\n\n\n\n

flawopen.com/Simuladores/Heartbleed Buffer Overread

Segurança de Memória / OpenSSL TLS

Visualizador Interativo de Buffer Overread do OpenSSL Heartbleed (CVE-2014-0160)

Modelo de memória e simulador de pacotes interativo no navegador demonstrando como campos de comprimento TLS Heartbeat não validados causam leitura além do limite na heap do servidor.

💡 Explicação Simples (ELI5)

Imagine enviar uma única palavra de 4 letras 'BIRD' para um papagaio treinado e dizer: 'Repita minha palavra de 4 letras, mas faça sua resposta ter 64.000 letras'. O papagaio grasna 'BIRD' e imediatamente começa a tagarelar as 63.996 letras seguintes armazenadas em sua memória recente — incluindo senhas secretas, chaves privadas e números bancários de outros visitantes. No Heartbleed, o OpenSSL confiava no tamanho declarado da mensagem sem verificar o comprimento real do pacote, copiando a memória do servidor diretamente de volta ao invasor.

Conceitos Principais e Termos de Subsistema

TLS Heartbeat Extension
Mecanismo de keep-alive da RFC 6520 para testar conexões seguras ativas sem renegociação.
\n
Payload Length Field
Inteiro sem sinal de 16 bits no cabeçalho do heartbeat que declara o tamanho da carga útil (até 65.535 bytes).
\n
Buffer Overread
Falha de segurança de memória em que uma aplicação lê além dos limites alocados para um buffer, acessando memória de processo adjacente.
\n
memcpy() sem Limites
Operação de cópia de memória que utiliza comprimento fornecido pelo cliente sem validação contra o registro recebido.

Mecânica de Execução e Exploração Passo a Passo

1

Envio de Requisição Heartbeat Malformada

O invasor conecta ao servidor TLS e envia uma requisição Heartbeat com carga de 1 byte ('A'), mas declara comprimento de 65.535 bytes (0xFFFF).

\n
2

Ausência de Validação de Limites de Pacote

O OpenSSL lê o tamanho via n2s(p, payload) sem validar se 1 + 2 + payload + 16 <= rrec.length.

\n
3

Alocação Desenfreada de Buffer de 64 KB

O servidor aloca um buffer de resposta completo de 64 KB baseado na declaração do cliente e prepara a resposta.

\n
4

Vazamento de Memória por Cópia Excessiva

A chamada memcpy() copia 64 KB além do pacote de 1 byte, capturando chaves privadas SSL e tokens de sessão da heap do servidor.

Diferença de Código-Fonte: Validação de Limites no tls1_process_heartbeat()

FALHA NÃO CORRIGIDA: AUSÊNCIA DE VALIDAÇÃO DE LIMITES NO OPENSSL 1.0.1f
/* Lê comprimento de 16 bits diretamente sem checagem de limites */
n2s(p, payload);
pl = p;

/* Aloca buffer de resposta baseado no tamanho alegado pelo cliente */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;

/* ERRO: Copia até 64 KB de memória adjacente da heap do servidor! */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
PATCH CORRIGIDO: VALIDAÇÃO ESTRITA DE LIMITES DO REGISTRO (RFC 6520)
/* Lê comprimento de 16 bits do pacote */
n2s(p, payload);
pl = p;

/* CORREÇÃO: Valida se a carga alegada não ultrapassa o comprimento real recebido */
if (1 + 2 + payload + 16 > s->s3->rrec.length)
    return 0; /* Descarta silenciosamente o pacote malformado */

buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
memcpy(bp, pl, payload);

Checklist de Engenharia e Proteção do Sistema

← Todos os Simuladores Ler Análise Completa da CVE-2014-0160 Heartbleed →