Productos FTTH

Tienda FFTH desde 2004

Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon Imágenes JPEG maliciosas podrían causar vulnerabilidades de memoria en PHP


Se han detectado dos vulnerabilidades críticas de seguridad de memoria en las funciones de procesamiento de imágenes de PHP. Estos fallos, encontrados en la extensión ext/standard por el investigador Nikita Sveshnikov, afectan específicamente a las funciones getimagesize e iptcembed. Según el reporte, un atacante podría utilizar archivos JPEG especialmente diseñados para filtrar memoria sensible del heap o ejecutar ataques de denegación de servicio (DoS).
 


Dos vulnerabilidades críticas de seguridad de memoria en las funciones de procesamiento de imágenes de PHP podrían permitir que los atacantes filtren memoria sensible del montón (heap memory) o ejecuten ataques de denegación de servicio mediante archivos JPEG especialmente diseñados.

Los fallos, descubiertos en la extensión ext/standard de PHP por el investigador de Positive Technologies Nikita Sveshnikov, afectan a las funciones getimagesize e iptcembed, ampliamente utilizadas para procesar metadatos JPEG y datos IPTC.

Vulnerabilidades de Seguridad de Memoria en PHP

La primera vulnerabilidad, identificada como CVE-2025-14177 con una puntuación CVSS de 6.3, permite la divulgación de información cuando la función getimagesize de PHP procesa segmentos APP de JPEG en modo de lectura de múltiples fragmentos (multi-chunk).

Las versiones afectadas incluyen PHP 8.1.* antes de 8.1.34, 8.2.* antes de 8.2.30, 8.3.* antes de 8.3.29, 8.4.* antes de 8.4.16, y 8.5.* antes de 8.5.1.

La vulnerabilidad se origina en un error en la función php_read_stream_all_chunks que concatena incorrectamente los fragmentos de datos al leer los segmentos de aplicación JPEG. Al procesar segmentos APP que contienen metadatos como EXIF o IPTC, la función asigna memoria del montón no inicializada.

Sin embargo, no incrementa el puntero del búfer después de cada lectura. Esto provoca que los fragmentos posteriores sobrescriban el principio del búfer, dejando los bytes finales sin inicializar y exponiendo fragmentos de la memoria del proceso.

Los atacantes pueden explotar este fallo creando archivos JPEG con segmentos APP1 grandes diseñados para ser leídos en múltiples fragmentos, especialmente cuando se conoce el tamaño de fragmento predeterminado de 8,192 bytes.

Cuando las aplicaciones procesan estas imágenes maliciosas a través de php://filter u otros mecanismos de lectura de múltiples fragmentos, los datos del montón no inicializados que contienen información potencialmente sensible se copian en el array $info[‘APPn’] devuelto por getimagesize.

La superficie de ataque es particularmente preocupante para los endpoints de subida abiertos al público, los sistemas de gestión de contenidos (CMS) que generan miniaturas, los servicios de webmail y las CDN de imágenes que realizan análisis en el servidor de las imágenes subidas por los usuarios.

Los atacantes remotos pueden aprovechar la vulnerabilidad si logran que un proceso PHP vulnerable llame a getimagesize con datos controlados por el atacante.

Visualización del error de lectura de fragmentos (Fuente: PTSecurity)
Visualización del error de lectura de fragmentos (Fuente: PTSecurity)

Desbordamiento de Búfer del Montón en iptcembed

La segunda vulnerabilidad afecta a la función iptcembed, que incrusta datos binarios IPTC en imágenes JPEG.

Este clásico desbordamiento de búfer del montón ocurre debido a un fallo de “medir una vez, leer para siempre”: la función asigna un búfer de salida basado en un único resultado de fstat. Continúa leyendo datos hasta el final del archivo (EOF) sin realizar comprobaciones de capacidad.

La causa raíz reside en cómo iptcembed maneja tipos de archivos no estándar como FIFOs, tuberías (pipes) y sockets. Para estos tipos de archivos, el campo st_size devuelto por fstat es 0, lo que provoca que la función asigne un búfer demasiado pequeño.

Asignación de búfer de iptcembed (Fuente: PTSecurity)
Asignación de búfer de iptcembed (Fuente: PTSecurity)

Posteriormente, el código copia los datos de entrada en el búfer spoolbuf sin verificar el espacio disponible, lo que resulta en escrituras fuera de los límites cuando el flujo contiene más datos de los asignados.

Esta vulnerabilidad también introduce una condición de carrera de tiempo de comprobación al tiempo de uso (TOCTOU), en la que los archivos regulares pueden aumentar de tamaño después de fstat pero antes de que se complete la operación de lectura.

Los atacantes pueden explotar esto suministrando grandes cantidades de datos a través de estructuras JPEG especialmente diseñadas que obliguen al analizador a entrar en modo “leer todo hasta EOF”, provocando la corrupción del montón.

Ambas vulnerabilidades explotan debilidades en la gestión de memoria del Zend Engine de PHP, específicamente en las funciones que manejan el procesamiento de marcadores JPEG.

El fallo de getimagesize afecta a la función php_read_APP, que procesa segmentos específicos de la aplicación (APP0-APP15) que contienen metadatos como coordenadas EXIF, información de autoría IPTC y datos XMP.

Para el CVE-2025-14177, la ruta de código vulnerable comienza cuando getimagesize asigna memoria utilizando emalloc, que devuelve punteros de memoria no inicializados.

Si ocurre una lectura de múltiples fragmentos, la macro php_stream_read escribe en la misma dirección de destino sin aplicar desplazamientos para los bytes ya leídos, haciendo que el fragmento final sobrescriba el principio del búfer mientras deja intacta la sección final.

El desbordamiento de búfer de iptcembed se manifiesta al procesar marcadores M_APP13 o M_SOS (inicio de escaneo), donde el analizador cambia al modo php_iptc_read_remaining y copia datos hasta el EOF.

La función vulnerable php_iptc_get1 avanza el puntero de escritura (poi) por cada byte sin comprobar el límite de spoolbuf_end asignado.

Los investigadores demostraron ambas vulnerabilidades mediante exploits prácticos. Para el fallo de divulgación de memoria, crearon un JPEG mínimo con un segmento APP1 grande diseñado para ser leído en múltiples fragmentos de 8,192 bytes, realizaron un "heap spraying" con cadenas de marcadores para llenar la memoria y luego leyeron el archivo a través de php://filter para forzar el procesamiento multi-fragmento.

Diagrama de desbordamiento de iptcembed (Fuente: PTSecurity)
Diagrama de desbordamiento de iptcembed (Fuente: PTSecurity)

La prueba de concepto logró filtrar la cadena de marcador “LEAK-MARKER-123!” desde la memoria del montón no inicializada.

El desbordamiento de iptcembed se demostró utilizando una configuración de dos terminales con tuberías con nombre (FIFO), donde una terminal ejecutaba PHP leyendo de la tubería mientras otra alimentaba una estructura JPEG diseñada seguida de 8 MB de datos.

Dado que los FIFOs informan un st_size de cero, el búfer asignado era demasiado pequeño para contener el flujo entrante, lo que provocó que AddressSanitizer detectara el desbordamiento del búfer del montón.

Parches y Remediación

Los desarrolladores de PHP solucionaron la CVE-2025-14177 modificando php_read_stream_all_chunks para avanzar el puntero del búfer después de cada operación de lectura (buffer += read_now), asegurando la anexión secuencial de los fragmentos.

La corrección fue acompañada por una prueba de regresión ext/standard/tests/image/gh20584.phpt para evitar futuras recurrencias.

Para la vulnerabilidad de incrustación IPTC, los desarrolladores añadieron un parámetro spoolbuf_end a las funciones php_iptc_get1 y php_iptc_put1 para imponer la comprobación de límites. El código actualizado ahora devuelve de forma segura EOF cuando el búfer está lleno, en lugar de escribir fuera de los límites.

Deberías hacer un inventario inmediato de todos los hosts y contenedores que ejecuten PHP, priorizando los endpoints de subida públicos, los generadores de miniaturas de CMS, los sistemas de webmail y las CDN de imágenes. Debes aplicar las actualizaciones a las últimas versiones parcheadas: 8.1.34, 8.2.30, 8.3.29, 8.4.16, o 8.5.1 y superiores.



Fuentes:
https://cybersecuritynews.com/malicious-jpeg-images-php-memory-safety-vulnerabilities/


0 comentarios :

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.