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 ciencia y leer sobre esta temática. En mi tiempo libre escribo un libro sobre microprocesadores, mi tema favorito. También me gusta realizar diseños electrónicos en Basic Stamp, Arduino, además me encanta jugar con Linux. Algunos de mis estudios son: - Módulo superior de electrónica y microelectrónica. - Módulo de domótica. - Experto en gestión medioambiental en la empresa. - Técnico en prevención en la industria. - Técnico en montaje y reparación de ordenadores. - Técnico en reparación de portátiles. - Técnico en redes informáticas. - Curso GNU/Linux. Otros conocimientos: inglés, ofimática, programación en diversos lenguajes (C, KOP, VHDL, PBASIC, Arduino y HTML), conocimientos avanzados de Windows y Linux,...

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