문제는 /AcroForm에 /XFA []가 선언되어 있으나, 실제 XFA 콘텐츠가 전혀 없는 PDF를 처리하는 과정에서 발생합니다.
예를 들어 아래와 같은 구조가 포함된 PDF가 트리거가 될 수 있습니다.
pdf
4 0 obj
<<
/Fields [5 0 R]
/XFA []
>>
endobj
Nitro PDF Pro는 문서를 여는 과정에서 XFA 처리용 객체를 초기화한 뒤, 내부적으로 xdp:xdp, template 등의 루트 노드를 탐색합니다. 그러나 XFA 구조가 비어 있는 경우 첫 번째 탐색 결과가 0(NULL)이 되며, 이 NULL 포인터가 다음 탐색 과정에 그대로 전달됩니다.
취약한 흐름은 아래와 같이 단순화할 수 있습니다.
v14 = sub_1E8E60(a1 + 0x158, L"xdp:xdp");
v15 = sub_1E8E60(v14, L"template");
이때 노드 탐색 함수는 전달받은 객체 포인터가 NULL인지 검증하지 않은 채 내부 멤버를 참조합니다.
__int64 sub_1E8E60(__int64 a1, const wchar_t *a2)
{
if (!a2)
return 0;
a1_0x40 = *(_QWORD *)(a1 + 0x40);
...
}
결과적으로 a1 == 0인 상태에서 *(QWORD *)(a1 + 0x40)이 수행되며 Access Violation이 발생하고, Nitro PDF Pro는 문서를 여는 즉시 종료됩니다.
