
CVE-2026-5201: Desbordamiento de búfer basado en montón en el cargador JPEG de gdk-pixbuf (CWE-122, CVSS 7.5)
Desbordamiento de búfer basado en montón en el cargador JPEG de gdk-pixbuf
Hola, soy Kağan Çapar. He descubierto una vulnerabilidad de desbordamiento de búfer basado en montón en el cargador de imágenes JPEG de gdk-pixbuf que afecta prácticamente a todos los entornos de escritorio de Linux. A la vulnerabilidad se le asignó el identificador CVE-2026-5201 y fue reconocida por Red Hat con una puntuación CVSS de 7.5 (Importante).
Este repositorio contiene mi análisis completo, un reproducer que escribí desde cero y la evidencia del fallo en un sistema Ubuntu 24.04 LTS en vivo.
| CVE | CVE-2026-5201 |
| CWE | CWE-122 — Desbordamiento de búfer basado en montón |
| CVSS v3 | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| Afectado | gdk-pixbuf (todas las versiones anteriores a la corrección) |
| Proveedor | GNOME |
| Corrección | gdk-pixbuf@6cce931 |
| Seguimiento | GNOME #304 |
| Bugzilla | Red Hat #2453291 |
Encontré un desbordamiento de búfer basado en montón en el cargador de imágenes JPEG de gdk-pixbuf (io-jpeg.c). La ruta de carga directa de archivos (gdk_pixbuf__jpeg_image_load) no valida el número de componentes de color antes de asignar el búfer de píxeles. Un JPEG de 122 bytes especialmente manipulado, con 9 componentes declarados en la cabecera SOF pero solo 3 escaneados en SOS, provoca que gdk-pixbuf asigne un búfer para 3 canales mientras libjpeg escribe 9 canales por píxel, lo que resulta en un desbordamiento de montón de hasta ~49 KB de datos controlados por el atacante.
La ruta del cargador incremental ya contaba con esta validación exacta, pero faltaba en la ruta de carga directa.
gdk_pixbuf_new_from_file()g_class) se sobrescribe con datos de píxelesEn gdk-pixbuf/io-jpeg.c, la función gdk_pixbuf__jpeg_image_load():
1. Asignación de tamaño insuficiente (línea 633):
pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
cinfo->out_color_components == 4 ? TRUE : FALSE,
8, cinfo->output_width, cinfo->output_height);
2. Escritura de tamaño excesivo (línea 696):
jpeg_read_scanlines(cinfo, lines, cinfo->rec_outbuf_height);
// writes output_components (9) bytes per pixel into a 3-byte buffer
3. Validación ausente — el cargador incremental ya comprueba output_components en la línea 1142, pero esta comprobación no estaba presente en la ruta directa.
python3 reproducer/craft_cve_2026_5201.py
Esto crea un archivo JPEG de 122 bytes con 9 componentes en la cabecera SOF10 y solo 3 escaneados en 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 corrección añade la misma validación de output_components que ya existía en el cargador incremental:
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;
}
Aplicada en gdk-pixbuf@6cce931.
| Sistema operativo | 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 — misma clase de bug de desajuste de búfer null_convert en gdk-pixbuf, clasificada como Ejecución Remota de Código.
Kağan Çapar — GitHub · LinkedIn · X
Reconocido por Red Hat en el aviso CVE-2026-5201.
| Producto | Componente | Estado |
|---|
| Red Hat Enterprise Linux 10 | gdk-pixbuf2 | Afectado |
| Red Hat Enterprise Linux 10 | loupe | Afectado |
| Red Hat Enterprise Linux 10 | snapshot | Afectado |
| Red Hat Enterprise Linux 9 | gdk-pixbuf2 | Afectado |
| Red Hat Enterprise Linux 8 | gdk-pixbuf2 | Afectado |
| Red Hat Enterprise Linux 7 | gdk-pixbuf2 | Afectado |