콘텐츠로 이동

엔진 위협 모델

이 페이지는 NextPDF 코어 엔진의 위협 모델을 설명합니다. 엔진이 공격자의 영향을 받을 수 있는 입력(HTML, CSS, SVG, 글꼴, 이미지, 기존 PDF)을 처리할 때 범위에 포함하는 공격 유형을 열거합니다. 또한 각 외부 리소스 기능의 기본 태세를 명시하고, 각 유형을 완화하는 코드 내 가드를 가리킵니다.

경계. 위협 모델은 고려된 위협과 그에 적용된 완화책을 문서화합니다. 취약점이 없음을 주장하지 않습니다. 여기에 나열되지 않은 유형이라고 해서 해당 유형의 부재가 입증되는 것은 아니며 — 모델의 현재 범위를 벗어났을 수 있습니다. 구현되지 않은 기능은 출시 전에 공식 위협 검토를 거치도록 차단됩니다. 이 페이지를 보안성 증명이 아니라 의도적인 설계 기록으로 취급하십시오.

Terminal window
composer require nextpdf/core:^3

여기에 설명된 가드는 코어 패키지에 포함되어 있으며, 별도 의존성으로 활성화하지 않습니다. 기본적으로 켜져 있습니다.

이 모델은 OWASP 위협 모델링 프로세스(owasp_threat_modeling#x1.x11.p6)가 권장하는 구조를 따릅니다. 즉, 신뢰할 수 없는 입력이 신뢰 경계를 넘는 지점을 기준으로 시스템을 분해하고, 각 경계의 위협을 열거하며, 완화책을 기록합니다.

엔진의 주요 신뢰 경계는 문서 수집입니다. 즉, 다른 곳에서 작성된 콘텐츠 — 원격 스타일시트, @font-face 소스, <image href>, 임베디드 XML 인보이스, 검사할 PDF —가 엔진에 무언가를 가져오거나, 파싱하거나, 압축 해제하도록 지시할 수 있는 모든 지점입니다. 기본 원칙은 기본 거부입니다. 즉, 호출자가 정책 객체를 통해 명시적으로 활성화하기 전까지 모든 외부 리소스 기능은 꺼져 있습니다. 이는 렌더링 엔진에 적용된 NIST SP 800-53 Rev. 5 CM-7(nist_sp_800_53r5#x4.x182.p14)의 최소 기능 기준선입니다. 가장 엄격한 설정이 생성자 기본값입니다. 기능 활성화는 호출자의 명시적 결정입니다.

위협 모델 자체는 API가 아닙니다. 이를 표현하는 정책 객체는 모듈 페이지에 문서화되어 있습니다. 신뢰와 관련된 진입점은 외부 리소스 정책 계약(ExternalResourcePolicyInterface, 모두 거부하는 기본값으로 DefaultExternalResourcePolicy 사용)과 URL 및 XML 가드(UrlValidator, XmlGuard)입니다. 이 페이지는 해당 동작을 참조할 뿐, 시그니처를 다시 문서화하지는 않습니다.

안전한 태세가 기본값입니다. 이 태세를 얻기 위해 별도 코드는 필요하지 않습니다:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Html\DefaultExternalResourcePolicy;
// Out of the box: @font-face blocked, @import blocked, background-image
// blocked, SVG external refs blocked. A document that tries to fetch a
// remote resource gets a system-font fallback or an ignored rule — not an
// outbound request.
$policy = new DefaultExternalResourcePolicy();

기능을 열 때는 의도적이고 좁은 범위로만 엽니다. HTTPS를 통해 CDN에서 호스팅되는 웹폰트를 허용해야 하는 프로덕션 호출자는 명시적으로 옵트인하고 범위를 지정합니다:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Html\DefaultExternalResourcePolicy;
// Explicit, scoped opt-in. The HTTPS scheme is required; size and glyph
// caps still apply; the URL still passes the SSRF guard before any fetch.
$policy = (new DefaultExternalResourcePolicy())
->withFontFaceAllowed(['https']);
  • 미구현은 우연에 의한 안전과 같지 않습니다. CSS background-image url()와 같은 기능은 구현되어 있지 않습니다. 따라서 현재는 공격 표면이 전혀 없습니다. 그러나 향후 구현 전에 공식 위협 게이트를 거쳐야 한다고 문서화되어 있습니다. 코드가 없다는 사실은 영구적인 보장이 아니라 현재의 완화책입니다.
  • DNS 리바인딩은 움직이는 표적입니다. UrlValidator는 호스트 이름을 확인하고 확인된 IP를 반환하여 호출자가 연결을 고정(CURLOPT_RESOLVE)할 수 있도록 함으로써, 검증과 가져오기 사이의 TOCTOU 창을 닫습니다. 이는 절대적인 방어가 아니라 최선의 노력에 기반한 방어입니다. 허용 범위가 넓은 이그레스 프록시 뒤에 있는 운영자는 라이브러리가 볼 수 없는 내부 호스트에 여전히 도달할 수 있습니다.
  • 권한 비트는 접근 제어가 아닙니다. “복사를 차단”하는 문서는 강제 적용이 아니라 리더의 협조에 의존합니다. 이 내용은 보안 모델에서 다룹니다. 흔한 위협 모델 오해이기 때문에 여기서도 짚어 둡니다.

가드는 빠르게 실패하고 작업량을 제한하도록 설계되었습니다. XML 가드는 파싱 전에 DOCTYPE를 거부하고 입력 크기를 제한하며, 이미지 경로는 압축 해제 전에 메가픽셀 및 바이트 상한을 적용하고, URL 가드는 소켓이 열리기 전에 scheme/host 단계에서 거부합니다. 안전한 기본값의 대가는 느린 요청이 아니라 거부된 요청입니다.

고려된 공격 유형과 그 코드 내 완화책:

위협 유형(CWE / OWASP)PDF 엔진에서의 벡터코드 내 가드
SSRF(서버 측 요청 위조; OWASP Top 10 2025; owasp_top10_2025#x3.x1.p26)@font-face/@import/url()169.254.169.254 또는 내부 호스트를 가리킴; TSA/OCSP/CRL 페처UrlValidator::validateExternalUrl()은 private/reserved/loopback/link-local 범위와 클라우드 메타데이터 엔드포인트를 차단하고, 위험한 스킴을 거부하며, DNS를 확인하고 연결 고정을 위해 IP를 반환합니다
XXE(cwe_top25_2025#x28.x2.p42)임베디드 XML 인보이스 또는 XMP 패킷의 외부 엔티티 / DOCTYPEXmlGuard::loadXml()LIBXML_NONET을 적용하고 모든 DOCTYPE 선언을 즉시 거부하며, XML 1.0 금지 제어 문자와 입력 크기 상한도 추가로 적용합니다
압축 해제 폭탄100 MP 페이로드를 숨기는 1×1 이미지; 지나치게 큰 WOFF2이미지 경로는 압축 해제 전에 메가픽셀 상한과 바이트 상한을 적용하고, 글꼴 경로는 파일 크기와 글리프 수를 제한합니다
경로 탐색file:///etc/passwd — 글꼴 또는 SVG src외부 리소스는 기본적으로 모두 거부됩니다. 로컬 파일 경로는 명시적으로 활성화된 경우에도 realpath()으로 확인한 뒤 디렉터리 허용 목록과 대조합니다
콘텐츠 주입PDF 연산자 문맥을 벗어나려는 조작된 문자열; data:/javascript: href출력 시 PDF 문자열 이스케이프; 주석에 대한 스킴 허용 목록 + href 정화

기본값은 모든 외부 리소스를 거부하는 태세로 요약됩니다. 즉, 글꼴, @import, background-image, SVG 외부 참조는 호출자가 스킴별로 옵트인할 때까지 꺼져 있으며, 이 동작은 코드와 함께 유지되는 보안 속성 커버리지 매트릭스에 따릅니다.

이 페이지는 고려된 위협을 문서화합니다. 침투 테스트 보고서가 아니며, 나열된 완화책이 완전하다거나 다른 약점 유형이 적용되지 않는다고 주장하지 않습니다.

이 문서는 적합성 프로파일이 아닙니다. 이 위협 모델은 OWASP 위협 모델링 프로세스와 CWE Top 25 약점 분류 체계(cwe_top25_2025#x28.x2.p42)를 참고하지만, 어떠한 보안 인증 체계에 대한 적합성도 주장하지 않습니다. 독립적 평가는 이 문서가 아니라 감사에서 다룰 주제입니다.