Una grave vulnerabilidad bautizada como GHOST en GNU/Linux está presente en todas las versiones de Red Hat Enterprise Linux y variantes (CentOS etc.), así como los sistemas Debian.
Listado de distribuciones afectadas:
RHEL(Red Hat Enterprise Linux) version 6.x and 7.x
CentOS Linux version 6.x & 7.x
Ubuntu Linux version 10.04, 12.04 LTS
Debian Linux version 7.x
Linux Mint version 13.0
SUSE Linux Enterprise 11 and older (also OpenSuse Linux 11 or older versions).
Arch Linux glibc version <= 2.18-1
Todos los usuarios de glibc se les recomienda actualizar a estos paquetes
Como saber cual de mis servicios son afectados?
# lsof | grep libc | awk ‘{print $1}’ | sort | uniq
¿Cómo saber si estoy vulnerable?
Crear este archivo ghost.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#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); } |
COMPILAMOS
# gcc ghost.c -o ghost
VERIFICAMOS
#./ghost
Como corregir?
# yum update glibc
Y reinicia todos los servicios que usan esa librería