
CVE-2025-66628에 대한 기술 분석: ImageMagick의 TIM 파서에서 정수 오버플로로 인한 경계를 벗어난 읽기. 근본 원인, 익스플로잇 단계 및 수정 지침 포함.
| 속성 | 세부 정보 |
|---|
| CVE ID | CVE-2025-66628 |
| 벤더 | ImageMagick Studio LLC |
| 제품 | ImageMagick |
| 영향받는 버전 | < 7.1.2-10 |
| 수정된 버전 | 7.1.2-10 |
| 취약점 유형 | CWE-190 (정수 오버플로) |
| CVSS v3.1 점수 | 7.5 (High) |
| CVSS 벡터 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 연구자 | Sumit Shah |
ImageMagick의 coders/tim.c에 있는 ReadTIMImage 함수에 정수 오버플로 취약점이 존재합니다. 32비트 시스템에서 TIM(PlayStation) 이미지 파일을 처리할 때 사용자 제어 너비와 높이 값을 검증하지 않고 곱셈을 수행하여 메모리가 부족하게 할당되고, 픽셀 처리 중 경계를 벗어난 읽기가 발생합니다.
취약한 로직은 coders/tim.c에 있습니다:
/* coders/tim.c - TIM 이미지 파서 */
// TIM 파일 헤더의 사용자 제어 입력
width = ReadBlobLSBShort(image); // 2바이트 (0-65535)
height = ReadBlobLSBShort(image); // 2바이트 (0-65535)
// 취약: 32비트 시스템에서 정수 오버플로
image_size = 2 * width * height; // 오버플로 검사 없음
// 잘린 크기로 메모리 할당
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// 전체 크기로 반복 처리, 버퍼 너머 읽기
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
pixel_index = (y * width + x) * 2;
pixels[pixel_index] = ReadBlobByte(image);
pixels[pixel_index + 1] = ReadBlobByte(image);
}
}
32비트 아키텍처에서 size_t는 32비트로 제한되며 최대값은 UINT_MAX = 4,294,967,295입니다.
너비와 높이가 모두 최대 16비트 부호 없는 값으로 설정된 경우:
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
예상 계산:
2 × 65535 × 65535 = 8,589,869,050 바이트 (~8.5 GB)
실제 결과 (32비트 권돌림):
8,589,869,050 % 4,294,967,296 = 4,294,901,754
잘린 후 결과: 작은 할당 버퍼
오버플로로 인해 메모리 할당자는 필요한 것보다 훨씬 작은 버퍼를 예약하지만, 처리 루프는 여전히 전체 65535 × 65535 픽셀 그리드를 반복하여 경계를 벗어난 읽기가 발생합니다.
1단계: 공격자가 오버플로를 유발하는 치수의 TIM 파일을 제작
[매직: 0x10]
[타입: 0x02]
[너비: 0xFFFF] # 65535
[높이: 0xFFFF] # 65535
[픽셀 데이터...]
2단계: 피해자가 악성 파일을 처리
convert malicious.tim output.png
3단계: 경계를 벗어난 읽기 발생, 다음을 초래:
size_t가 32비트인 32비트 시스템. 64비트 시스템은 계산된 크기를 오버플로 없이 표현할 수 있는 충분한 정수 폭을 가지므로 영향을 받지 않습니다.
정보 노출 (주요): 경계를 벗어난 접근 중 ImageMagick 프로세스의 힙 메모리를 읽을 수 있습니다. 이 메모리에는 다음이 포함될 수 있습니다:
누출된 데이터는 변환된 출력 이미지에 포함되거나 부채널 분석을 통해 추출될 수 있습니다.
서비스 거부 (부차적):
매핑되지 않은 메모리 영역을 읽으면 SIGSEGV가 트리거되어 ImageMagick 프로세스가 종료되고 자동화된 이미지 처리 파이프라인에서 서비스가 중단됩니다.
기술 세부 사항은 검증 목적으로 제공됩니다. 실행 가능한 익스플로잇 코드는 배포되지 않습니다.
convert, magick 또는 ImageMagick API 호출을 통한 처리$ convert malicious.tim output.png
세그멘테이션 오류 (코어 덤프)
또는 누출된 힙 데이터가 출력에 포함된 상태로 성공적인 변환
$ convert malicious.tim output.png
convert: 메모리 할당 실패 `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
ImageMagick을 버전 7.1.2-10 이상으로 업데이트:
# 현재 버전 확인
convert --version
# 패키지 관리자를 사용하여 업데이트
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
산술 연산 전에 오버플로 검사 구현:
// 안전하지 않음
image_size = 2 * width * height;
// 안전함
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
계산을 수행하기 전에 차원 값에 대한 입력 검증 및 합리적인 한계를 적용합니다.
이 취약점은 변종 분석을 사용하여 식별되었습니다. ImageMagick의 BMP 디코더에서 유사한 정수 오버플로가 공개된 후, 레거시 형식 파서에 대한 체계적인 검토가 수행되었습니다. 검증되지 않은 width * height 계산에 대한 패턴 매칭을 통해 TIM 파서에서 동일한 결함이 식별되었습니다.
TIM, SGI, VIFF 등의 레거시 이미지 형식 디코더는 보안 감사가 드물고 안전하지 않은 C 산술에 의존하기 때문에 높은 가치의 대상입니다.
이 취약점은 GitHub Security Advisories를 통해 ImageMagick 유지관리자에게 비공개로 보고되었습니다. 패치가 제공되고 CVE가 할당된 후에만 공개 공개가 이루어졌습니다. 이 연구는 책임 있는 공개 원칙에 따라 윤리적으로 수행되었습니다.
SUMIT SHAH
연구자: SUMIT SHAH