IrfanView Legacy JPM.dll 분석 회고: Integer Overflow와 Heap Overflow
현재 IrfanView 기본 설정 영향 항목이 아닌, 비활성화된 legacy JPM.dll 플러그인 대상 퍼징 분석 회고입니다. JPM 크기 필드가 정수 오버플로우를 유도하고 축소 할당된 heap buffer에서 경계 초과 쓰기가 발생한 흐름을 정리한 기록입니다.
공개 범위 메모 : 이 글은 현재 IrfanView 기본 설정에서 악용 가능한 취약점 공개가 아닙니다. 개발자 답변에 따르면 JPM.dll 플러그인은 약 2년 전부터 기본 비활성화된 legacy plugin이며, 사용자가 수동으로 활성화하고 IrfanView의 보안 경고를 무시해야만 도달 가능한 코드입니다. 따라서 본문은 현재 제품 advisory가 아니라 WinAFL 기반 파일 포맷 파서 퍼징과 크래시 분석 과정을 정리한 연구 회고로 봐야 합니다.
개발자 답변과 현재 영향 범위
제보 후 IrfanView 개발자는 해당 JPM 플러그인이 현재 IrfanView에서 기본 활성화되어 있지 않으며, 이 문제를 현재 IrfanView의 보안 취약점으로 보지 않는다고 답변했습니다. 이 내용을 반영해 본 글에서는 해당 케이스를 비활성화된 legacy 플러그인 분석 기록 으로 정리합니다.
개요
이번 케이스는 JPM 파일의 크기 필드가 정수 오버플로우를 만들고, 그 결과 너무 작은 heap buffer가 할당된 뒤 원래 count 기준으로 쓰기가 진행되는 크래시 케이스다.
크래시 샘플은 매우 작지만, 초반부터 비정상적인 박스 크기를 사용한다. 특히 첫 4바이트가 0xfffffffc 로 시작하며, 이후 파서가 size/count 계산을 정상 범위 값처럼 처리하면서 문제가 발생한다.
크래시 샘플: fuzzer3id00172300EXCEPTIONACCESSVIOLATION.jpm Size: 284 bytes
샘플 특징
00000000: ff ff ff fc 66 74 79 70 6a 70 6d 20 e8 00 00 00 00000010: 6a 70 6d 20 00 00 00 1d 6d 68 64 72 00 00 00 01 00000020: fa 01 00 00 00 00 00 00 00 3d 00 00 00 23 04 10
JPM/JP2 계열 박스 포맷은 보통 4바이트 크기와 4바이트 타입으로 구성된다. 그런데 이 샘플은 size 필드가 매우 큰 unsigned 값으로 해석될 수 있는 패턴을 사용한다. 이 값이 이후 count 계산으로 흘러가면서 작은 할당과 큰 쓰기가 분리된다.
크래시
Exception: Access violation (0xc0000005) Address: 0x61c00489 Module: JPM.dll Base: 0x61bc0000
Crash instruction: mov dword ptr [ecx+0Ch], edx
Target: ecx + 0x0c = 0x087d0004
쓰기 대상 주소가 미매핑 페이지에 걸리면서 AV가 발생했다.
호출 흐름
ReadJPMW sub100221E0 sub100404C0 sub10040410
보고서 기준 핵심 함수는 sub10040410 이며, IDA 주소는 0x10040410 이다.
원인 분석
문제의 count 값은 sub100404C0 에서 파일 크기 필드를 이용해 계산된다.
count = (filesizefield - 8) >> 2;
PoC에서는 filesizefield = 0xfffffff4 가 되어 다음 값이 만들어진다.
(0xfffffff4 - 8) >> 2 = 0x3ffffffb
이 값은 매우 크지만, v8 >= 8 , (v8 & 3) == 0 같은 형태의 얕은 검증을 통과한다.
댓글