jueves, 29 de enero de 2015

Actualización de productos Apple: iOS, OS X y Safari

Como ya es habitual en los grandes fabricantes, Apple ha publicado de forma conjunta actualizaciones para sus productos más destacados. En esta ocasión encontramos actualizaciones para iOS (el sistema operativo para dispositivos móviles iPhone, iPad, iPod), el navegador Safari y el sistema operativo OS X.

iOS se actualiza a la versión 8.1.3 para ofrecer mayor estabilidad, mejorar el funcionamiento del sistema y además de incluir la corrección de diversos problemas no relacionados directamente con la seguridad, solucionar 33 nuevas vulnerabilidades.

Sobre los problemas corregidos Apple informa que se reduce la cantidad de espacio de almacenamiento necesaria para instalar una actualización de software. Soluciona un problema que impedía a algunos usuarios introducir la contraseña de su ID de Apple para usar Mensajes y FaceTime. Se corrige un problema que ocasiona que no se mostraran los resultados de búsqueda de aplicaciones en Spotlight. También se incluye la solución de un problema que provocaba que los gestos para multitarea no funcionaran en el iPad. Y nuevas opciones de configuración para exámenes estandarizados del sector educativo.

Respecto a las vulnerabilidades incluyen el propio kernel, y otros componentes del sistema como AppleFileConduit, CoreGraphics, dyld, FontParser, Foundation, IOAcceleratorFamily, IOHIDFamily, iTunes Store, libnetcore, MobileInstallation, Springboard y WebKit. Una parte importante de los problemas podrían permitir a un atacante lograr ejecutar código arbitrario en los sistemas afectados.

Las actualizaciones también han llegado a Safari, el popular navegador web de Apple, que se actualiza a las versiones 8.0.3, 7.1.3 y 6.2.3 para OS X Mountain Lion v10.8.5, OS X Mavericks v10.9.5 y OS X Yosemite v10.10.1. Se solucionan cuatro vulnerabilidades, todas relacionadas con problemas de corrupción de memoria en WebKit, el motor de navegador de código abierto que es la base de Safari. Y podrían ser aprovechadas por un atacante remoto para provocar condiciones de denegación de servicio o ejecutar código arbitrario al visitar una página web específicamente creada.

Por último, también ha publicado OS X Yosemite v10.10.2 y Security Update 2015-001, destinado a corregir hasta 54 nuevas vulnerabilidades, incluyendo las publicadas recientemente por el equipo de seguridad Project Zero de Google. Afectan a AFP Server, bash, Bluetooth, CFNetwork Cache, CoreGraphics, CPU Software, CommerceKit Framework, CoreSymbolication, FontParser, Foundation, Intel Graphics Driver, IOAcceleratorFamily, IOHIDFamily, IOKit, IOUSBFamily, Kernel, LaunchServices, LoginWindow, lukemftp, OpenSSL, Sandbox, SceneKit, Security, security_taskgate, Spotlight, SpotlightIndex, sysmond y UserAccountUpdater. Una parte importante de estos problemas podrían permitir la ejecución remota de código arbitrario. Además OS X Mavericks v10.9.5 incluye la nueva versión del navegador Safari 8.0.3.

Más información:

About the security content of iOS 8.1.3

Safari 8.0.3, Safari 7.1.3, and Safari 6.2.3

About the security content of OS X Yosemite v10.10.2 and Security Update 2015-001

una-al-dia (23/01/2015) Google anuncia vulnerabilidades en OS X


Antonio Ropero

Twitter: @aropero

miércoles, 28 de enero de 2015

GetRootByGetHostByName

El año va a comenzar como terminó 2014, plagado de grandes éxitos. El que hoy vamos a presentar tiene todos los visos de convertirse en la canción del verano de las veces que vamos a escucharla en los próximos meses. Dentro de unos días, cuando las listas y foros de seguridad se llenen de exploits solo tendréis que echarle un ojo a los registros del IPS para comprobarlo. Con 'shellshock' tenía su gracia, hacer un grep '() { :; }' en los del servidor web, sobre todo del IIS. En fin.

Este "gran éxito" ha sido bautizado como GHOST, tiene su propio logo y de momento (habrá que esperar) no tiene dominio propio y web para hacer pruebas, cuestión de tiempo, para que cumpla con todos los requisitos (resumimos: nombre pegadizo, logo y dominio+web para hacer pruebas). Vamos a lo que nos interesa, quién, qué, cómo y el diámetro del cráter que podría dejar su explotación.

Lo ha descubierto la empresa Qualys, dándolo a conocer Amol Sarwate, jefe de ingeniería, en un post en el blog de la empresa. No se publicarían detalles de GHOST hasta que las principales distribuciones Linux tuvieran los paquetes con el parche correspondiente fuera del horno. Y así ha sido, una vez se han sincronizado los repositorios han liberado los detalles del "fantasma". Un equilibrio casi perfecto entre el anuncio responsable y la cuota de atención que van a tener durante estos días. No le quitemos mérito, investigar es invertir y hasta ahora lo único que han hecho mal es ponerle un nombre antiSEO a la criatura.

Vamos al qué.

Todas las distribuciones Linux que usen la librería glibc (y eglibc) versión 2.17 y anteriores son virtualmente vulnerables. ¿Cómo comprobar la versión?

ldd print | grep libc.so

o directamente ejecutando la librería en la línea de comandos. Sí, puedes ejecutar una librería en Linux. En el caso de libc esta dispone de un punto de entrada hacia __libc_main donde llama a __libc_print_version que no hace otra cosa que imprimir cierta información en formato humano sobre su compilación.

 /lib/i386-linux-gnu$ ./libc.so.6

GNU C Library (Ubuntu EGLIBC 2.19-0ubuntu6.5) stable release version 2.19, by Roland McGrath et al.
Copyright (C) 2014 Free Software Foundation, Inc.

Evidentemente también puedes verificar la versión instalada buscando su paquete correspondiente, pero esto va a variar en función de la distribución usada.

Al grano. El fallo reside en la función '__nss_hostname_digits_dots', definida en el archivo 'gnu/glibc/nss/digits_dots.c'. Esta función es usada por un grupo de funciones de la familia 'gethostbyname' (de ahí el GHOST) y su cometido es comprobar si la cadena que se ha pasado a 'gethostbyname' es una IP. De esta forma el sistema se ahorra una consulta DNS. Básicamente es como si intentases resolver una IP (no una resolución inversa, ojo), algo que carece de sentido.
Vamos a recorrer la vulnerabilidad al revés, el fallo podemos verlos en la línea 157 del código de 'digits_dots.c' (sin el parche):

(157) resbuf->h_name = strcpy (hostname, name);

Ya de entrada el uso de 'strcpy' debería resultar sospechoso, básicamente porque no hace ninguna comprobación sobre los límites del búfer de destino y terminará sobrescribiendo "hostname" hasta que encuentre el carácter '\0' en "name".

Vemos de donde viene el cálculo del tamaño de "hostname".

(125) hostname = (char *) h_alias_ptr + sizeof (*h_alias_ptr);

'h_alias_ptr' es:

(124) h_alias_ptr = (char **) ((char *) h_addr_ptrs + sizeof (*h_addr_ptrs));

nuevamente, a su vez, 'h_alias_ptrs' es:

(122-123) h_addr_ptrs = (host_addr_list_t *) ((char *) host_addr + sizeof (*host_addr));

seguimos, 'host_addr' es un simple casting a 'buffer':

(121) host_addr = (host_addr_t *) *buffer;

'buffer' es donde se ha pasado el puntero que apunta al bloque de memoria reservado en 'new_buf':

(116) *buffer = new_buf;

Ya queda poco. 'new_buf' es donde está recogido el comienzo de la memoria reservada:

(101) *buffer_size = size_needed;
(102) new_buf = (char *) realloc (*buffer, *buffer_size);

Como podemos ver el tamaño viene definido por 'buffer_size' que es definido más arriba, teniendo en cuenta el tamaño de 'host_addr', 'h_addr_ptrs' y 'name'.

(85-86) size_needed = (sizeof (*host_addr) + sizeof (*h_addr_ptrs) + strlen (name) + 1);

Pero, ay, cuando se calcula el tamaño se hace con la intención de que en 'buffer' se guarden cuatro objetos, dejando un cuarto fuera del cálculo del tamaño de memoria a reservar: 'h_alias_ptr'.

Esta variable es un puntero a char. Luego la función 'strcpy' va a sobrescribir el tamaño, dependiente de la arquitectura, de un puntero a char. 4 bytes, típicamente, en arquitecturas de 32 bits, 8 bytes en las de 64 bits.

Esta es la cabecera de la función '__nss_hostname_digits_dots':
int
__nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
                            char **buffer, size_t *buffer_size,
                            size_t buflen, struct hostent **result,
                            enum nss_status *status, int af, int *h_errnop)
'name' es el parámetro que puede controlar el atacante. Cuando el servidor a la escucha necesite efectuar una llamada a 'gethostbyname' para resolver un nombre de dominio, es ahí donde comenzará la explotación.

Curiosamente, como apuntan en el anuncio de seguridad de Qualys, llegar a la línea donde se produce el desbordamiento es un camino lleno de obstáculos debido a la comprobación de ciertos valores en la cadena donde se supone que está el nombre del host. Todo un desafío para escribir un exploit.

Consideraciones

La librería 'libc' es omnipresente en todos los sistemas Linux, incluidos sistemas empotrados. Prácticamente casi todo el software nativo y no nativo hace uso de 'libc'. Eso convertiría en virtualmente vulnerable a casi todos los programas que hagan uso del grupo de funciones 'gethostbyname'. La salvedad es la forma en la que se hace uso de dichas funciones y más en el procesamiento previo que se efectúa sobre el nombre de host. Luego no todo es vulnerable, hay muchos condicionantes a tener en cuenta.

Curiosamente, este fallo ya fue parcheado en mayo de 2013, en la versión 2.18 de glibc, aunque en aquel momento no se llegó a tener en cuenta la "militarización" del error. Si vemos el parche aplicado en su día:
size_needed = (sizeof (*host_addr)
+ sizeof (*h_addr_ptrs)
+ sizeof (*h_alias_ptr) + strlen (name) + 1);
Comprobamos como se ha añadido el elemento faltante: 'h_alias_ptr'. Bug neutralizado.

Muchas distribuciones Linux ya contienen una versión corregida de este fallo desde entonces, 2013 y sin saberlo. Pero no es suficiente, ahora mismo, ahí afuera, hay cientos de miles de servicios que podrían estar a tres paquetes TCP de volar por los aires. La vulnerabilidad está presente desde 2000. Una calma que precede a la tempestad. Arriad velas, atrincad la carga y preparémonos para el impacto cuando publiquen los exploits.

Más información:

Qualys Releases Security Advisory for “GHOST” Vulnerability on Linux Systems

Qualys Security Advisory CVE-2015-0235
GHOST: glibc gethostbyname buffer overflow

funciones "gethostbyname*()"

[SECURITY] [DSA 3142-1] eglibc security update

Critical: glibc security update

USN-2485-1: GNU C Library vulnerability




David García
Twitter: @dgn1729