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.
Saludos.
Lexer Pars.
No hay comentarios:
Publicar un comentario