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

flawopen.com/Simulateurs/Heartbleed Buffer Overread

Sécurité Mémoire / OpenSSL TLS

Visualiseur Interactif de Dépassement de Tampon OpenSSL Heartbleed (CVE-2014-0160)

Simulateur de mémoire interactif dans le navigateur démontrant comment les champs de longueur TLS Heartbeat non validés provoquent une lecture hors limites dans le tas du serveur.

💡 Explication Simple (ELI5)

Imaginez envoyer un mot de 4 lettres 'BIRD' à un perroquet savant en lui disant : 'Répète mon mot, mais fais une réponse longue de 64 000 lettres'. Le perroquet crie 'BIRD' puis enchaîne immédiatement en débitant les 63 996 lettres suivantes stockées dans sa mémoire récente — y compris les mots de passe secrets, les clés de chiffrement privées et les données bancaires d'autres visiteurs. Avec Heartbleed, OpenSSL faisait 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 Terminologie Sous-Système

Extension TLS Heartbeat
Protocole keep-alive selon la RFC 6520 pour maintenir une session sécurisée active sans renégociation.
\n
Champ Payload Length
Entier non signé 16 bits déclarant la taille de la charge utile (jusqu'à 65 535 octets).
\n
Buffer Overread
Lecture hors limites dans la mémoire d'un processus due à l'absence de vérification de taille.
\n
memcpy() Non Borné
Copie d'octets en mémoire utilisant une longueur arbitraire dictée par le client sans contrôle.

Mécanique d'Exécution et d'Exploitation Étape par Étape

1

Envoi de la Requête Heartbeat Malveillante

L'attaquant initie une requête TLS Heartbeat contenant 1 octet ('A') avec un champ de longueur réglé sur 65 535 octets (0xFFFF).

\n
2

Absence de Validation des Limites du Paquet

OpenSSL lit la longueur via n2s(p, payload) sans vérifier si 1 + 2 + payload + 16 <= rrec.length.

\n
3

Allocation Démesurée d'un Tampon de 64 Ko

Le serveur alloue 64 Ko en mémoire d'après l'affirmation du client et initialise l'en-tête de réponse.

\n
4

Fuite de Mémoire Heap et Exfiltration

L'appel memcpy() copie 64 Ko au-delà du paquet de 1 octet, exposant les clés privées SSL et les cookies de session.

Diff de Code Source : Contrôle des Limites dans tls1_process_heartbeat()

FAILLE NON CORRIGÉE : ABSENCE DE CONTRÔLE DE TAILLE DANS OPENSSL 1.0.1f
/* Lecture directe de la taille sur 16 bits sans vérification */
n2s(p, payload);
pl = p;

/* Allocation du tampon de réponse selon la taille déclarée */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;

/* ERREUR : Copie jusqu'à 64 Ko de mémoire adjacente du tas ! */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
CORRECTIF SÉCURISÉ : CONTRÔLE STRICT DE LA LONGUEUR REÇUE (RFC 6520)
/* Lecture de la taille sur 16 bits */
n2s(p, payload);
pl = p;

/* CORRECTIF : Vérifier que la charge déclarée ne dépasse pas la taille réelle reçue */
if (1 + 2 + payload + 16 > s->s3->rrec.length)
    return 0; /* Ignorer silencieusement le paquet malformé */

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

Liste de Contrôle d'Ingénierie et Durcissement

← Tous les Simulateurs Lire l'Analyse Complète de la CVE-2014-0160 Heartbleed →