flawopen.com/Teardowns/cve-2014-0160-heartbleed

● CVE-2014-0160 · CVSS 9.8 · Crítica
Investigación · FlawOpen

CVE-2014-0160: OpenSSL Heartbleed Buffer Overread

Análisis línea por línea del parche de CVE-2014-0160 (Heartbleed): la verificación de límites ausente en tls1_process_heartbeat de OpenSSL que exponía 64 KB de memoria del servidor por petición.

💡 Explicación en Lenguaje Sencillo (ELI5)

Imagine enviar una sola palabra de 4 letras 'BIRD' a un loro entrenado y decirle: 'Repite mi palabra de 4 letras, pero haz que tu respuesta tenga 64.000 letras de largo'. El loro grazna 'BIRD' e inmediatamente comienza a balbucear las siguientes 63.996 letras almacenadas en su memoria reciente, incluidas contraseñas secretas, claves privadas y números bancarios de otros visitantes. En Heartbleed, OpenSSL confió en la longitud declarada por el cliente sin verificar el tamaño real del paquete, copiando la memoria sin procesar del servidor al atacante.

Conceptos Clave y Términos

Open Source Systems
Componente de arquitectura central afectado por CWE-Security.
CWE-Security
Clasificación estándar Common Weakness Enumeration (CWE) para cve-2014-0160-heartbleed.
Defense-in-Depth
Verificación de ingeniería multicapa y aislamiento de límites en tiempo de ejecución.

Análisis de Causa Raíz

La causa raíz se debe a parámetros de límite no validados en sistemas de código abierto, lo que permite la desincronización de estado y la elusión de controles de seguridad.

Flujo de Ataque Paso a Paso

Step 1

Malformed Heartbeat Request

Attacker connects to a TLS server and sends a Heartbeat Request containing a 1-byte payload ('A').

Step 2

Length Header Manipulation

Attacker sets the length field to the maximum possible value: 0xFFFF (65,535 bytes).

Step 3

Unbounded Heap Buffer Allocation

The server allocates a 64KB response buffer based on the client's claimed size and calls memcpy().

Step 4

Adjacent Memory Exfiltration

The memory copy overreads past the end of the packet, dumping private SSL keys, user passwords, and active session tokens.

Código Fuente: Vulnerable vs. Seguro

✕ IMPLEMENTACIÓN VULNERABLE
/* Read 16-bit length directly from client packet without bounds check */
n2s(p, payload);
pl = p;

/* Allocate reply buffer based on client's claimed size */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;

/* BUG: Copies up to 64KB of adjacent server heap memory! */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
✓ PARCHE SEGURO Y ROBUSTO
/* Read 16-bit length from packet */
n2s(p, payload);
pl = p;

/* FIX: Validate that claimed payload does not exceed actual received record length */
if (1 + 2 + payload + 16 > s->s3->rrec.length)
    return 0; /* Silently discard malformed heartbeat */

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

Lista de Verificación de Seguridad para Ingeniería