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

● CVE-2014-0160 · CVSS 9.8 · Critique
Recherche · FlawOpen

CVE-2014-0160: OpenSSL Heartbleed Buffer Overread

Analyse technique ligne par ligne du correctif de CVE-2014-0160 (Heartbleed) : le contrôle de limites manquant dans tls1_process_heartbeat d'OpenSSL exposant 64 Ko de mémoire serveur par requête.

💡 Explication en Langage Simple (ELI5)

Imaginez envoyer un mot de 4 lettres 'BIRD' à un perroquet dressé en lui disant : 'Répète mon mot de 4 lettres, mais fais en sorte que ta réponse contienne 64 000 lettres'. Le perroquet crie 'BIRD' puis se met aussitôt à débiter les 63 996 lettres suivantes de sa mémoire récente — y compris les mots de passe secrets, clés privées et numéros bancaires d'autres visiteurs. Dans Heartbleed, OpenSSL a fait confiance à la longueur annoncée par le client sans vérifier la taille réelle du paquet, renvoyant la mémoire brute du serveur à l'attaquant.

Concepts Clés et Termes

Open Source Systems
Composant d'architecture clé affecté par CWE-Security.
CWE-Security
Classification standard Common Weakness Enumeration (CWE) pour cve-2014-0160-heartbleed.
Defense-in-Depth
Vérification d'ingénierie multicouche et isolation des limites à l'exécution.

Analyse de Cause Racine

La cause fondamentale provient de paramètres de limites non validés dans les systèmes open source, permettant une désynchronisation d'état et le contournement des contrôles de sécurité.

Déroulement de l'Attaque Étape par Étape

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.

Code Source : Vulnérable vs Sécurisé

✕ IMPLÉMENTATION VULNÉRABLE
/* 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);
✓ PATCH SÉCURISÉ ET ROBUSTE
/* 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);

Liste de Contrôle de Sécurité pour l'Ingénierie