
CVE-2026-5201: gdk-pixbuf JPEG 로더의 힙 기반 버퍼 오버플로우(CWE-122, CVSS 7.5)
gdk-pixbuf JPEG 로더의 힙 기반 버퍼 오버플로
안녕하세요, Kağan Çapar입니다. 저는 gdk-pixbuf의 JPEG 이미지 로더에서 사실상 모든 Linux 데스크톱 환경에 영향을 미치는 힙 기반 버퍼 오버플로 취약점을 발견했습니다. 이 취약점은 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 |
저는 gdk-pixbuf의 JPEG 이미지 로더(io-jpeg.c)에서 힙 기반 버퍼 오버플로를 발견했습니다. 직접 파일 로딩 경로(gdk_pixbuf__jpeg_image_load)는 픽셀 버퍼를 할당하기 전에 색상 컴포넌트 수를 검증하지 않습니다. SOF 헤더에 9개의 컴포넌트가 선언되어 있지만 SOS에서 3개만 스캔되도록 특수 제작된 122바이트 JPEG는 gdk-pixbuf가 3개 채널용 버퍼를 할당하게 만들고, libjpeg는 픽셀당 9개 채널을 쓰게 되어 — 최대 약 49KB의 공격자 제어 데이터가 힙 오버플로로 이어집니다.
증분 로더 경로에는 이미 이와 동일한 검증이 있었지만, 직접 로딩 경로에는 빠져 있었습니다.
gdk_pixbuf_new_from_file()을 사용하는 모든 애플리케이션에서 100% 신뢰도로 크래시 발생g_class)가 픽셀 데이터로 덮어써짐| 제품 | 구성 요소 | 상태 |
|---|---|---|
| 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 | 영향 있음 |
gdk-pixbuf/io-jpeg.c의 gdk_pixbuf__jpeg_image_load() 함수에서:
1. 부족한 크기의 할당 (line 633):
pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
cinfo->out_color_components == 4 ? TRUE : FALSE,
8, cinfo->output_width, cinfo->output_height);
2. 초과 크기의 쓰기 (line 696):
jpeg_read_scanlines(cinfo, lines, cinfo->rec_outbuf_height);
// writes output_components (9) bytes per pixel into a 3-byte buffer
3. 누락된 검증 — 증분 로더는 이미 line 1142에서 output_components를 확인하지만, 직접 경로에는 이 검사가 없었습니다.
python3 reproducer/craft_cve_2026_5201.py
SOF10 헤더에 9개의 컴포넌트가 있고 SOS에서 3개만 스캔되는 122바이트 JPEG 파일을 생성합니다.
# 컴파일
gcc -o crash_test reproducer/crash_test.c \
$(pkg-config --cflags --libs gdk-pixbuf-2.0) -fsanitize=address -g
# 실행
./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에 적용되었습니다.
| 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 — gdk-pixbuf에서 동일한 null_convert 버퍼 불일치 버그 클래스로, 원격 코드 실행으로 분류되었습니다.
Kağan Çapar — GitHub · LinkedIn · X
CVE-2026-5201 권고에서 Red Hat이 공식 인정했습니다.