
CVE-2026-5201: Heap-based buffer overflow in gdk-pixbuf JPEG loader (CWE-122, CVSS 7.5)
Débordement de tampon basé sur le tas dans le chargeur JPEG de gdk-pixbuf
Bonjour, je suis Kağan Çapar. J'ai découvert une vulnérabilité de débordement de tampon basé sur le tas dans le chargeur d'images JPEG de gdk-pixbuf qui affecte pratiquement tous les environnements de bureau Linux. La vulnérabilité a été attribuée CVE-2026-5201 et reconnue par Red Hat avec un score CVSS de 7.5 (Important).
Ce dépôt contient mon analyse complète, un reproducteur que j'ai écrit de zéro, et les preuves de crash provenant d'un système Ubuntu 24.04 LTS en fonctionnement.
| CVE | CVE-2026-5201 |
| CWE | CWE-122 — Débordement de tampon basé sur le tas |
| CVSS v3 | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| Affecté | gdk-pixbuf (toutes les versions avant le correctif) |
| Fournisseur | GNOME |
| Correctif | gdk-pixbuf@6cce931 |
| Suivi | GNOME #304 |
| Bugzilla | Red Hat #2453291 |
J'ai trouvé un débordement de tampon basé sur le tas dans le chargeur d'images JPEG de gdk-pixbuf (io-jpeg.c). Le chemin de chargement direct de fichier (gdk_pixbuf__jpeg_image_load) ne valide pas le nombre de composantes de couleur avant d'allouer un tampon de pixels. Un fichier JPEG spécialement conçu de 122 octets avec 9 composantes déclarées dans l'en-tête SOF mais seulement 3 analysées dans SOS amène gdk-pixbuf à allouer un tampon pour 3 canaux tandis que libjpeg écrit 9 canaux par pixel — résultant en un débordement de tas allant jusqu'à ~49 Ko de données contrôlées par l'attaquant.
Le chemin de chargeur incrémental avait déjà cette validation exacte, mais elle manquait dans le chemin de chargement direct.
gdk_pixbuf_new_from_file()g_class) écrasé avec des données de pixelsDans gdk-pixbuf/io-jpeg.c, la fonction gdk_pixbuf__jpeg_image_load() :
1. Allocation insuffisante (ligne 633) :
pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
cinfo->out_color_components == 4 ? TRUE : FALSE,
8, cinfo->output_width, cinfo->output_height);
2. Écriture excessive (ligne 696) :
jpeg_read_scanlines(cinfo, lines, cinfo->rec_outbuf_height);
// writes output_components (9) bytes per pixel into a 3-byte buffer
3. Validation manquante — le chargeur incrémental vérifie déjà output_components à la ligne 1142, mais cette vérification était absente du chemin direct.
python3 reproducer/craft_cve_2026_5201.py
Ceci crée un fichier JPEG de 122 octets avec 9 composantes dans l'en-tête SOF10 et seulement 3 analysées dans SOS.
# Compiler
gcc -o crash_test reproducer/crash_test.c \
$(pkg-config --cflags --libs gdk-pixbuf-2.0) -fsanitize=address -g
# Exécuter
./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
Le correctif ajoute la même validation output_components qui existait déjà dans le chargeur incrémental :
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;
}
Appliqué dans gdk-pixbuf@6cce931.
| Système d’exploitation | 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 — même classe de bogue de décalage de tampon null_convert dans gdk-pixbuf, classé comme exécution de code à distance.
Kağan Çapar — GitHub · LinkedIn · X
Reconnu par Red Hat dans l'avis CVE-2026-5201.
| Produit | Composant | Statut |
|---|
| Red Hat Enterprise Linux 10 | gdk-pixbuf2 | Affecté |
| Red Hat Enterprise Linux 10 | loupe | Affecté |
| Red Hat Enterprise Linux 10 | snapshot | Affecté |
| Red Hat Enterprise Linux 9 | gdk-pixbuf2 | Affecté |
| Red Hat Enterprise Linux 8 | gdk-pixbuf2 | Affecté |
| Red Hat Enterprise Linux 7 | gdk-pixbuf2 | Affecté |