
CVE-2026-5201: Heap-basierter Pufferüberlauf im gdk-pixbuf JPEG-Loader (CWE-122, CVSS 7.5)
Heap-basierter Pufferüberlauf im gdk-pixbuf-JPEG-Loader
Hallo, ich bin Kağan Çapar. Ich habe eine Heap-basierte Pufferüberlauf-Schwachstelle im JPEG-Bildlader von gdk-pixbuf entdeckt, die praktisch alle Linux-Desktop-Umgebungen betrifft. Der Schwachstelle wurde CVE-2026-5201 zugewiesen und von Red Hat mit einem CVSS-Score von 7.5 (Wichtig) bestätigt.
Dieses Repository enthält meine vollständige Analyse, einen von Grund auf neu geschriebenen Reproduzierer und den Absturznachweis von einem Live-System mit Ubuntu 24.04 LTS.
| CVE | CVE-2026-5201 |
| CWE | CWE-122 — Heap-basierter Pufferüberlauf |
| CVSS v3 | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| Betroffen | gdk-pixbuf (alle Versionen vor der Behebung) |
| Hersteller | GNOME |
| Behebung | gdk-pixbuf@6cce931 |
| Tracker | GNOME #304 |
| Bugzilla | Red Hat #2453291 |
Ich habe einen Heap-basierten Pufferüberlauf im JPEG-Bildlader (io-jpeg.c) von gdk-pixbuf gefunden. Der direkte Dateiladepfad (gdk_pixbuf__jpeg_image_load) validiert die Anzahl der Farbkomponenten nicht, bevor ein Pixelpuffer zugewiesen wird. Ein speziell präpariertes 122-Byte-JPEG mit 9 im SOF-Header deklarierten Komponenten, aber nur 3 in SOS gescannten Komponenten veranlasst gdk-pixbuf, einen Puffer für 3 Kanäle zu allokieren, während libjpeg 9 Kanäle pro Pixel schreibt – was zu einem Heap-Überlauf von bis zu ~49 KB angreiferkontrollierten Daten führt.
Der inkrementelle Laderpfad enthielt diese exakte Validierung bereits, aber sie fehlte im direkten Ladepfad.
gdk_pixbuf_new_from_file() verwendetg_class) wird mit Pixeldaten überschriebenIn gdk-pixbuf/io-jpeg.c, der Funktion gdk_pixbuf__jpeg_image_load():
1. Zu kleine Speicherzuweisung (Zeile 633):
pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
cinfo->out_color_components == 4 ? TRUE : FALSE,
8, cinfo->output_width, cinfo->output_height);
2. Zu große Schreiboperation (Zeile 696):
jpeg_read_scanlines(cinfo, lines, cinfo->rec_outbuf_height);
// writes output_components (9) bytes per pixel into a 3-byte buffer
3. Fehlende Validierung — Der inkrementelle Lader prüft output_components bereits in Zeile 1142, aber diese Prüfung fehlte im direkten Pfad.
python3 reproducer/craft_cve_2026_5201.py
Dies erzeugt eine 122-Byte-JPEG-Datei mit 9 Komponenten im SOF10-Header und nur 3 in SOS gescannten Komponenten.
# Compile
gcc -o crash_test reproducer/crash_test.c \
$(pkg-config --cflags --libs gdk-pixbuf-2.0) -fsanitize=address -g
# Run
./crash_test cve_2026_5201.jpg
==PID==ERROR: AddressSanitizer: SEGV on unknown address 0x52b000020006
==PID==The signal is caused by a WRITE memory access.
#0 libjpeg.so.8 (null_convert)
#1 libjpeg.so.8 (sep_upsample)
#2 libjpeg.so.8 (process_data_context_main)
#3 libjpeg.so.8 jpeg_read_scanlines
#4 libgdk_pixbuf-2.0.so.0 (JPEG loader)
#5 libgdk_pixbuf-2.0.so.0 gdk_pixbuf_new_from_file
Program received signal SIGSEGV, Segmentation fault.
g_type_check_instance_is_fundamentally_a ()
→ g_object_unref()
→ gdk_pixbuf_new_from_file()
rax = 0x808080808080ffff ← corrupted GObject vtable pointer
Die Behebung fügt dieselbe output_components-Validierung hinzu, die bereits im inkrementellen Lader vorhanden ist:
jpeg_start_decompress(cinfo);
if (cinfo->output_components != 3 && cinfo->output_components != 4 &&
!(cinfo->output_components == 1 &&
cinfo->out_color_space == JCS_GRAYSCALE)) {
g_set_error(error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_CORRUPT_IMAGE,
"Unsupported number of color components (%d)",
cinfo->output_components);
goto out;
}
Umgesetzt in gdk-pixbuf@6cce931.
| Betriebssystem | Ubuntu 24.04.1 LTS |
| gdk-pixbuf | 2.42.10+dfsg-3ubuntu3.2 |
| libjpeg | libjpeg-turbo 2.1.5 (libjpeg.so.8.2.2) |
| GCC | 13.3.0 |
CVE-2017-2862 (Cisco Talos TALOS-2017-0366) — CVSS 8.8 — dieselbe null_convert-Puffer-Mismatch-Fehlerklasse in gdk-pixbuf, eingestuft als Remote Code Execution.
Kağan Çapar — GitHub · LinkedIn · X
Von Red Hat im CVE-2026-5201-Advisory bestätigt.
| Produkt | Komponente | Status |
|---|
| Red Hat Enterprise Linux 10 | gdk-pixbuf2 | Betroffen |
| Red Hat Enterprise Linux 10 | loupe | Betroffen |
| Red Hat Enterprise Linux 10 | snapshot | Betroffen |
| Red Hat Enterprise Linux 9 | gdk-pixbuf2 | Betroffen |
| Red Hat Enterprise Linux 8 | gdk-pixbuf2 | Betroffen |
| Red Hat Enterprise Linux 7 | gdk-pixbuf2 | Betroffen |