
CVE-2026-5201: تجاوز سعة المخزن المؤقت على الكومة في محمّل JPEG الخاص بـ gdk-pixbuf (CWE-122, CVSS 7.5)
تجاوز سعة المخزن المؤقت في الكومة في محمّل صور JPEG الخاص بـ gdk-pixbuf
مرحبًا، أنا Kağan Çapar. اكتشفت ثغرة تجاوز سعة المخزن المؤقت في الكومة في محمّل صور JPEG الخاص بـ gdk-pixbuf، وهي ثغرة تؤثر على جميع بيئات سطح المكتب في لينكس تقريبًا. تم تخصيص CVE-2026-5201 لهذه الثغرة، واعترفت بها Red Hat بدرجة CVSS مقدارها 7.5 (مهمة).
يحتوي هذا المستودع على تحليلي الكامل، وأداة إعادة إنتاج كتبتها من الصفر، وأدلة الانهيار من نظام Ubuntu 24.04 LTS مباشر.
| CVE | CVE-2026-5201 |
| CWE | CWE-122 — تجاوز سعة المخزن المؤقت في الكومة |
| CVSS v3 | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| المتأثر | gdk-pixbuf (جميع الإصدارات قبل الإصلاح) |
| المطوّر | GNOME |
| الإصلاح | gdk-pixbuf@6cce931 |
| المتتبع | GNOME #304 |
| Bugzilla | Red Hat #2453291 |
اكتشفت ثغرة تجاوز سعة المخزن المؤقت في الكومة في محمّل صور JPEG الخاص بـ gdk-pixbuf (io-jpeg.c). مسار تحميل الملف المباشر (gdk_pixbuf__jpeg_image_load) لا يتحقق من عدد مكونات الألوان قبل تخصيص مخزن البكسلات. ملف JPEG مصنوع بعناية بحجم 122 بايت يعلن عن 9 مكونات في ترويسة SOF بينما يتم مسح 3 مكونات فقط في SOS، مما يتسبب في تخصيص gdk-pixbuf لمخزن يتسع لـ 3 قنوات بينما يكتب libjpeg 9 قنوات لكل بكسل — وهو ما يؤدي إلى تجاوز سعة في الكومة يصل إلى ~49 كيلوبايت من البيانات التي يتحكم بها المهاجم.
كان مسار المحمّل التزايدي يحتوي بالفعل على هذا التحقق بعينه، لكنه كان مفقودًا من مسار التحميل المباشر.
gdk_pixbuf_new_from_file()g_class) ببيانات البكسلفي gdk-pixbuf/io-jpeg.c، الدالة gdk_pixbuf__jpeg_image_load():
1. تخصيص أصغر من الحجم المطلوب (السطر 633):
pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
cinfo->out_color_components == 4 ? TRUE : FALSE,
8, cinfo->output_width, cinfo->output_height);
2. كتابة أكبر من الحجم المخصص (السطر 696):
jpeg_read_scanlines(cinfo, lines, cinfo->rec_outbuf_height);
// writes output_components (9) bytes per pixel into a 3-byte buffer
3. تحقق مفقود — المحمّل التزايدي يتحقق بالفعل من output_components عند السطر 1142، لكن هذا التحقق كان غائبًا عن المسار المباشر.
python3 reproducer/craft_cve_2026_5201.py
ينشئ هذا ملف JPEG بحجم 122 بايت يحتوي على 9 مكونات في ترويسة SOF10 و3 مكونات فقط ممسوحة في 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
يضيف الإصلاح نفس التحقق من output_components الموجود بالفعل في المحمّل التزايدي:
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;
}
تم تطبيقه في gdk-pixbuf@6cce931.
| نظام التشغيل | 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 — نفس فئة خلل عدم تطابق المخزن المؤقت null_convert في gdk-pixbuf، وقد صُنِّفت على أنها تنفيذ عن بُعد للتعليمات البرمجية.
Kağan Çapar — GitHub · LinkedIn · X
تم الاعتراف بالثغرة من قِبل Red Hat في نشرة CVE-2026-5201.
| المنتج | المكوّن | الحالة |
|---|
| Red Hat Enterprise Linux 10 | gdk-pixbuf2 | متأثر |
| Red Hat Enterprise Linux 10 | loupe | متأثر |
| Red Hat Enterprise Linux 10 | snapshot | متأثر |
| Red Hat Enterprise Linux 9 | gdk-pixbuf2 | متأثر |
| Red Hat Enterprise Linux 8 | gdk-pixbuf2 | متأثر |
| Red Hat Enterprise Linux 7 | gdk-pixbuf2 | متأثر |