Esto es no un defecto en TLS; es un error de seguridad de memoria simple en OpenSSL.
Las mejores explicaciones que he encontrado hasta ahora son las publicaciones del blog Diagnóstico del OpenSSL Heartbleed Bug por Sean Cassidy y El ataque de la semana : OpenSSL Heartbleed por Matthew Green.
En resumen, Heartbeat permite que un punto final diga "Te estoy enviando algunos datos, devuélvelos". Envías tanto una figura de longitud como los datos en sí. La figura de longitud puede ser de hasta 64 KiB. Desafortunadamente, si usa la cifra de longitud para reclamar "Estoy enviando 64 KiB de datos" (por ejemplo) y luego solo realmente envíe, digamos, un byte, OpenSSL le devolvería su byte, y 64 KiB (menos uno) de otros datos de la RAM.
¡Vaya!
Esto permite que el otro punto final obtenga porciones aleatorias de memoria del proceso utilizando OpenSSL. Un atacante no puede elegir la memoria que , pero si lo intentan lo suficiente, es probable que la estructura de datos de su solicitud se acerque a algo interesante, como las claves privadas o las cookies o contraseñas de los usuarios.
Ninguna de esta actividad se registrará en ningún lugar, a menos que registre, como, todos sus datos de conexión TLS en bruto.
No es bueno.
El cómic xkcd anterior hace un buen trabajo que ilustra el problema.
Editar: escribí en un comentario a continuación que los mensajes de latido están cifrados. Esto no siempre es cierto. Puede enviar un latido al principio del protocolo TLS, antes de que se active el cifrado (aunque se supone que no debe hacerlo). En este caso, tanto la solicitud como la respuesta no estarán encriptadas. En el uso normal, los latidos del corazón siempre deben enviarse más tarde, encriptados, pero la mayoría de las herramientas de explotación probablemente no se molestarán en completar el apretón de manos y esperar el cifrado. (Gracias, RedBaron.)