
CVE-2026-5201: Overflow del buffer basato su heap nel caricatore JPEG di gdk-pixbuf (CWE-122, CVSS 7.5)
Overflow del buffer basato su heap nel caricatore JPEG di gdk-pixbuf
Ciao, sono Kağan Çapar. Ho scoperto una vulnerabilità di overflow del buffer basato su heap nel caricatore di immagini JPEG di gdk-pixbuf che colpisce praticamente tutti gli ambienti desktop Linux. Alla vulnerabilità è stato assegnato l'identificativo CVE-2026-5201 ed è stata riconosciuta da Red Hat con un punteggio CVSS di 7.5 (Importante).
Questo repository contiene la mia analisi completa, un reproducer che ho scritto da zero e le prove del crash su un sistema Ubuntu 24.04 LTS reale.
| CVE | CVE-2026-5201 |
| CWE | CWE-122 — Buffer overflow basato su heap |
| CVSS v3 | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| Versioni interessate | gdk-pixbuf (tutte le versioni precedenti alla correzione) |
| Fornitore | GNOME |
| Correzione | gdk-pixbuf@6cce931 |
| Tracker | GNOME #304 |
| Bugzilla | Red Hat #2453291 |
Ho trovato un overflow del buffer basato su heap nel caricatore di immagini JPEG di gdk-pixbuf (io-jpeg.c). Il percorso di caricamento diretto dei file (gdk_pixbuf__jpeg_image_load) non valida il numero di componenti di colore prima di allocare un buffer per i pixel. Un JPEG appositamente creato di 122 byte, con 9 componenti dichiarate nell'header SOF ma solo 3 scansionate in SOS, induce gdk-pixbuf ad allocare un buffer per 3 canali mentre libjpeg scrive 9 canali per pixel — causando un overflow dell'heap fino a ~49 KB di dati controllati dall'attaccante.
Il percorso del loader incrementale aveva già esattamente questa validazione, ma mancava nel percorso di caricamento diretto.
gdk_pixbuf_new_from_file()g_class) viene sovrascritto con dati dei pixelIn gdk-pixbuf/io-jpeg.c, la funzione gdk_pixbuf__jpeg_image_load():
1. Allocazione insufficiente (riga 633):
pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
cinfo->out_color_components == 4 ? TRUE : FALSE,
8, cinfo->output_width, cinfo->output_height);
2. Scrittura eccessiva (riga 696):
jpeg_read_scanlines(cinfo, lines, cinfo->rec_outbuf_height);
// writes output_components (9) bytes per pixel into a 3-byte buffer
3. Validazione mancante — il loader incrementale controlla già output_components alla riga 1142, ma questo controllo era assente nel percorso diretto.
python3 reproducer/craft_cve_2026_5201.py
Questo crea un file JPEG di 122 byte con 9 componenti nell'header SOF10 e solo 3 scansionate in SOS.
# 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
La correzione aggiunge la stessa validazione di output_components che esiste già nel loader incrementale:
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;
}
Applicata in gdk-pixbuf@6cce931.
| OS | 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 — stessa classe di bug di mancata corrispondenza del buffer in null_convert in gdk-pixbuf, classificata come Remote Code Execution.
Kağan Çapar — GitHub · LinkedIn · X
Riconosciuto da Red Hat nell'advisory CVE-2026-5201.
| Prodotto | Componente | Stato |
|---|
| Red Hat Enterprise Linux 10 | gdk-pixbuf2 | Interessato |
| Red Hat Enterprise Linux 10 | loupe | Interessato |
| Red Hat Enterprise Linux 10 | snapshot | Interessato |
| Red Hat Enterprise Linux 9 | gdk-pixbuf2 | Interessato |
| Red Hat Enterprise Linux 8 | gdk-pixbuf2 | Interessato |
| Red Hat Enterprise Linux 7 | gdk-pixbuf2 | Interessato |