martes, 8 de abril de 2014

OpenSSL afectada por una vulnerabilidad apodada Heartbleed

El proyecto OpenSSL acaba de liberar una nueva versión de la librería que corrige una muy curiosa y relativamente grave vulnerabilidad. La han llamado "Heartbleed", algo así como corazón desangrado, el motivo es que el fallo se encuentra en una extensión denominada "Heartbeat" y obviamente los que la han descubierto no han dejado pasar el juego de palabras, veremos la razón.

Heartbeat es una funcionalidad añadida a TLS/DTLS que básicamente permite refrescar una sesión segura sin necesidad de efectuar una renegociación. Entre cliente y servidor se envían mensajes en forma de estructuras muy básicas para asegurarse que el cliente va a seguir enviando peticiones o el servidor sigue ahí para seguir respondiéndolas.

Cuando OpenSSL se decidió a implementar el RFC correspondiente, introdujo un bug en la implementación. Dicho fallo permite leer partes de la memoria del proceso, hasta 64k, tanto en el cliente como en el servidor, dependiendo del punto de vista del atacante. Ese es el motivo del apodo con el que han bautizado la vulnerabilidad.

El problema reside en la función 'dtls1_process_heartbeat' de 'ssl/di_both.c' al no validar correctamente la longitud de la estructura 'ssl3_record_st'. Dicha longitud puede ser manipulada a un valor de 65535 bytes y la parte de datos mucho menor o simplemente 0. Cuando se reserva memoria para construir la respuesta, se hace teniendo en cuenta la longitud indicada por la petición. Posteriormente cuando los datos (que recordemos pueden estar a 0) sean copiados a la respuesta, mediante la función 'memcpy', lo que se van a copiar son datos de la memoria cercana a dicha estructura pero no relacionados con la misma.

Esto es así porque se le está indicando que nuestros datos son de 65535 cuando en realidad hemos enviado una cantidad muchísimo menor o 0. Obviamente, el receptor de la respuesta recibirá los datos en bruto de ese trozo de memoria.

Solo pueden ser leídos 64k como máximo, pero tal y como advierten en la web dedicada al fallo (http://heartbleed.com/) es posible renegociar la conexión una y otra vez y volver a obtener otros 64k reiterativamente aunque de manera no controlada, es decir, no sabemos que parte de la memoria "tocará". Según los descubridores esto les permitió efectuando pruebas de concepto extraer las claves privadas del servidor y diversa información sensible.

Recordemos que OpenSSL es una librería usada en multitud de proyectos y es distribuida en múltiples versiones de Linux, etc. Es decir, actualmente existe un número astronómico de equipos y servidores que podrían estar expuestos a esta vulnerabilidad. Hay que actualizar la librería OpenSSL a la última versión no vulnerable o compilar las fuentes descartando el soporte Heartbeat definiendo la opción -DOPENSSL_NO_HEARTBEATS.

Esta vulnerabilidad está presente desde la versión de OpenSSL que introdujo la implementación con el bug, desde la versión 1.0.1. El fallo fue descubierto por investigadores de la empresa Codenomicon en colaboración con Neel Mehta del equipo de seguridad de Google e independientemente por el equipo de seguridad de la empresa Codenomicon. Tiene asignado el CVE-2014-0160. Podemos leer un análisis técnico (en inglés) aquí y el commit al repositorio Git de OpenSSL del parche en este enlace . El parche se encuentra incluido en la última versión de OpenSSL, la 1.0.1g.

Más información:

The Heartbleed Bug

existential type crisis  : Diagnosis of the OpenSSL Heartbleed Bug

projects / openssl.git / commitdiff

Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) Heartbeat Extension


David García
Twitter: @dgn1729