
| Atributo | Detalles |
|---|---|
| ID de CVE | CVE-2025-66628 |
| Proveedor | ImageMagick Studio LLC |
| Producto | ImageMagick |
| Versiones Afectadas | < 7.1.2-10 |
| Versión Corregida | 7.1.2-10 |
| Tipo de Vulnerabilidad | CWE-190 (Desbordamiento de Enteros) |
| Puntuación CVSS v3.1 | 7.5 (Alta) |
| Vector CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Investigador | Sumit Shah |
Existe una vulnerabilidad de desbordamiento de enteros en la función ReadTIMImage dentro de coders/tim.c de ImageMagick. Al procesar archivos de imagen TIM (PlayStation) en sistemas de 32 bits, la multiplicación no verificada de los valores de ancho y alto controlados por el usuario provoca una subasignación de memoria, lo que conduce a lecturas fuera de los límites durante el procesamiento de píxeles.
La lógica vulnerable reside en coders/tim.c:
/* coders/tim.c - Analizador de Imágenes TIM */
// Entrada controlada por el usuario desde la cabecera del archivo TIM
width = ReadBlobLSBShort(image); // 2 bytes (0-65535)
height = ReadBlobLSBShort(image); // 2 bytes (0-65535)
// VULNERABLE: Desbordamiento de enteros en sistemas de 32 bits
image_size = 2 * width * height; // Sin comprobación de desbordamiento
// Memoria asignada con un tamaño truncado
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// El bucle procesa las dimensiones COMPLETAS, leyendo más allá del búfer
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
pixel_index = (y * width + x) * 2;
pixels[pixel_index] = ReadBlobByte(image);
pixels[pixel_index + 1] = ReadBlobByte(image);
}
}
En arquitecturas de 32 bits, size_t está limitado a 32 bits con un valor máximo de UINT_MAX = 4.294.967.295.
Cuando tanto el ancho como el alto se establecen en los valores máximos sin signo de 16 bits:
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
Cálculo esperado:
2 × 65535 × 65535 = 8.589.869.050 bytes (~8,5 GB)
Resultado real (ajuste por desbordamiento de 32 bits):
8.589.869.050 % 4.294.967.296 = 4.294.901.754
Resultado tras el truncamiento: Búfer asignado pequeño
El desbordamiento hace que el asignador de memoria reserve un búfer drásticamente más pequeño que el necesario, mientras que el bucle de procesamiento sigue iterando sobre la cuadrícula completa de píxeles de 65535 × 65535, lo que produce lecturas fuera de los límites.
Paso 1: El atacante crea un archivo TIM con dimensiones que provocan el desbordamiento
[Magic: 0x10]
[Type: 0x02]
[Width: 0xFFFF] # 65535
[Height: 0xFFFF] # 65535
[Pixel Data...]
Paso 2: La víctima procesa el archivo malicioso
convert malicious.tim output.png
Paso 3: Se produce una lectura fuera de los límites, que conduce a:
Sistemas de 32 bits donde size_t es de 32 bits. Los sistemas de 64 bits no están afectados debido a que el ancho de entero es suficiente para representar el tamaño calculado sin desbordamiento.
Divulgación de Información (Principal): La memoria del montículo del proceso de ImageMagick puede leerse durante el acceso fuera de los límites. Esta memoria puede contener:
Los datos filtrados pueden incrustarse en la imagen de salida convertida o extraerse mediante análisis de canal lateral.
Denegación de Servicio (Secundaria):
La lectura de regiones de memoria no mapeadas provoca SIGSEGV, lo que causa la terminación del proceso de ImageMagick y la interrupción del servicio en canalizaciones automatizadas de procesamiento de imágenes.
Los detalles técnicos se proporcionan con fines de validación. No se distribuye código de explotación ejecutable.
convert, magick o cualquier llamada a la API de ImageMagick$ convert malicious.tim output.png
Segmentation fault (core dumped)
O conversión exitosa con datos del montículo filtrados incrustados en la salida.
$ convert malicious.tim output.png
convert: Memory allocation failed `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
Actualice ImageMagick a la versión 7.1.2-10 o posterior:
# Verificar la versión actual
convert --version
# Actualizar mediante el gestor de paquetes
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
Implemente la comprobación de desbordamiento antes de las operaciones aritméticas:
// Inseguro
image_size = 2 * width * height;
// Seguro
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
Aplique validación de entrada y límites de cordura en los valores de las dimensiones antes de realizar los cálculos.
Esta vulnerabilidad se identificó mediante análisis de variantes. Tras la divulgación de un desbordamiento de enteros similar en el decodificador BMP de ImageMagick, se realizó una revisión sistemática de los analizadores de formatos heredados. La coincidencia de patrones para cálculos no verificados de width * height condujo a la identificación del mismo fallo en el analizador TIM.
Los decodificadores de formatos de imagen heredados (TIM, SGI, VIFF, etc.) representan objetivos de alto valor debido a las auditorías de seguridad poco frecuentes y a la dependencia de la aritmética insegura en C.
Esta vulnerabilidad se notificó de forma privada a los mantenedores de ImageMagick a través de GitHub Security Advisories. La divulgación pública se produjo solo después de la disponibilidad del parche y la asignación del CVE. Esta investigación se llevó a cabo de forma ética bajo los principios de divulgación responsable.
SUMIT SHAH
Investigador: SUMIT SHAH