He leído muchos informes del error HeartBleed pero no he podido encontrar una descripción a nivel de código fuente, como esta para goto fail bug . ¿Alguien puede proporcionar, o señalar, tal explicación?
He leído muchos informes del error HeartBleed pero no he podido encontrar una descripción a nivel de código fuente, como esta para goto fail bug . ¿Alguien puede proporcionar, o señalar, tal explicación?
El blog existentialize hizo una reseña simple y fácil de leer.
Los conceptos básicos son:
unsigned char *buffer, *bp;
int r;
/* Allocate memory for the response, size is 1 byte
* message type, plus 2 bytes payload length, plus
* payload, plus padding
*/
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
Asigne lo que solicitó el solicitante. Sin reducirlo a cero.
/* Enter response type, length and copy payload */
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
memcpy(bp, pl, payload);
Copie la carga útil del remitente para devolvérsela.
Excepto ... el remitente no envió una carga útil.
Directamente desde el blog: "¿Qué pasa si el solicitante realmente no proporcionó bytes de carga útil, como dijo que hizo? ¿Qué pasa si pl realmente es solo un byte? Entonces, la lectura de memcpy leerá cualquier memoria que esté cerca del Registro SSLv3 y dentro del mismo proceso. "
Lea otras preguntas en las etiquetas openssl heartbleed