
Analisi tecnica di CVE-2025-66628, un integer overflow nel parser TIM di ImageMagick che porta a letture fuori dai limiti, con causa principale, passaggi di sfruttamento e guida alla correzione.
| Attributo | Dettagli |
|---|
| CVE ID | CVE-2025-66628 |
| Vendor | ImageMagick Studio LLC |
| Prodotto | ImageMagick |
| Versioni interessate | < 7.1.2-10 |
| Versione corretta | 7.1.2-10 |
| Tipo di vulnerabilità | CWE-190 (Overflow di intero) |
| Punteggio CVSS v3.1 | 7.5 (Alto) |
| Vettore CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Ricercatore | Sumit Shah |
Esiste una vulnerabilità di overflow di intero nella funzione ReadTIMImage all'interno di coders/tim.c di ImageMagick. Durante l'elaborazione di file immagine TIM (PlayStation) su sistemi a 32 bit, la moltiplicazione non controllata di valori di larghezza e altezza forniti dall'utente provoca un sotto-allocazione di memoria, portando a letture fuori dai limiti durante l'elaborazione dei pixel.
La logica vulnerabile risiede in coders/tim.c:
/* coders/tim.c - Analizzatore immagini TIM */
// Input controllato dall'utente dall'intestazione del file TIM
larghezza = ReadBlobLSBShort(immagine); // 2 byte (0-65535)
altezza = ReadBlobLSBShort(immagine); // 2 byte (0-65535)
// VULNERABILE: Overflow di intero su sistemi a 32 bit
dimensione_immagine = 2 * larghezza * altezza; // Nessun controllo di overflow
// Memoria allocata con dimensione troncata
pixel = (unsigned char *) AcquireQuantumMemory(dimensione_immagine, sizeof(*pixel));
// Il ciclo elabora le dimensioni COMPLETE, leggendo oltre il buffer
for (y = 0; y < altezza; y++) {
for (x = 0; x < larghezza; x++) {
indice_pixel = (y * larghezza + x) * 2;
pixel[indice_pixel] = ReadBlobByte(immagine);
pixel[indice_pixel + 1] = ReadBlobByte(immagine);
}
}
Sulle architetture a 32 bit, size_t è limitato a 32 bit con valore massimo UINT_MAX = 4.294.967.295.
Quando larghezza e altezza sono entrambi impostati al massimo valore unsigned a 16 bit:
larghezza = 65535 (0xFFFF)
altezza = 65535 (0xFFFF)
Calcolo atteso:
2 × 65535 × 65535 = 8.589.869.050 byte (~8,5 GB)
Risultato effettivo (avvolgimento a 32 bit):
8.589.869.050 % 4.294.967.296 = 4.294.901.754
Risultato dopo il troncamento: Buffer allocato ridotto
L'overflow fa sì che l'allocatore di memoria riservi un buffer drasticamente più piccolo del necessario, mentre il ciclo di elaborazione itera comunque sulla griglia completa di pixel 65535 × 65535, provocando letture fuori dai limiti.
Passaggio 1: L'attaccante crea un file TIM con dimensioni che causano l'overflow
[Magic: 0x10]
[Tipo: 0x02]
[Larghezza: 0xFFFF] # 65535
[Altezza: 0xFFFF] # 65535
[Dati pixel...]
Passaggio 2: La vittima elabora il file malevolo
convert malicious.tim output.png
Passaggio 3: Si verifica una lettura fuori dai limiti, che porta a:
Sistemi a 32 bit dove size_t è a 32 bit. I sistemi a 64 bit non sono interessati a causa di una larghezza di intero sufficiente per rappresentare la dimensione calcolata senza overflow.
Divulgazione di informazioni (Primaria): La memoria heap del processo ImageMagick può essere letta durante l'accesso fuori dai limiti. Questa memoria può contenere:
I dati trapelati possono essere incorporati nell'immagine di output convertita o estratti tramite analisi dei canali laterali.
Denial of Service (Secondaria):
La lettura di regioni di memoria non mappate attiva SIGSEGV, causando la terminazione del processo ImageMagick e l'interruzione del servizio in pipeline di elaborazione automatica delle immagini.
I dettagli tecnici sono forniti a scopo di validazione. Non viene distribuito alcun codice di sfruttamento eseguibile.
convert, magick o qualsiasi chiamata API di ImageMagick$ convert malicious.tim output.png
Errore di segmentazione (core dump creato)
Oppure conversione riuscita con dati heap trapelati incorporati nell'output.
$ convert malicious.tim output.png
convert: Allocazione di memoria fallita `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
Aggiornare ImageMagick alla versione 7.1.2-10 o successiva:
# Verificare la versione corrente
convert --version
# Aggiornare usando il gestore pacchetti
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
Implementare controlli di overflow prima delle operazioni aritmetiche:
// Non sicuro
dimensione_immagine = 2 * larghezza * altezza;
// Sicuro
if (altezza != 0 && larghezza > (SIZE_MAX / 2) / altezza) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
dimensione_immagine = 2 * larghezza * altezza;
Applicare validazione dell'input e limiti di integrità sui valori delle dimensioni prima di eseguire i calcoli.
Questa vulnerabilità è stata identificata utilizzando l'analisi delle varianti. A seguito della divulgazione di un simile overflow di intero nel decoder BMP di ImageMagick, è stata condotta una revisione sistematica dei parser di formati legacy. Il pattern matching per calcoli non controllati di larghezza * altezza ha portato all'identificazione dello stesso difetto nel parser TIM.
I decoder di formati immagine legacy (TIM, SGI, VIFF, ecc.) rappresentano obiettivi di alto valore a causa di audit di sicurezza poco frequenti e dell'uso di aritmetica C non sicura.
Questa vulnerabilità è stata segnalata privatamente ai manutentori di ImageMagick tramite GitHub Security Advisories. La divulgazione pubblica è avvenuta solo dopo la disponibilità della patch e l'assegnazione del CVE. Questa ricerca è stata condotta eticamente secondo i principi della divulgazione responsabile.
SUMIT SHAH
Ricercatore: SUMIT SHAH