\n\n\n\n\n\n\n\n\n\n\n
flawopen.com/Simuladores/Heartbleed Buffer Overread
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.
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.
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).
O OpenSSL lê o tamanho via n2s(p, payload) sem validar se 1 + 2 + payload + 16 <= rrec.length.
O servidor aloca um buffer de resposta completo de 64 KB baseado na declaração do cliente e prepara a resposta.
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.
/* 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);
/* 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);