본문으로 건너뛰기

Nitro PDF Pro app.alert() Denial of Service Vulnerability

← Back to Advisories
CVE Number CVE-2025-69624
Vendor Nitro
Credit Abu

Description

Nitro PDF Pro 14.41.1.4에서 JavaScript 메서드 `app.alert()`에 잘못된 인자를 전달할 경우, NULL 포인터 역참조로 인해 프로그램이 즉시 종료되는 서비스 거부(Denial of Service, DoS) 취약점이 존재합니다. 특히 `app.alert(app.activeDocs, true);`와 같이 호출할 경우, `app.activeDocs`가 내부적으로 NULL 값으로 처리되지만, Nitro PDF Pro는 이를 문자열로 안전하게 변환할 수 있는지 충분히 검증하지 않은 채 후속 문자열 처리 루틴으로 전달합니다. 그 결과 잘못된 포인터가 역참조되며 Access Violation이 발생하고, 사용자가 PDF 파일을 여는 즉시 애플리케이션이 비정상 종료됩니다.

Details

문제는 app.alert()가 전달받은 JavaScript 값을 문자열로 변환하는 과정에서 발생합니다.

공격자는 PDF의 OpenAction을 통해 문서가 열리자마자 아래와 같은 JavaScript가 실행되도록 구성할 수 있습니다.

app.alert(app.activeDocs, true);

이 경우 app.activeDocs는 정상적인 문자열 객체가 아니라 NULL에 해당하는 값으로 평가됩니다. 그러나 Nitro PDF Pro 내부 구현은 이 값을 적절히 검증하지 않고 JS_ValueToString()JS_GetStringChars()로 전달합니다.

취약한 흐름은 아래와 같이 단순화할 수 있습니다.

app.alert(value, true)
  JS_ValueToString()
  JS_GetStringChars()
  dereference crash

실제 취약 경로에서는 인자가 단순 문자열이 아닌 경우 JS_ValueToString()을 호출한 뒤, 그 반환값을 그대로 JS_GetStringChars()에 전달합니다.

if ( argc != 1 || (v16 = *argv, (*argv & 7) != 0) )
{
    v30 = JS_ValueToString(a1, *argv);
    StringChars = JS_GetStringChars(v30);  // crash
}

문제는 app.activeDocs가 NULL임에도 불구하고, 반환값이 실제 유효한 문자열 객체인지 충분히 확인되지 않는다는 점입니다. 이후 JS_GetStringChars()는 전달받은 포인터를 문자열 객체라고 가정하고 내부 멤버를 참조합니다.

__int64 __fastcall JS_GetStringChars(__int64 *a1)
{
    v1 = *a1;
    ...
}

이때 a1이 NULL 또는 유효하지 않은 포인터일 경우 Access Violation이 발생하며, Nitro PDF Pro는 즉시 종료됩니다.

Timeline

2025-12-10 - Vulnerability reported to Vendor

2026-02-02 - Vendor Patch Release

2026-04-06 - Public Release