
Analyse technique de CVE-2025-66628, un débordement d'entier dans l'analyseur TIM d'ImageMagick conduisant à des lectures hors limites, avec cause racine, étapes d'exploitation et conseils de remédiation.
| Attribut | Détails |
|---|---|
| ID CVE | CVE-2025-66628 |
| Fournisseur | ImageMagick Studio LLC |
| Produit | ImageMagick |
| Versions affectées | < 7.1.2-10 |
| Version corrigée | 7.1.2-10 |
| Type de vulnérabilité | CWE-190 (Débordement d'entier) |
| Score CVSS v3.1 | 7.5 (Élevé) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Chercheur | Sumit Shah |
Une vulnérabilité de débordement d'entier existe dans la fonction ReadTIMImage du fichier coders/tim.c d'ImageMagick. Lors du traitement de fichiers image TIM (PlayStation) sur des systèmes 32 bits, la multiplication non contrôlée des valeurs de largeur et de hauteur contrôlées par l'utilisateur entraîne une sous-allocation mémoire, conduisant à des lectures hors limites lors du traitement des pixels.
La logique vulnérable se trouve dans coders/tim.c :
/* coders/tim.c - Analyseur d'image TIM */
// Entrée contrôlée par l'utilisateur depuis l'en-tête du fichier TIM
width = ReadBlobLSBShort(image); // 2 octets (0-65535)
height = ReadBlobLSBShort(image); // 2 octets (0-65535)
// VULNÉRABLE : Débordement d'entier sur systèmes 32 bits
image_size = 2 * width * height; // Aucune vérification de débordement
// Mémoire allouée avec une taille tronquée
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// La boucle traite les dimensions COMPLÈTES, lisant au-delà du tampon
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);
}
}
Sur les architectures 32 bits, size_t est limité à 32 bits avec une valeur maximale UINT_MAX = 4,294,967,295.
Lorsque la largeur et la hauteur sont toutes deux définies à la valeur maximale non signée 16 bits :
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
Calcul attendu :
2 × 65535 × 65535 = 8 589 869 050 octets (~8,5 Go)
Résultat réel (enroulement 32 bits) :
8 589 869 050 % 4 294 967 296 = 4 294 901 754
Résultat après troncature : Tampon alloué de petite taille
Le débordement amène l'allocateur mémoire à réserver un tampon considérablement plus petit que nécessaire, tandis que la boucle de traitement itère toujours sur la grille complète de 65535 × 65535 pixels, entraînant des lectures hors limites.
Étape 1 : L'attaquant crée un fichier TIM avec des dimensions provoquant un débordement
[Magic: 0x10]
[Type: 0x02]
[Width: 0xFFFF] # 65535
[Height: 0xFFFF] # 65535
[Données pixels...]
Étape 2 : La victime traite le fichier malveillant
convert malicious.tim output.png
Étape 3 : Une lecture hors limites se produit, entraînant :
Systèmes 32 bits où size_t est sur 32 bits. Les systèmes 64 bits ne sont pas affectés en raison d'une largeur d'entier suffisante pour représenter la taille calculée sans débordement.
Divulgation d'informations (Principal) : La mémoire du tas du processus ImageMagick peut être lue lors de l'accès hors limites. Cette mémoire peut contenir :
Les données divulguées peuvent être intégrées dans l'image de sortie convertie ou extraites via une analyse par canal auxiliaire.
Déni de service (Secondaire) :
La lecture de régions mémoire non mappées déclenche un SIGSEGV, provoquant la terminaison du processus ImageMagick et une interruption de service dans les pipelines automatisés de traitement d'images.
Les détails techniques sont fournis à des fins de validation. Aucun code exécutable d'exploitation n'est distribué.
convert, magick, ou tout appel API ImageMagick$ convert malicious.tim output.png
Erreur de segmentation (core dumped)
Ou conversion réussie avec des données de tas divulguées intégrées dans la sortie.
$ convert malicious.tim output.png
convert: Allocation mémoire échouée `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
Mettez à jour ImageMagick vers la version 7.1.2-10 ou ultérieure :
# Vérifier la version actuelle
convert --version
# Mise à jour via le gestionnaire de paquets
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
Implémentez une vérification de débordement avant les opérations arithmétiques :
// Non sécurisé
image_size = 2 * width * height;
// Sécurisé
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
Appliquez une validation des entrées et des limites raisonnables sur les valeurs de dimensions avant d'effectuer les calculs.
Cette vulnérabilité a été identifiée par analyse de variantes. Suite à la divulgation d'un débordement d'entier similaire dans le décodeur BMP d'ImageMagick, une revue systématique des analyseurs de formats hérités a été menée. La recherche de motifs correspondant à des calculs width * height non vérifiés a conduit à l'identification de la même faille dans l'analyseur TIM.
Les décodeurs de formats d'image hérités (TIM, SGI, VIFF, etc.) représentent des cibles de grande valeur en raison d'audits de sécurité peu fréquents et de l'utilisation d'arithmétique C non sécurisée.
Cette vulnérabilité a été signalée de manière privée aux mainteneurs d'ImageMagick via les avis de sécurité GitHub. La divulgation publique n'a eu lieu qu'après la disponibilité du correctif et l'attribution du CVE. Cette recherche a été menée de manière éthique dans le respect des principes de divulgation responsable.
SUMIT SHAH
Chercheur : SUMIT SHAH