IrfanView Legacy JPM.dll 분석 회고: Heap OOB Read
현재 IrfanView 기본 설정 영향 항목이 아닌, 비활성화된 legacy JPM.dll 플러그인 대상 퍼징 분석 회고입니다. JPM sub-box 파싱 중 반환 구조체 크기와 호출자 가정이 어긋나며 heap OOB read가 발생한 크래시 분석 기록입니다.
공개 범위 메모 : 이 글은 현재 IrfanView 기본 설정에서 악용 가능한 취약점 공개가 아닙니다. 개발자 답변에 따르면 JPM.dll 플러그인은 약 2년 전부터 기본 비활성화된 legacy plugin이며, 사용자가 수동으로 활성화하고 IrfanView의 보안 경고를 무시해야만 도달 가능한 코드입니다. 따라서 본문은 현재 제품 advisory가 아니라 WinAFL 기반 파일 포맷 파서 퍼징과 크래시 분석 과정을 정리한 연구 회고로 봐야 합니다.
개발자 답변과 현재 영향 범위
제보 후 IrfanView 개발자는 해당 JPM 플러그인이 현재 IrfanView에서 기본 활성화되어 있지 않으며, 이 문제를 현재 IrfanView의 보안 취약점으로 보지 않는다고 답변했습니다. 이 내용을 반영해 본 글에서는 해당 케이스를 비활성화된 legacy 플러그인 분석 기록 으로 정리합니다.
개요
이번 케이스는 JPM sub-box 파싱 과정에서 반환된 구조체의 실제 크기와 호출자가 기대한 구조체 크기가 어긋나면서 발생한 heap out-of-bounds read다.
크래시는 Page Heap 환경에서 빠르게 탐지되었고, 현재 확인된 경로에서는 DoS 성격의 크래시로 보는 편이 적절하다. 다만 OOB read가 어떤 코드 경로와 결합되는지는 별도 검증이 필요하다.
크래시 샘플: fuzzer10id00006800EXCEPTIONACCESSVIOLATION.jpm Size: 696 bytes
크래시
Exception: Access violation (0xc0000005) Address: 0x61c029c2 Module: JPM.dll Base: 0x61bc0000
Crash instruction: mov eax, dword ptr [eax+18h]
Read target: 0x086a2000
[eax + 0x18] 접근이 할당 경계 바깥으로 넘어가며 크래시가 발생했다.
호출 흐름
fuzzReadJPMW!fuzzme JPM!ReadJPMW+0x198 sub1003D4E0 sub1003E390 sub1003E3F0 / sub1003E4B0 sub10042990 sub10042B40 sub10042990: mov eax, [eax+18h]
핵심 함수는 sub10042990 , 보고서 기준 JPM!ShowPlugInSaveOptionsW+0x207e2 부근이다.
원인 분석
sub10042B40 은 &a1 을 통해 구조체 포인터를 반환한다. 이때 크래시 샘플 입력에서는 반환된 구조체가 0x18바이트만 할당된 상태로 관찰되었다.
하지만 정상 구조체는 최소 0x44바이트 이상으로 보인다. 다른 초기화 루틴인 sub10042AD0 이 offset 0x40 까지 초기화하는 경로가 있기 때문이다.
문제는 호출자인 sub10042990 이 반환된 구조체의 실제 크기나 타입을 확인하지 않고 곧바로 offset 0x18 을 읽는다는 점이다.
// 개념적 흐름 obj = resolvesubbox(...); value = (uint32t )(obj + 0x18);
조작된 JPM box 메타데이터로 인해 축소된 객체가 반환되면, 이 접근은 바로 할당 경계를 넘는다.
영향
현재 확인된 형태는 OOB read로 인한 크래시다. 그러나 Page Heap이 꺼져 있다면 인접 heap 데이터가 정상 값처럼 읽힐 수 있다.
가능한 영향은 다음과 같다.
댓글