Vulnerabilidad de fantasmas (CVE-2015-0235)

13

¿La vulnerabilidad de Ghost requiere acceso (como ser un usuario conectado) al sistema operativo afectado en cuestión? ¿Alguien puede aclarar el "atacante remoto que puede hacer una llamada de aplicación"? Parece que solo encuentro pruebas para ejecutar en el sistema local directamente, pero no desde un host remoto.

Toda la información que he reunido hasta ahora sobre la vulnerabilidad de Ghost de múltiples fuentes (créditos a esas fuentes) la he publicado a continuación en una respuesta en caso de que alguien más tenga curiosidad.

Editar, encontré mi respuesta :

Durante una auditoría de código, los investigadores de Qualys descubrieron un desbordamiento del búfer en la función __nss_hostname_digits_dots () de glibc. Este error puede activarse tanto local como remotamente a través de todas las funciones gethostbyname * (). Las aplicaciones tienen acceso a la resolución DNS principalmente a través del conjunto de funciones gethostbyname * (). Estas funciones convierten un nombre de host en una dirección IP.

devnull
fuente
¿quizás agregue algunos enlaces al sitio de seguridad SE, como security.stackexchange.com/q/80210/1341 y otras publicaciones allí también?
MattBianco
Muru, moví el contenido a una respuesta. Gracias por la sugerencia. MattBianco, también agregué ese enlace, gracias.
devnull
Actualicé la pregunta para eliminar cualquier ambigüedad.
devnull

Respuestas:

20

Responda a mi pregunta, de Qualys :

Durante nuestras pruebas, desarrollamos una prueba de concepto en la que enviamos un correo electrónico especialmente creado a un servidor de correo y podemos obtener un shell remoto para la máquina Linux. Esto evita todas las protecciones existentes (como ASLR, PIE y NX) en los sistemas de 32 bits y de 64 bits.


Mi investigación compilada a continuación para cualquier otra persona que busque:


Descargo de responsabilidad

A pesar de lo que muchos otros hilos / blogs pueden decirle, le sugiero que no actualice inmediatamente cada sistema operativo que tenga a ciegas sin probar exhaustivamente estas glibcactualizaciones. Se ha informado de que las actualizaciones de glibc han provocado grandes fallas en las aplicaciones que han obligado a las personas a revertir sus actualizaciones de glibc a su versión anterior.

Uno no simplemente actualiza en masa un entorno de producción sin probarlo.


Información de contexto

GHOST es un error de 'desbordamiento de búfer' que afecta a las llamadas de función gethostbyname () y gethostbyname2 () en la biblioteca glibc. Esta vulnerabilidad permite que un atacante remoto pueda realizar una llamada a la aplicación a cualquiera de estas funciones para ejecutar código arbitrario con los permisos del usuario que ejecuta la aplicación.

Impacto

Las llamadas de función gethostbyname () se utilizan para la resolución de DNS, que es un evento muy común. Para aprovechar esta vulnerabilidad, un atacante debe desencadenar un desbordamiento del búfer al proporcionar un argumento de nombre de host no válido a una aplicación que realiza una resolución de DNS.

Lista actual de distribuciones de Linux afectadas

RHEL (Red Hat Enterprise Linux) versión 5.x, 6.xy 7.x

RHEL 4 ELS              fix available ---> glibc-2.3.4-2.57.el4.2
Desktop (v. 5)          fix available ---> glibc-2.5-123.el5_11.1
Desktop (v. 6)          fix available ---> glibc-2.12-1.149.el6_6.5
Desktop (v. 7)          fix available ---> glibc-2.17-55.el7_0.5
HPC Node (v. 6)         fix available ---> glibc-2.12-1.149.el6_6.5
HPC Node (v. 7)         fix available ---> glibc-2.17-55.el7_0.5
Server (v. 5)           fix available ---> glibc-2.5-123.el5_11.1
Server (v. 6)           fix available ---> glibc-2.12-1.149.el6_6.5
Server (v. 7)           fix available ---> glibc-2.17-55.el7_0.5
Server EUS (v. 6.6.z)   fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 6)      fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 7)      fix available ---> glibc-2.17-55.el7_0.5

CentOS Linux versión 5.x, 6.xy 7.x

CentOS-5    fix available ---> glibc-2.5-123.el5_11
CentOS-6    fix available ---> glibc-2.12-1.149.el6_6.5
CentOS-7    fix available ---> glibc-2.17-55.el7_0.5

Ubuntu Linux versión 10.04, 12.04 LTS

10.04 LTS   fix available ---> libc6-2.11.1-0ubuntu7.20
12.04 LTS   fix available ---> libc6-2.15-0ubuntu10.10

Debian Linux versión 6.x, 7.x

6.x squeeze              vulnerable
6.x squeeze (LTS)        fix available ---> eglibc-2.11.3-4+deb6u4
7.x wheezy               vulnerable
7.x wheezy (security)    fix available ---> glib-2.13-38+deb7u7

Linux Mint versión 13.0

Mint 13    fix available ---> libc6-2.15-0ubuntu10.10

Fedora Linux versión 19 (o anterior debería actualizarse)

Fedora 19 - vulnerable - EOL on Jan 6, 2014 (upgrade to Fedora 20/21 for patch)

SUSE Linux Enterprise

Server 10 SP4 LTSS for x86                    fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for AMD64 and Intel EM64T  fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for IBM zSeries 64bit      fix available ---> glibc-2.4-31.113.3
Software Development Kit 11 SP3               fix available ---> glibc-2.11.3-17.74.13
Server 11 SP1 LTSS                            fix available ---> glibc-2.11.1-0.60.1
Server 11 SP2 LTSS                            fix available ---> glibc-2.11.3-17.45.55.5
Server 11 SP3 (VMware)                        fix available ---> glibc-2.11.3-17.74.13
Server 11 SP3                                 fix available ---> glibc-2.11.3-17.74.13
Desktop 11 SP3                                fix available ---> glibc-2.11.3-17.74.13

openSUSE (las versiones anteriores a la 11 deberían actualizarse)

11.4 Evergreen     fix available ---> glibc-2.11.3-12.66.1
12.3               fix available ---> glibc-2.17-4.17.1


¿Qué paquetes / aplicaciones siguen usando glibc eliminado?

( créditos a Gilles )

Para CentOS / RHEL / Fedora / Scientific Linux:

   lsof -o / | awk '
   BEGIN {
       while (("rpm -ql glibc | grep \\\\.so\\$" | getline) > 0)
           libs[$0] = 1
   }
   $4 == "DEL" && $8 in libs {print $1, $2}'

Para Ubuntu / Debian Linux:

   lsof -o / | awk '
   BEGIN {
       while (("dpkg -L libc6:amd64 | grep \\\\.so\\$" | getline) > 0)
           libs[$0] = 1
   }
   $4 == "DEL" && $8 in libs {print $1, $2}'

¿Qué versión de la biblioteca C (glibc) usa mi sistema Linux?

La forma más fácil de verificar el número de versión es ejecutar el siguiente comando:

ldd --version

Resultados de muestra de RHEL / CentOS Linux v6.6:

ldd (GNU libc) 2.12
Copyright (C) 2010 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.

Resultados de muestra de Ubuntu Linux 12.04.5 LTS:

ldd (Ubuntu EGLIBC 2.15-0ubuntu10.9) 2.15
Copyright (C) 2012 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.

Resultados de muestra de Debian Linux v7.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.

Comprobación de vulnerabilidad de GHOST

La Universidad de Chicago aloja el siguiente script para una fácil descarga:

$ wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
[OR]
$ curl -O https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
$ gcc GHOST.c -o GHOST
$ ./GHOST
[responds vulnerable OR not vulnerable ]
/* 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);
}

Compile y ejecútelo de la siguiente manera:

$ gcc ghosttester.c -o ghosttester
$ ./ghosttester
[responds vulnerable OR not vulnerable ]

Red Hat Access Lab: herramienta GHOST No utilice esta herramienta, sus informes son incorrectos, el verificador de vulnerabilidad de Qualys es exacto.


Parchear


CentOS / RHEL / Fedora / Scientific Linux

sudo yum clean all
sudo yum update

Ahora reinicie para tener efecto:

sudo reboot

Alternativamente, si su espejo no contiene los paquetes más nuevos, simplemente descárguelos manualmente. * nota: para usuarios más avanzados

CentOS 5

http://mirror.centos.org/centos/5.11/updates/x86_64/RPMS/

CentOS 6

mkdir ~/ghostupdate
cd ~/ghostupdate

wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-common-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/nscd-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-utils-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.i686.rpm

yum localupdate *.rpm [OR] rpm -Uvh *.rpm

Ubuntu / Debian Linux

sudo apt-get clean
sudo apt-get update
sudo apt-get dist-upgrade

Reiniciar:

sudo reboot

SUSE Linux Enterprise

Para instalar esta actualización de seguridad de SUSE, use YaST online_update. O use los siguientes comandos según su versión:

Kit de desarrollo de software SUSE Linux Enterprise 11 SP3

zypper in -t patch sdksp3-glibc-10206

SUSE Linux Enterprise Server 11 SP3 para VMware

zypper in -t patch slessp3-glibc-10206

SUSE Linux Enterprise Server 11 SP3

zypper in -t patch slessp3-glibc-10206

SUSE Linux Enterprise Server 11 SP2 LTSS

zypper in -t patch slessp2-glibc-10204

SUSE Linux Enterprise Server 11 SP1 LTSS

zypper in -t patch slessp1-glibc-10202

SUSE Linux Enterprise Desktop 11 SP3

zypper in -t patch sledsp3-glibc-10206

Finalmente, ejecute todas las versiones de SUSE Linux para actualizar su sistema:

zypper patch

OpenSUSE Linux

Para ver una lista de actualizaciones disponibles, incluido glibc en un OpenSUSE Linux, ingrese:

zypper lu

Para actualizar simplemente los paquetes glibc instalados con sus nuevas versiones disponibles, ejecute:

zypper up

Casi todos los programas que se ejecutan en su máquina usan glibc. Debe reiniciar todos los servicios o aplicaciones que usan glibc para garantizar que el parche surta efecto. Por lo tanto, se recomienda reiniciar.


¿Cómo reiniciar init sin reiniciar o afectar el sistema?

telinit u

'man telinit': U o u para solicitar que el demonio init (8) se vuelva a ejecutar. Esto no se recomienda ya que Upstart actualmente no puede conservar su estado, pero es necesario al actualizar las bibliotecas del sistema.


Para mitigar de inmediato la amenaza de manera limitada es deshabilitar las verificaciones DNS inversas en todos sus servicios públicos. Por ejemplo, puede deshabilitar las comprobaciones de DNS inversas en SSH por el ajuste UseDNSa noen su /etc/ssh/sshd_config.

Fuentes (y más información):

  1. https://access.redhat.com/articles/1332213
  2. http://www.cyberciti.biz/faq/cve-2015-0235-patch-ghost-on-debian-ubuntu-fedora-centos-rhel-linux/
  3. http://www.openwall.com/lists/oss-security/2015/01/27/9
  4. /security/80210/ghost-bug-is-there-a-simple-way-to-test-if-my-system-is-secure
  5. http://bobcares.com/blog/ghost-hunting-resolving-glibc-remote-code-execution-vulnerability-cve-2015-0235-in-centos-red-hat-ubuntu-debian-and-suse-linux- servidores
  6. https://community.qualys.com/blogs/laws-of-vulnerabilities/2015/01/27/the-ghost-vulnerability
  7. https://security-tracker.debian.org/tracker/CVE-2015-0235
devnull
fuente
1
Nitpick: El código de prueba de vulnerabilidad es de Qualys, no de Openwall. La publicación de Openwall vinculada es simplemente el aviso de Qualys publicado en su lista de correo.
muru
"Debido a la gran cantidad de aplicaciones / utilidades del sistema que dependen de glibc" -> También podría sacar esas cosas o enfatizar el hecho de que el 100% de absolutamente todo depende directamente de libc, excepto las cosas muy extrañas que se han compilado como Un bulto estático gigante. Gracias por el BTW!
Ricitos
@goldilocks, gracias por la sugerencia. Lo edité junto con algunas otras cosas. Me alegra que ayude!
devnull