
Detaillierte Offenlegung von CVE-2025-66628, die einen Integer-Überlauf im TIM parser von ImageMagick analysiert, einschließlich Grundursache, Ausnutzungsschritte, Auswirkungsbewertung und Behebungsanleitung für 32-Bit-Systeme.
| Attribut | Details |
|---|---|
| CVE-ID | CVE-2025-66628 |
| Anbieter | ImageMagick Studio LLC |
| Produkt | ImageMagick |
| Betroffene Versionen | < 7.1.2-10 |
| Behobene Version | 7.1.2-10 |
| Schwachstellentyp | CWE-190 (Integer Overflow) |
| CVSS v3.1 Bewertung | 7.5 (Hoch) |
| CVSS-Vektor | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Forscher | Sumit Shah |
Eine Integer-Überlauf-Schwachstelle existiert in der Funktion ReadTIMImage in coders/tim.c von ImageMagick. Bei der Verarbeitung von TIM-Bilddateien (PlayStation) auf 32-Bit-Systemen führt eine ungeprüfte Multiplikation benutzergesteuerter Breiten- und Höhenwerte zu einer Unterallokation von Speicher, was zu Out-of-Bounds-Lesevorgängen während der Pixelverarbeitung führt.
Der anfällige Code befindet sich in coders/tim.c:
/* coders/tim.c - TIM Image Parser */
// Benutzergesteuerte Eingabe aus dem TIM-Dateiheader
width = ReadBlobLSBShort(image); // 2 bytes (0-65535)
height = ReadBlobLSBShort(image); // 2 bytes (0-65535)
// ANFÄLLIG: Integer-Überlauf auf 32-Bit-Systemen
image_size = 2 * width * height; // No overflow check
// Speicher mit abgeschnittener Größe allokiert
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// Schleife verarbeitet VOLLE Abmessungen, liest über Puffer hinaus
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);
}
}
Auf 32-Bit-Architekturen ist size_t auf 32 Bit begrenzt mit dem Maximalwert UINT_MAX = 4,294,967,295.
Wenn Breite und Höhe auf die maximalen 16-Bit-Werte ohne Vorzeichen gesetzt werden:
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
Erwartete Berechnung:
2 × 65535 × 65535 = 8,589,869,050 bytes (~8.5 GB)
Tatsächliches Ergebnis (32-Bit-Überlauf):
8,589,869,050 % 4,294,967,296 = 4,294,901,754
Ergebnis nach Abschneiden: Small allocated buffer
Der Überlauf führt dazu, dass der Speicher-Allokator einen drastisch kleineren Puffer als benötigt reserviert, während die Verarbeitungsschleife weiterhin über das gesamte 65535 × 65535 Pixelraster iteriert, was zu Out-of-Bounds-Lesevorgängen führt.
Schritt 1: Angreifer erstellt TIM-Datei mit Abmessungen, die Überlauf verursachen
[Magic: 0x10]
[Type: 0x02]
[Width: 0xFFFF] # 65535
[Height: 0xFFFF] # 65535
[Pixel Data...]
Schritt 2: Opfer verarbeitet die bösartige Datei
convert malicious.tim output.png
Schritt 3: Out-of-Bounds-Lesevorgang tritt auf, was zu Folgendem führt:
32-Bit-Systeme, bei denen size_t 32 Bit groß ist. 64-Bit-Systeme sind nicht betroffen, da die Integer-Breite ausreicht, um die berechnete Größe ohne Überlauf darzustellen.
Informationspreisgabe (Primär): Heap-Speicher des ImageMagick-Prozesses kann während des Out-of-Bounds-Zugriffs gelesen werden. Dieser Speicher kann enthalten:
Die durchgesickerten Daten können in das konvertierte Ausgabebild eingebettet oder über Seitenkanalanalyse extrahiert werden.
Denial of Service (Sekundär):
Das Lesen nicht zugeordneter Speicherbereiche löst SIGSEGV aus, was zur Beendigung des ImageMagick-Prozesses und zu Dienstunterbrechungen in automatisierten Bildverarbeitungspipelines führt.
Technische Details werden zu Validierungszwecken bereitgestellt. Es wird kein ausführbarer Exploit-Code verteilt.
convert, magick oder einen ImageMagick-API-Aufruf$ convert malicious.tim output.png
Segmentation fault (core dumped)
Oder erfolgreiche Konvertierung mit durchgesickerten Heap-Daten im Ausgabebild.
$ convert malicious.tim output.png
convert: Memory allocation failed `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
Aktualisieren Sie ImageMagick auf Version 7.1.2-10 oder höher:
# Verify current version
convert --version
# Update using package manager
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
Implementieren Sie eine Überlaufprüfung vor arithmetischen Operationen:
// Insecure
image_size = 2 * width * height;
// Secure
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
Wenden Sie Eingabevalidierung und sinnvolle Grenzen für Dimensionswerte an, bevor Sie Berechnungen durchführen.
Diese Schwachstelle wurde mittels Variantenanalyse identifiziert. Nach der Offenlegung eines ähnlichen Integer-Überlaufs im BMP-Decoder von ImageMagick wurde eine systematische Überprüfung der Parser für Legacy-Formate durchgeführt. Pattern-Matching nach ungeprüften width * height-Berechnungen führte zur Identifizierung des gleichen Fehlers im TIM-Parser.
Decoder für Legacy-Bildformate (TIM, SGI, VIFF usw.) stellen aufgrund seltener Sicherheitsaudits und der Abhängigkeit von unsicherer C-Arithmetik Ziele mit hohem Wert dar.
Diese Schwachstelle wurde den ImageMagick-Maintainern privat über GitHub Security Advisories gemeldet. Die öffentliche Offenlegung erfolgte erst nach Verfügbarkeit des Patches und Zuweisung der CVE. Diese Forschung wurde ethisch unter den Prinzipien verantwortungsvoller Offenlegung durchgeführt.
SUMIT SHAH
Forscher: SUMIT SHAH