sábado, 31 de agosto de 2013

Múltiples vulnerabilidades en Cacti

Se han corregido múltiples fallos de seguridad en la última versión de Cacti (0.8.8b). Los errores se corresponden con una falta de filtrado adecuado en los parámetros de entrada que podrían permitir a un atacante inyectar código Javascript y SQL.

Cacti es un software especialmente diseñado para crear gráficas de monitorización mediante los datos obtenidos por diferentes herramientas que emplean el estándar RRDtool. Es uno de los sistemas de creación de gráficas más empleado en el mundo de la administración de sistemas y puede encontrarse como parte fundamental de otros programas.

Los errores se detallan a continuación:

  • CVE-2013-5588 - Cross-site-scripting no persistente

El parámetro "step" de la página "/install/index.php" sería vulnerable a XSS reflejado.
Ejemplo:
http://<IP>/cacti/install/index.php?x=52&y=21&step="><script>alert(12345)</script>

  • CVE-2013-5588 - Cross-site-scripting persistente

En este caso el parámetro "id" de la página "/cacti/host.php" sería vulnerable a XSS persistente. La siguiente petición POST sirve como prueba de concepto:

POST /cacti/host.php HTTP/1.1
Host: <IP>
Cookie: Cacti=blahblahblah
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 61

id=<script>alert(12345)</script>&save_component_host=1&action=save

Una vez hecha la petición anterior, accedemos a
http://<IP>/cacti/utilities.php?tail_lines=500&message_type=-1&go=Go&refresh=60&reverse=1&filter=12345&page=1&action=view_logfile
y podremos ver la ventana emergente que demuestra el XSS.

  • CVE-2013-5589 - Blind SQL injection

El parámetro "id" de la página "/install/index.php" además sería vulnerable a una inyección sql ciega , esto se debe a que no se filtra correctamente este parámetro cuando se le pasa a la función api_device_save() del script lib/api_device.php. Sirva como POC la siguiente petición:

POST /cacti/host.php HTTP/1.1
Host: <IP>
Cookie: Cacti=blahblahblah
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 69

id=-1 AND BENCHMARK(1000000,MD5(1))&save_component_host=1&action=save

Se han publicado parches que solucionan dichos errores y que se encuentran disponibles a través del repositorio svn de cacti, concretamente las revisiones r7420 y r7421.

Más información:

Multiple vulnerabilities in Cacti 0.8.8b and lower

Bug #0002383 : Sanitize the step and id variables

Bug #0002383 : Sanitize the step and id variables same as R#7420 for 089



Fernando Castillo

viernes, 30 de agosto de 2013

Vulnerabilidades de Cross-Site Scripting en IBM Lotus iNotes

Se han confirmado cuatro vulnerabilidades en IBM Lotus iNotes 8.5, 8.5.1, 8.5.2 y 8.5.3 que podrían permitir a atacantes remotos la realización de ataques de cross-site scripting.

IBM iNotes (anteriormente conocido como IBM Lotus iNotes) es una versión basada en web del cliente de Notes, incluyendo todas sus funciones. iNotes proporciona acceso desde el navegador al correo electrónico, el calendario y los contactos de Notes, así como el acceso a las aplicaciones y herramientas empresariales.

Los problemas, con CVE-2013-0590, CVE-2013-0591, CVE-2013-0595 (compartido por dos vulnerabilidades), residen en que iNotes no filtra adecuadamente el código HTML introducido por el usuario antes de mostrar la entrada. Esto permite a usuarios remotos la ejecución arbitraria de código script en el navegador del usuario. Con ello el atacante podría acceder a las cookies (incluyendo las de autenticación) y a información recientemente enviada, además de poder realizar acciones en el sitio haciéndose pasar por la víctima.

IBM ha asignado el identificador SPR# PTHN95XNR3 a estas vulnerabilidades, y ha publicado los parches necesarios en IBM Domino 8.5.3 Fix Pack 5, disponible desde:

Más información:

Security Bulletin: IBM iNotes vulnerabilities (CVE-2013-0590, CVE-2013-0591, CVE-2013-0595)




Antonio Ropero
Twitter: @aropero



jueves, 29 de agosto de 2013

RealNetworks publica actualización para RealPlayer

RealNetworks ha anunciado una actualización para corregir dos vulnerabilidades en RealPlayer, que podrían permitir a un atacante comprometer los sistemas afectados. 

Se ven afectadas las versiones RealPlayer 11.0 a 11.1, RealPlayer SP 1.0 a 1.1.5 y RealPlayer 14.0.0 a 16.0.2.32.

Las vulnerabilidades, con los CVE-2013-4973 y CVE-2013-4974, residen en un desbordamiento de búfer en Player con archivos .rmp y en una corrupción de memoria de RM al analizar archivos RealMedia con formato incorrecto. Ambos problemas podrían permitir la ejecución remota de código arbitrario y comprometer los sistemas afectados.

Se recomienda actualizar a las versiones RealPlayer 16.0.3.51 (para Windows XP, Vista, Windows 7 y Windows 8).

Más información:

RealNetworks, Inc. lanza una actualización de seguridad para resolver puntos vulnerables.

  

Antonio Ropero

Twitter: @aropero

miércoles, 28 de agosto de 2013

¿Tienes Java 6 instalado?

Oracle dio por finalizado el soporte público para Java versión 6 el pasado febrero. Las versiones públicas de Java poseen un soporte de tres años. Pasado ese tiempo solo los clientes que tengan una licencia comercial del producto podrán tener acceso a los parches críticos, periodo que se extiende cinco años adicionales.

¿Cual es el problema? Java 6 aun se encuentra instalado en millones de sistemas, no tiene soporte y existe una vulnerabilidad con exploit publicado que se está usando activamente para infectar equipos.

En concreto se trata de la vulnerabilidad etiquetada con el CVE-2013-2463. Un error en el índice de un array al invocar la función nativa 'storeImageArray'. Dicha función pertenece a la capa nativa del paquete AWT (Abstract Widget Toolkit) encargado entre otras cosas del tratamiento de imágenes, un paquete disponible desde la versión 1.0 de Java.

Podemos ver parte del código de la función aquí:

static int storeImageArray(JNIEnv *env, BufImageS_t *srcP, BufImageS_t *dstP, mlib_image *mlibImP)
{
    int mStride;
    unsigned char *cmDataP, *dataP, *cDataP;
    HintS_t *hintP = &dstP->hints;
    RasterS_t *rasterP = &dstP->raster;
    int y;    
    ...
    if (hintP->packing == BYTE_INTERLEAVED) {
        /* Write it back to the destination */
        cmDataP = (unsigned char *) mlib_ImageGetData(mlibImP);
        mStride = mlib_ImageGetStride(mlibImP);
        dataP = (unsigned char *)(*env)->GetPrimitiveArrayCritical(env, rasterP->jdata, NULL);
        if (dataP == NULL) return 0;
        cDataP = dataP + hintP->dataOffset;
        for (y=0; y < rasterP->height;
             y++, cmDataP += mStride, cDataP += hintP->sStride)
        {
            memcpy(cDataP, cmDataP, rasterP->width*hintP->numChans);
        }
    }
    ...
}


La variable 'dataP’ se inicializa a través de la variable miembro 'data' del objeto Java 'sun.awt.image.BytePackedRaster'. Dicho objeto es la instanciación de una clase que pertenece al paquete 'sun'. Esto significa que estás clases no deberían ser instanciadas directamente ya que pertenecen a funcionalidad que el fabricante usa para la parte pública, es decir, aquellos paquetes que comienzan por java, javax o org por ejemplo. Pero, por supuesto, nada impide crear objetos sobre las clases de dichos paquetes si estos tienen un constructor público o a través de una factoría.

'data' es un array del tipo primitivo 'byte' y contendrá un array de bytes correspondientes a una imagen. El valor 'dataP' se suma a 'hintP->dataOffset'. Este último valor se extrae del campo miembro 'dataBitOffset' del tipo 'int' o entero. La suma de estos dos valores nos da 'cDataP' que es la dirección destino donde vamos a efectuar una copia de datos en memoria.

El problema comienza cuando creamos un objeto del tipo 'BytePackedRaster' a través del método 'createWritableRaster' de la clase 'java.awt.image.Raster'. Dicho método necesita varios objetos para crearnos un 'BytePackedRaster'. El primero de ellos es de la clase 'java.awt.image.MultiPixelPackedSampleModel'. Uno de los parámetros necesarios para el constructor es 'dataBitOffset'. La clave es que la validación de dicho miembro, efectuada a través de la función miembro privada 'verify', falla.

Veamos la implementación:

private void verify (boolean strictCheck) {
    // Make sure data for Raster is in a legal range
    if (dataBitOffset < 0) {
        throw new RasterFormatException("Data offsets must be >= 0");
    }

    int lastbit = (dataBitOffset
                   + (height-1) * scanlineStride * 8
                   + (width-1) * pixelBitStride
                   + pixelBitStride - 1);
    if (lastbit / 8 >= data.length) {
        throw new RasterFormatException("raster dimensions overflow " +
                                        "array bounds");
    }
    if (strictCheck) {
        if (height > 1) {
            lastbit = width * pixelBitStride - 1;
            if (lastbit / 8 >= scanlineStride) {
                throw new RasterFormatException("data for adjacent" +
                                                " scanlines overlaps");
            }
        }
    }
}

Para comenzar, cuando se construye el objeto 'BytePackedRaste', se llama a 'verify' con el parámetro a 'false' por lo que la parte final del 'if (strictCheck) ...' no será llamada.

Pero si observamos bien cuando hace el 'if (lastbit / 8 ...' está permitiendo que 'dataBitOffset' pueda alcanzar un valor mayor que la capacidad del array para ciertos valores manipulados de la imagen. Por ejemplo en el exploit el constructor de 'MultiPixelPackedSampleModel' se llama con los valores:
width = 4, height = 1, numberOfBits = 1, scanlineStride = 4, dataBitOffset = (44 para 32 bits, 44+8 para 64 bits)

MultiPixelPackedSampleModel sm = new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE, 4,1,1,4, 44 + (_is64 ? 8:0));

Frente a un búfer creado de manera expresa:

DataBufferByte dst = new DataBufferByte(16);

Esto nos va a permitir que cuando vayamos a escribir en dicho búfer a través de la función nativa 'storeImageArray' podamos escribir fuera de los límites del búfer. En dicho búfer, sobre el que tenemos control de escritura, podemos alojar un objeto y modificar sus permisos para ejecutar código fuera de la sandbox de Java.

En el exploit, como prueba de concepto, nos va a invocar la calculadora (el hola mundo de los exploits), pero prácticamente deja la puerta abierta a la imaginación.

Esto no es nada nuevo ni es noticia, ya que dicha vulnerabilidad se conoce desde hace meses y está parcheada para Java 7 revisión 25. El exploit sí que se publicó hace relativamente poco, a principios de agosto.

La noticia es que está siendo activamente explotado por varios kits de exploits y no hay ni va a haber parche para Java 6. Al menos para la gran mayoría de usuarios. Esto significa que mantener una versión de Java 7 sin actualizar o tener Java 6 en el sistema y visitar una página infectada significa el compromiso del sistema.

Quizás el verdadero problema se encuentre en aquellas empresas que dependen de la versión 6 de Java para funcionar y aun no hayan realizado la migración (o no puedan permitírselo) a la versión 7. En este caso se deberían extremar las medidas de seguridad oportunas para evitar incidentes y recordar el riesgo que supone mantener activo un producto sin soporte.

Más información:

public class: BytePackedRaster

Java 6 exploit found in the wild

Oracle Java SE Support Roadmap

Packet Storm Exploit 2013-0811-1 - Oracle Java storeImageArray() Invalid Array Indexing Code Execution


David García
Twitter: @dgn1729


martes, 27 de agosto de 2013

Boletines de seguridad para Asterisk

Asterisk ha publicado los boletines AST-2013-004 y AST-2013-005 que solucionan dos vulnerabilidades que podrían permitir a atacantes remotos provocar denegaciones de servicio.

Asterisk es una implementación de una central telefónica (PBX) de código abierto. Como cualquier PBX, se pueden conectar un número determinado de teléfonos para hacer llamadas entre sí e incluso conectarlos a un proveedor de VoIP para realizar comunicaciones con el exterior. Asterisk es ampliamente usado e incluye un gran número de interesantes características: buzón de voz, conferencias, IVR, distribución automática de llamadas, etc. Además el software creado por Digium está disponible para plataformas Linux, BSD, MacOS X, Solaris y Microsoft Windows.

Se detallan los boletines a continuación:

  • AST-2013-004: Colin Cuthbertson reporta un fallo en el driver del canal SIP cuando un ACK con SDP es recibido después de que el canal haya sido terminado, debido a asumir incorrectamente que el canal siempre estuviera presente. Afecta a Asterisk Open Source 1.8.17.0 en adelante y toda la rama 11.x, Certified Asterisk 1.8.15 y 11.2.
         
  • AST-2013-005: Walter Doekes reporta una vulnerabilidad en el driver del canal SIP si un SDP es enviado en una petición SIP que defina descripciones de medios de comunicación antes que la información de conexión. Esto es debido a hacer referencias de direcciones de socket a pesar de no haberse establecido. Afecta a Asterisk Open Source 1.8.x , 10.x, 11.x ; Certified Asterisk 1.8.15 , 11.2 y Asterisk with Digiumphones 10.x-digiumphones.


Ambos fallos podrían ser aprovechados por un atacante remoto para causar denegación de servicio.

Se han publicado las versiones Asterisk Open Source 1.8.23.1, 10.12.3, 11.5.1; Certified Asterisk 1.8.15-cert3, 11.2-cert2 y Asterisk with Digiumphones 10.12.3-digiumphones que solucionan dichos problemas.

Más información:

Remote Crash From Late Arriving SIP ACK With SDP

Remote Crash when Invalid SDP is sent in SIP Request



Fernando Castillo

lunes, 26 de agosto de 2013

Boletines de seguridad para Debian

Debian ha publicado dos boletines de seguridad que corrigen varias vulnerabilidades en php5 y kfreebsd-9. Estos fallos podrían permitir a un atacante falsificar certificados SSL, revelar información importante y evadir restricciones de seguridad.

El primer boletín, DSA-2742, corrige un fallo en el paquete correspondiente a php5. El popular lenguaje de programación ampliamente usado en aplicaciones web. En el se corrige un fallo al no procesar correctamente el carácter '\0' o NUL en el campo de extensión 'subjectAlrName' de los certificados X.509.

Este error permite a un atacante falsificar un certificado SSL si la aplicación no restringe adecuadamente la Autoridad Certificadora (CA). La vulnerabilidad tiene asignado el CVE-2013-4248

El segundo boletín, DSA-2743, corrige varios fallos de seguridad en kfreebsd-9. Esto no es un simple paquete, kFreeBSD se trata de una distribución Debian pero con el núcleo FreeBSD (de hecho la k delante de FreeBSD significa que usa el kernel exclusivamente). Un interesante proyecto de Debian que, aunque lanzado en 2010, se encuentra en la fase de "technology preview".

En dicho boletín se corrigen 3 vulnerabilidades:

Existe un error de desbordamiento de entero cuando se está calculando el tamaño de un búfer en operaciones IP multicast. Dicho búfer podría ser de un tamaño menor del esperado provocando que se lean páginas de memoria del kernel. Esto podría permitir a un atacante obtener información importante e incluso elevar privilegios en determinadas ocasiones (por ejemplo si pueden leerse contraseñas o hashes almacenados en memoria)

El fallo tiene asignado el CVE-2013-3077 y fue descubierto por Clement Lecigne del equipo de seguridad de Google.

El siguiente error es provocado por un uso incorrecto por parte del kernel de las credenciales que un usuario envía en operaciones con NFS (Network File System). Esto permitiría a un atacante evadir ciertas restricciones y acceder a archivos en recursos compartidos por NFS.

El fallo fue descubierto por Rick Macklem, Christopher Key y Tim Zingelman. Tiene asignado el CVE-2013-4851.

La última vulnerabilidad corregida por el boletín permite leer partes de la memoria del kernel cuando se inicializa la cookie de estado de SCTP. El búfer que se reserva para dicha operación no es inicializa correctamente por lo que ciertos fragmentos de la memoria del kernel se incrustarán en los paquetes respuesta de SCTP. Al igual que la primera vulnerabilidad de este boletín, esto permitiría a un atacante revelar información importante e incluso elevar privilegios si en dichos fragmentos de memoria residen credenciales o hashes de cuentas de usuarios.

La vulnerabilidad fue descubierta por Julian Seward y Michael Tuexen y tiene asignado el CVE-2013-5209.

Más información:

Debian Security Advisory



David García

Twitter: @dgn1729