Heartbleed: ¿longitud del mensaje de heatbeat?

3

¿Cuál es la longitud correcta del mensaje de latido entre 2 ^ 14 y 2 ^ 16 ?

El RFC enlace dice que

  

La longitud total de un HeartbeatMessage NO DEBE exceder de 2 ^ 14 o
  max_fragment_length cuando se negocia como se define en [RFC6066].

En este PoC Heartbleed el tamaño es 40 00 en hexadecimal, por lo que 16 384 - > 2 ^ 14

Pero si reviso estas explicaciones (dos de muchas):

enlace enlace

Entonces, la longitud máxima es 65 535 - > 2 ^ 16

EDITAR SOLUCIONADO?

Probé el código PoC de Heartbleed, el código hb es:

hb = h2bin('''
18 03 02 00 03
01 40 00
''')

40 00 - > 16 384 - > 2 ^ 14

Si imprimo la longitud recibida, muestra 16 384

Si sustituyo 40 00 por FF FF - > 2 ^ 16, la longitud de los datos recibidos sigue siendo 16 384 cuatro veces.

16 384
16 384
16 384
16 384

= > 2 ^ 16

Interesante

Entonces, el máximo es 2 ^ 16 pero se dividirá en paquetes de 2 ^ 14

    
pregunta mpgn 08.03.2015 - 19:30
fuente

1 respuesta

1

El tamaño máximo de un HeartbeatMessage (incluido el relleno, etc.) es 2 ^ 14 por RFC 6520 sec. 4 como usted señaló.

Sin embargo, OpenSSL tuvo un problema de implementación que no comprobó correctamente este límite (y permite valores hasta el tamaño máximo de un entero de 16 bits, que es aproximadamente 2 ^ 16 ). El resultado se conoce como el error "Heartbleed". Vea este OpenSSL commit para el arreglo que se aplica en el enlace y se agrega el enlace. .

Si se pregunta por qué establecer la longitud de la carga útil en 0xFFFF no da como resultado una respuesta única de aproximadamente 2 ^ 16 bytes, esto se debe a que el tamaño máximo para un TLSPlainText no debe exceder 2 ^ 14 que también se aplica en OpenSSL. (Para obtener una explicación detallada del formato exacto de un mensaje de Heartbeat elaborado, consulte estos comentarios del PoC del marcapasos .)

    
respondido por el Lekensteyn 09.03.2015 - 02:21
fuente

Lea otras preguntas en las etiquetas