Actualizar OpenSSL en Directadmin contra Heartbleed (CVE-2014-0160).

Como habrán escuchado existe una vulnerabilidad en OpenSSL el fallo está en una función encargada de gestionar mensajes Heartbeat.

Estos mensajes son llamados keep-alive: es una forma de decirle al servidor que sigues conectado y que no cierre la conexión. El mensaje que mandes puede tener una carga o contenidos (payload), como pueda ser la fecha en la que se ha enviado. El servidor recibe ese mensaje y responde al cliente con esa misma carga. Este tipo de esquema “te paso algo y me respondes con lo mismo” y no es exclusivo de TLS: en los paquetes de ping, por ejemplo, también se pueden incluir datos para así calcular cuánto tarda el servidor en responder.

El cliente tiene que decir también qué longitud tiene esa carga, para que el servidor la pueda leer sin tener que adivinar dónde acaba. Y aquí es donde vienen los problemas. ¿Qué pasa si le digo al servidor que le estoy enviando mil bytes y en realidad sólo le estoy enviando uno?

Si habéis programado alguna vez en lenguajes de alto nivel, como Java, C# o JavaScript, pensaréis que eso fallará. Al fin y al cabo, estamos intentando acceder a cosas que no están ahí. Si mi paquete es una lista de bytes de longitud 10 y quiero leer el 20978, no tengo de dónde sacarlo y el programa debería pararse y reportar un fallo.

Pero OpenSSL está escrito en C, y en C las cosas no son tan felices. En este lenguaje, la variable “paquete” no es más que una dirección en la memoria RAM; por ejemplo, la 1076. El primer byte del paquete está en la posición 1076, el segundo en la 1077, el tercero en la 1078 y así sucesivamente.

Cuando se esté ejecutando un ataque, OpenSSL recibe un mensaje de longitud 10 (por ejemplo), que dice que tiene 200 bytes de carga y que almacena en la posición 1076. Cuando tenga que responder, empezará a copiar el byte 1076, el 1077, el 1078… así hasta el 1086. ¿Qué ocurre después? Fácil: OpenSSL sigue. A él le han dicho que hay 200 bytes (el código no verifica si la longitud que aparece en el paquete es incorrecta) y va a copiar sus 200 bytes. Es decir, seguirá leyendo y copiando hasta que llegue a la posición 1276.

¿Y qué hay en esas posiciones? Pues sorpresas. La reserva de memoria no es determinista así que puede haber absolutamente de todo. Quizás sólo hay basura, restos del paquete anterior así es como se comprueba si un servidor es vulnerable o la clave privada del servidor.

Repitiendo muchas veces el ataque, cada vez se pueden recuperar hasta 64 KB de la memoria del servidor, es probable que se acaben encontrando cosas de valor. Además, las estructuras más valiosas, como las claves privadas que comentábamos, son relativamente fáciles de encontrar cuando están guardadas en memoria. En resumen, es un fallo muy grave, una ventana abierta a los entresijos confidenciales de OpenSSL.

¿Cómo puedo actualizar OpenSSL en DirectAdmin?

Es sencillo sin embargo al utilizar los siguientes comandos no solo actualizarás OpenSSL, si no también actualizarás todos los servicios, por lo que antes es mejor que respaldes o generes una imagen de tu servidor.

cd /usr/local/directadmin/custombuild
./build update
./build all d

Nota: En caso de algún error, ingresa: «./build rewrite_confs»

¿Dónde puedo verificar si soy vulnerable?

Puedes hacerlo con en esta página: http://filippo.io/Heartbleed/

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.