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