domingo, 15 de diciembre de 2013

Ejecución de código arbitrario en PHP a través de certificados X.509

Se ha corregido un fallo crítico en el lenguaje de programación PHP que podría permitir a un atacante ejecutar código arbitrario a través de un certificado X.509 especialmente manipulado.

El descubridor de la vulnerabilidad es el investigador Stefan Esser (https://twitter.com/i0n1c). Esser es conocido por la gran cantidad de fallos que ha encontrado a lo largo de su carrera, tanto en proyectos open source como por ejemplo el DRM de la videoconsola Microsoft Xbox o los exploits para la liberación del sistema iOS de Apple. En especial cabe destacar su habilidad para encontrar fallos en el lenguaje PHP del que fue contribuidor durante 5 años además de fundador del equipo de seguridad.

El fallo descubierto se encuentra en la función de PHP 'openssl_x509_parse'. Esta función se encarga de examinar un certificado X.509 y devuelve un array con toda la información adicional que éste contiene. A su vez, usa la función 'asn1_time_to_time_t' para la conversión de marcas de tiempo (timestamps) desde el formato ASN1 (cadenas de caracteres) a un entero.

Esta última función es vulnerable cuando trata datos en formato binario permitiendo escribir hasta 5 bytes nulos fuera del búfer reservado para los datos. Tal como cuenta Esser en la notificación de la vulnerabilidad, un certificado que contenga valores nulos en los campos 'notBefore' y 'notAfter' podría corromper la memoria y permitir la ejecución de código arbitrario cuando se emplea la función 'openssl_x509_parse' para procesarlo.

Como curiosidad, Esser se encontró con una implementación bastante antigua (de la versión de PHP 4.0.6) y descuidada en 'asn1_time_to_time_t', hasta el punto de que en el propio código de la función aparecía el siguiente mensaje de debug de su autor:

"extension author too lazy to parse %s correctly"

 (traducido: "El autor de la extensión es demasiado perezoso para analizar %s correctamente")

La vulnerabilidad, con CVE-2013-6420, ha sido corregida en las versiones 5.5.7, 5.4.23 y 5.3.28 de las respectivas ramas con mantenimiento. Son vulnerables las ramas sin soporte: 5.2, 5.1, 5.0 y de la 4.0.6 a la 4.4.9.

Más información:

Advisory 01/2013: PHP openssl_x509_parse() Memory Corruption Vulnerability


David García

Twitter: @dgn1729

No hay comentarios:

Publicar un comentario en la entrada