Recientemente se ha revelado una vulnerabilidad crítica en la librería GNU C (glibc), un componente usado por la totalidad de las distribuciones GNU/Linux, que podría permitir a un atacante tomar el control total de un sistema Linux sin usar ningún tipo de credenciales.

Este fallo de seguridad, al que se le ha asignado el código CVE-2015-0235 y el nombre “Ghost”, ha sido revelado por examinadores de la compañía de seguridad Qualys, quienes aseguran que puede suponer un gran peligro en aquellos equipos y servidores que no usen las últimas versiones de sus distribuciones Linux, y que podría llegar a estar a la altura de otros bugs importantes como Heartbleed, Shellshock o Poodle.

La compañía Qualys no ha publicado el código fuente, un portavoz de Duo Security ha dejado claro que de hacerse público, puede suponer una gran cantidad de daños colaterales en la red, y más aún si atacantes empiezan a desarrollar exploits para atacar sus objetivos.


¿Cómo funciona Ghost?

Ghost perjudica a glibc a partir de su versión 2.2, lanzada en el año 2000, y puede ser activado aprovechándose de la función __nss_hostname_digits_dots(), usada por otras funciones como gethostbyname(), que no calcula correctamente el tamaño del buffer que tiene que reservar y, bajo ciertas circunstancias, se pueden sobrescribir datos arbitrariamente mediante este desbordamiento. Aunque en principio sólo se pueden sobrescribir 4 bytes de memoria, se ha demostrado que son suficientes para evadir mitigaciones como ASLR y PIE y conseguir la ejecución remota de código. En la práctica, esto se podría explotar solicitando resolver un nombre de host lo suficientemente largo (al menos 1KB) que cumpla los requisitos normales de nomenclatura (a.b.c.d).

Esta función es utilizada por casi todos los equipos con Linux cuando intentan sacar el camino a otro dispositivo a través de la red, ya sea a través de los archivos /etc/hosts como a través de un DNS. Lo único que necesita hacer el atacante es provocar un desbordamiento de memoria (buffer overflow) utilizando un nombre de host inválido sobre el servicio de DNS. Esto hace que el atacante pueda usar el sistema a través del usuario que está ejecutando el servidor DNS.

Según los examinadores de Qualys, el enorme peligro de esta vulnerabilidad reside en la facilidad con la que un agresor puede explotarla, ya que con sólo enviar un correo electrónico a un sistema con Linux podría tener acceso total al equipo. La librería glibc es una de las mas conocidos de Linux, y es utilizada en elementos tan conocidos como Apache, Sendmail, MySQL o Samba, por lo que podría poner en peligro la integridad de decenas de páginas web en la red.


Versiones de glibc afectadas

  • glibc 2.2 a 2.17 (incluidas) – SON vulnerables
  • glibc 2.18 a 2.20 (incluidas) – NO son vulnerables
  • Las versiones anteriores de glibc (<= 2.1.3) - NO son vulnerables

¿Cómo comprobar si somos vulnerables?

Podemos comprobar que versión de glibc tenemos escribiendo lo siguiente en la consola del sistema:

ldd --version

Este comando mostrará como resultado algo similar a esto (ejemplo en Linux Debian 7.8):

ldd (Debian EGLIBC 2.13-38+deb7u6) 2.13
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

Si no usamos la versión 2.17 o 2.18 somos vulnerables a Ghost.

Otro método de comprobar la vulnerabilidad es usando el siguiente código fuente (escrito en C) que nos indicará si nuestro sistema Linux es vulnerable o no.

/* ghosttest.c:  GHOST vulnerability tester */
/* Credit: http://www.openwall.com/lists/oss-security/2015/01/27/9 */
#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("vulnerable");
		exit(EXIT_SUCCESS);
	}

	if (retval == ERANGE) {
		puts("not vulnerable");
		exit(EXIT_SUCCESS);
	}

	puts("should not happen");
	exit(EXIT_FAILURE);
}

Compilar y ejecutar código fuente:

gcc ghosttest.c -o ghosttest
./ghosttest

Ver lista de procesos y servicios afectados

lsof | grep libc | awk '{print $1}' | sort | uniq

Distribuciones Linux vulnerables

  • RHEL (Red Hat Enterprise Linux) 5.x, 6.x and 7.x
  • CentOS Linux 5.x, 6.x & 7.x
  • Ubuntu Linux 10.04, 12.04 LTS
  • Debian Linux 7.x
  • Linux Mint 13.0
  • Fedora Linux 19 y versiones anteriores
  • SUSE Linux Enterprise 11 y anteriores (también OpenSuse Linux 11 o versiones anteriores).
  • SUSE Linux Enterprise Software Development Kit 11 SP3
  • SUSE Linux Enterprise Server 11 SP3 for VMware
  • SUSE Linux Enterprise Server 11 SP3
  • SUSE Linux Enterprise Server 11 SP2 LTSS
  • SUSE Linux Enterprise Server 11 SP1 LTSS
  • SUSE Linux Enterprise Server 10 SP4 LTSS
  • SUSE Linux Enterprise Desktop 11 SP3
  • Arch Linux glibc versión <= 2.18-1

Solución

Este peligroso fallo de seguridad de Linux ya fue resuelto a partir de las versiones glibc-2.17 y glibc-2.18 lanzadas en mayo del 2013. El problema es que el fallo no fue catalogado como un problema de seguridad, por lo que hay muchas distribuciones como Debian 7, Ubuntu 10.04 y 12.04 o CentOS 5, 6 y 7 que no cuentan con el parche.

La forma más sencilla de resolver la vulnerabilidad del sistema es actualizarlo a la última versión ya que solo afecta a sistemas operativos ligeramente anticuados.

Linux Ubuntu / Debian

apt-get clean
apt-get update
apt-get upgrade
reboot

Linux CentOs / RHEL / Fedora / Scientific

yum clean all
yum update
reboot

FUENTES

www.genbeta.com
www.cyberciti.biz