How-to: comprueba si tu distribución Linux está afectada por la vulnerabilidad GHOST

Ghost Glibc

Como ya adelantaba mi compañero Willy, se ha detectado una nueva vulnerabilidad grave en Linxu y se denomina GHOST. Si aun no se han informado pueden consultar su artículo para saber de qué trata y en este te damos los pasos para comprobar si tu distrubición está afectada por este problema o si por el contrario las actualizaciones automáticas ya lo han parcheado…

Recuerda que la vulnerabilidad está en una biblioteca que utiliza el kernel Linux, y no en el propio Linux, se trata de Glibc, la bliblioteca GNU C Library. GHOST fue descubierto por la consultora de seguridad Qualys y es un problema crítico por lo que es necesario que te informes si estás afectado. Para ello sigue los siguientes pasos:

  • Abre un fichero de texto con tu editor de texto favorito (Vi, Vim, Nano, Gedit,…), no importa si es un editor en modo gráfico.
  • Ahora copia este script y pegalo en el editor de texto:
#!/bin/bash
GHOSTTEMP=$(mktemp /tmp/ghost.XXXXXXXXXXXXXX)
GHOSTEXEC=$(mktemp /tmp/ghost.XXXXXXXXXXXXXX)
cat <<"EOF" > $GHOSTTEMP
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
 char buffer[1024];
 char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
 struct hostent resbuf;
 struct hostent *result;
 int herrno;
 int retval;

 /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
 size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
 char name[sizeof(temp.buffer)];
 memset(name, '0', len);
 name[len] = '\0';

 retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

 if (strcmp(temp.canary, CANARY) != 0) {
 puts("Lo siento. Tu equipo está afectado por GHOST. Parchealo inmediatamente.");
 exit(EXIT_SUCCESS);
 }
 if (retval == ERANGE) {
 puts("¡Enhorabuena! Tu sistema no es vulnerable. Www.linuxadictos.com te desea un buen día.");
 exit(EXIT_SUCCESS);
 }
 puts("should not happen");
 exit(EXIT_FAILURE);
}
EOF
gcc -x c $GHOSTTEMP -o $GHOSTEXEC
$GHOSTEXEC
rm -f $GHOSTTEMP $GHOSTEXEC
  • Guarda el script y le das el nombre que tú quieras, por ejemplo “ghost-test.sh”, es importante que no lo guardes con la extensión .txt, sino con .sh. Si lo has guardado como .txt no importa, puedes pinchar en el fichero y cambiarselo en cualquier momento.
  • Ahora desde la consola ve a la carpeta donde se encuentre el script. Por ejemplo, si la tienes en /home teclea:
cd /home
  • Y luego haz lo siguiente (este paso también se puede hacer en modo gráfico, pinchando con el botón derecho del ratón sobre el fichero, te vas a propiedades y en la pestaña de Permisos le das permiso de ejecución):
sudo chmod 775 ghost-test.sh
  • Y ahora ejecutas el script desde la consola (recuerda que si lo has guardado con otro nombre diferente, tendrás que sustituir “ghost-test” por ese otro nombre):
./ghost-test.sh
  • Y te aparecerá un mensaje diciéndote si eres o no vulnerable. Así de sencillo.

Espero que te haya servido…Recuerda que algunas distribuciones usan versiones no afectadas por GHOST o puede que las actualizaciones automáticas lo hayan solucionado, si no es así, parchea tu distro o actualizala. Por ejemplo, Google ya solucionó este problema el año pasado en su Chrome OS para Chrome Book. Pero Google silenció el problema en vez de cooperar con la comunidad y que todos pudiesen solucionar el problema desde el pasado año. Un gesto extraño de Google y que no gusta nada.


Categorías

Kernel, Recursos

Isaac P. E.

Soy un apasionado de la tecnología y me encanta compartir, pero sobre todo aprender cada día más. Me gusta todo lo que tenga que ver con la... Ver perfil ›

6 comentarios

  1.   Ed Hunter dijo

    El html te ha creado una mala pasada, se te ha borrado todo lo incluido entre los menor y mayor que por lo que te faltan los include

  2.   Juan Simón dijo

    Ese código C no compila:
    “$ gcc -x c ghost-test.c -o ghost-test
    ghost-test.c:1:9: error: #include expects “FILENAME” or
    #include
    ^
    ghost-test.c:2:9: error: #include expects “FILENAME” or
    #include
    ^
    ghost-test.c:3:9: error: #include expects “FILENAME” or
    #include
    ^
    ghost-test.c:4:9: error: #include expects “FILENAME” or
    #include
    ^
    ghost-test.c:5:9: error: #include expects “FILENAME” or
    #include
    ^
    ghost-test.c: In function ‘main’:
    ghost-test.c:14:16: error: storage size of ‘resbuf’ isn’t known
    struct hostent resbuf;
    ^
    ghost-test.c:20:1: error: unknown type name ‘size_t’
    size_t len = sizeof(temp.buffer) – 16*sizeof(unsigned char) – 2*sizeof(char *) – 1;
    ^
    ghost-test.c:22:1: warning: incompatible implicit declaration of built-in function ‘memset’
    memset(name, ‘0’, len);
    ^
    ghost-test.c:29:1: warning: incompatible implicit declaration of built-in function ‘exit’
    exit(EXIT_SUCCESS);
    ^
    ghost-test.c:29:6: error: ‘EXIT_SUCCESS’ undeclared (first use in this function)
    exit(EXIT_SUCCESS);
    ^
    ghost-test.c:29:6: note: each undeclared identifier is reported only once for each function it appears in
    ghost-test.c:31:15: error: ‘ERANGE’ undeclared (first use in this function)
    if (retval == ERANGE) {
    ^
    ghost-test.c:33:1: warning: incompatible implicit declaration of built-in function ‘exit’
    exit(EXIT_SUCCESS);
    ^
    ghost-test.c:36:1: warning: incompatible implicit declaration of built-in function ‘exit’
    exit(EXIT_FAILURE);
    ^
    ghost-test.c:36:6: error: ‘EXIT_FAILURE’ undeclared (first use in this function)
    exit(EXIT_FAILURE);
    ^

  3.   Juan Simón dijo

    Supongo que este artículo ha sido copiado/traducido de otro blog, así que dejo este enlace donde está explicado de una manera mucho más sencilla y este sí funciona: http://www.cyberciti.biz/faq/cve-2015-0235-ghost-glibc-buffer-overflow-linux-test-program/

  4.   Eduardo dijo

    No se porqué os encanta complicarse la vida… sería más fácil crear el archivo y compartirlo a través de drive, dropbox, mega, mediafire o lo que sea, creo que de esa manera (haciéndolo) se percatarían si sirve o no…pero bueno!!

  5.   Isaac P. E. dijo

    Hola a todos. Ha sido un error al introducir el código del script. Ya está solucionado. Lo he comprobado en mi sistema y funciona a la perfección. Ahora ya podéis copiar el código del artículo que funcionará…

    Saludos y disculpad las molestias.

  6.   tres-cinco dijo

    Funciono perfectamente ¡¡¡gracias!!! no soy vulnerable

Escribe un comentario