xmin. guest@xmin ~ $
~/ $
ZDI-25-1055 / ZDI-CAN-27835 등록 기록
[취약점 제보] 2026년 6월 14일

ZDI-25-1055 / ZDI-CAN-27835 등록 기록

Windows 10의 mfmp4srcsnk.dll에서 MP4/MOV 메타데이터 처리 중 발생한 NULL pointer dereference DoS를 WinDbg와 IDA로 추적한 기록입니다.

windowszdimfmp4srcsnkmedia-foundationwindbgidanull-derefvulnerability-analysis

개요

이 글은 Windows 10 환경에서 확인한 mfmp4srcsnk.dll 크래시를 분석하고, 최종적으로 ZDI에 제보했던 ZDI-25-1055 / ZDI-CAN-27835 건을 정리한 기록이다.

ZDI 공개 어드바이저리 기준으로 이 취약점은 Microsoft Windows의 MP4 파일 파싱 과정에서 발생하는 NULL pointer dereference 기반 Denial-of-Service 취약점이다. 공격자가 만든 파일을 사용자가 열거나, 관련 파일을 포함한 페이지를 방문해야 트리거되는 형태로 분류되어 있다.

공개 번호: ZDI-25-1055

케이스 번호: ZDI-CAN-27835

영향 제품: Microsoft Windows

취약점 유형: MP4 file parsing NULL pointer dereference

영향: Denial-of-Service

CVSS: 4.3 AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L

참고: ZDI Advisory

시작점

처음에는 일반적인 디버깅 방식으로 크래시 지점을 잡기 어려웠다. 파일을 선택하거나 썸네일/메타데이터를 읽는 흐름에서 문제가 발생했고, 프로세스가 직접 실행 파일처럼 단순하게 떨어지지 않았다.

그래서 Windows의 postmortem debugger를 활용해서 크래시 시점의 상태를 잡았다. 결과적으로 크래시는 mfmp4srcsnk.dll 내부의 CQTMovie::FinalParseAtom 에서 발생했다.

(44c0.7088): Access violation - code c0000005 (!!! second chance !!!) mfmp4srcsnk!CQTMovie::FinalParseAtom+0x1c2: 00007ffeb48a4ec2 488b08 mov rcx,qword ptr [rax] ds:0000000000000000=????????????????

여기서 중요한 부분은 mov rcx, qword ptr [rax] 이고, 당시 rax 가 0x0 이었다는 점이다. 즉, NULL 주소에서 8바이트 값을 읽으려다 access violation이 발생했다.

콜스택

크래시 당시 콜스택을 보면 단순히 미디어 파일을 직접 실행한 것이 아니라, Windows Shell의 속성/썸네일 처리 흐름을 따라 들어간 것을 볼 수 있다.

mfmp4srcsnk!CQTMovie::FinalParseAtom+0x1c2 mfmp4srcsnk!CQTMovie::CreateQTMovie+0x141 mfmp4srcsnk!CQTMovie::CreateMovieFromBuffer+0x1e0 mfmp4srcsnk!MFCreateQTMovie+0x5d mfmp4srcsnk!CMFMP4PropertyHandler::LoadMetadataProvider+0x190 mfmp4srcsnk!CMFMP4PropertyHandler::InternalInitialize+0xff mfmp4srcsnk!CMFPropHandlerBase::Initialize+0x13d windowsstorage!InitializeFileHandlerWithStream+0x177 windowsstorage!CFileSysItemString::HandlerCreateInstance+0x2e3 shell32!CPropertyThumbnailHandler::GetThumbnailInternal+0xa7 thumbcache!CThumbnailProviderWrapper::GetThumbnail+0x70

이 흐름 때문에 사용자가 파일을 적극적으로 실행하지 않아도, 탐색기에서 파일 메타데이터나 썸네일을 읽는 과정에서 파서가 호출될 수 있다. 다만 ZDI 분류 기준으로는 사용자 상호작용이 필요한 DoS로 정리되었다.

레지스터 상태

레지스터를 확인하면 크래시 원인이 더 명확해진다.

rax=0000000000000000 rcx=000001a84d1106c0 rip=00007ffeb48a4ec2

mfmp4srcsnk!CQTMovie::FinalParseAtom+0x1c2: 00007ffeb48a4ec2 488b08 mov rcx,qword ptr [rax]

rax 가 NULL인데, 그 주소를 역참조하려고 하면서 예외가 발생한다. 이 지점만 놓고 보면 전형적인 NULL pointer dereference다. 중요한 것은 이 NULL이 어디서 만들어졌는지, 그리고 왜 검증되지 않은 채 다음 virtual call 체인으로 넘어갔는지를 찾는 것이었다.