Bỏ qua để đến nội dung

Mô hình mối đe dọa cho engine

Trang này định nghĩa mô hình mối đe dọa cho engine lõi NextPDF. Nội dung liệt kê các lớp tấn công mà engine xem là nằm trong phạm vi khi xử lý dữ liệu đầu vào chịu ảnh hưởng của kẻ tấn công: Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), Scalable Vector Graphics (SVG), phông chữ, hình ảnh và các tệp Portable Document Format (PDF) đã có sẵn. Trang cũng nêu rõ tư thế mặc định cho từng khả năng tài nguyên bên ngoài và chỉ ra các guard trong mã giúp giảm thiểu từng lớp.

Ranh giới. Một mô hình mối đe dọa ghi lại những mối đe dọa đã được xem xét và các biện pháp giảm thiểu áp dụng cho chúng. Nó không khẳng định rằng không tồn tại lỗ hổng. Một lớp không được liệt kê ở đây không đồng nghĩa là đã được chứng minh không tồn tại; lớp đó có thể nằm ngoài phạm vi hiện tại của mô hình. Trước khi các tính năng chưa được triển khai được phát hành, chúng phải trải qua một cuộc rà soát mối đe dọa chính thức. Hãy xem trang này là bản ghi về thiết kế có chủ đích, không phải bằng chứng bảo mật.

Terminal window
composer require nextpdf/core:^3

Các guard được mô tả ở đây là một phần của gói core. Bạn không cần thêm dependency nào để bật chúng; chúng được bật theo mặc định.

Mô hình này tuân theo quy trình mô hình hóa mối đe dọa của Open Worldwide Application Security Project (OWASP) (owasp_threat_modeling#x1.x11.p6): phân rã hệ thống thành các điểm mà tại đó dữ liệu đầu vào không đáng tin cậy vượt qua một ranh giới tin cậy, liệt kê các mối đe dọa ở từng ranh giới, và ghi lại biện pháp giảm thiểu.

Ranh giới tin cậy chính của engine là tiếp nhận tài liệu: bất kỳ nơi nào nội dung được tạo ở bên ngoài — một stylesheet từ xa, một nguồn @font-face, một <image href>, một hóa đơn Extensible Markup Language (XML) nhúng, hay một PDF cần kiểm tra — đều có thể khiến engine tải về, phân tích cú pháp, hoặc giải nén dữ liệu. Nguyên tắc chi phối là từ chối theo mặc định: mọi khả năng tài nguyên bên ngoài đều tắt cho đến khi bạn bật rõ ràng thông qua một đối tượng policy. Điều này áp dụng đường cơ sở chức năng tối thiểu từ National Institute of Standards and Technology (NIST) SP 800-53 Rev. 5 CM-7 (nist_sp_800_53r5#x4.x182.p14) cho một engine kết xuất: giá trị mặc định của constructor là tư thế chặt chẽ nhất. Việc mở một khả năng là quyết định rõ ràng của bạn.

Mô hình mối đe dọa không phải là một giao diện lập trình ứng dụng (API). Các đối tượng policy thể hiện mô hình này được tài liệu hóa trên các trang module. Các điểm vào liên quan đến tin cậy là contract policy tài nguyên bên ngoài (ExternalResourcePolicyInterface, với DefaultExternalResourcePolicy là mặc định từ chối tất cả) cùng các guard cho Uniform Resource Locator (URL) và XML (UrlValidator, XmlGuard). Trang này tham chiếu đến hành vi của chúng; nó không lặp lại tài liệu về signature của chúng.

Tư thế an toàn là mặc định. Bạn không cần viết mã để có được nó:

<?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();

Việc mở một khả năng phải có chủ đích và phạm vi hẹp. Nếu bạn buộc phải cho phép một webfont được lưu trữ trên content delivery network (CDN) qua Hypertext Transfer Protocol Secure (HTTPS) trong production, hãy bật rõ ràng và giới hạn phạm vi:

<?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']);
  • Chưa triển khai không đồng nghĩa với an toàn do tình cờ. Các khả năng như CSS background-image url() chưa được triển khai, nên hiện chúng không có bề mặt tấn công nào. Chúng vẫn được tài liệu hóa là phải qua một cổng kiểm soát mối đe dọa chính thức trước bất kỳ lần triển khai nào trong tương lai. Việc chưa có mã là biện pháp giảm thiểu ở thời điểm hiện tại, không phải một bảo đảm vĩnh viễn.
  • Tấn công đổi liên kết Domain Name System (DNS) là một mục tiêu luôn thay đổi. UrlValidator phân giải tên máy chủ và trả về địa chỉ Internet Protocol (IP) đã phân giải để bên gọi có thể ghim kết nối (CURLOPT_RESOLVE), qua đó khép lại cửa sổ từ thời điểm kiểm tra đến thời điểm sử dụng (TOCTOU) giữa lúc xác thực và lúc tải về. Đây là lớp phòng thủ theo nỗ lực tốt nhất, không phải tuyệt đối. Một người vận hành đứng sau egress proxy cho phép quá rộng vẫn có thể truy cập các máy chủ nội bộ mà thư viện không thấy được.
  • Các bit quyền không phải là kiểm soát truy cập. Một tài liệu “chặn sao chép” dựa vào sự hợp tác của trình đọc, chứ không phải cưỡng chế kỹ thuật. Điều này được trình bày trong mô hình bảo mật. Nội dung được nêu rõ ở đây vì đây là một hiểu lầm phổ biến về mô hình mối đe dọa.

Các guard từ chối sớm và giới hạn khối lượng công việc: guard XML từ chối khai báo loại tài liệu (DOCTYPE) trước khi phân tích cú pháp và giới hạn kích thước đầu vào; đường xử lý hình ảnh áp đặt một mức trần megapixel và byte trước khi giải nén; guard URL từ chối theo scheme và máy chủ trước khi mở bất kỳ socket nào. Cái giá của mặc định an toàn là một yêu cầu bị từ chối, chứ không phải một yêu cầu chậm.

Các lớp tấn công đã được xem xét cùng các biện pháp giảm thiểu tương ứng trong mã, kèm tham chiếu Common Weakness Enumeration (CWE) và OWASP ở những chỗ áp dụng được:

Lớp mối đe dọa (CWE / OWASP)Hướng tấn công trong một engine PDFGuard trong mã
Giả mạo yêu cầu phía máy chủ (SSRF) (OWASP Top 10 2025; owasp_top10_2025#x3.x1.p26)@font-face/@import/url() trỏ tới 169.254.169.254 hoặc một máy chủ nội bộ; các bộ tải về của cơ quan đóng dấu thời gian (TSA), Online Certificate Status Protocol (OCSP) và danh sách thu hồi chứng chỉ (CRL)UrlValidator::validateExternalUrl() chặn các dải địa chỉ riêng tư, dành riêng, loopback và link-local cùng các endpoint cloud-metadata; từ chối các scheme nguy hiểm; phân giải DNS; và trả về IP để ghim kết nối
Thực thể bên ngoài XML (XXE) (cwe_top25_2025#x28.x2.p42)Thực thể bên ngoài hoặc DOCTYPE trong một hóa đơn XML nhúng hoặc gói Extensible Metadata Platform (XMP)XmlGuard::loadXml() bắt buộc LIBXML_NONET, từ chối thẳng mọi khai báo DOCTYPE, từ chối các ký tự điều khiển bị cấm trong XML 1.0, và áp dụng một mức trần kích thước đầu vào
Bom giải nénHình ảnh 1×1 che giấu một payload 100 MP; tệp Web Open Font Format 2 (WOFF2) quá khổĐường xử lý hình ảnh áp đặt một mức trần megapixel và một mức trần byte trước khi giải nén; đường xử lý phông chữ giới hạn kích thước tệp và số lượng glyph
Duyệt đường dẫnfile:///etc/passwd qua phông chữ hoặc SVG srcTài nguyên bên ngoài mặc định từ chối tất cả; đường dẫn tệp cục bộ được phân giải qua realpath() rồi đối chiếu với một allowlist thư mục khi được bật rõ ràng
Chèn nội dungChuỗi được tạo có chủ đích để thoát ra khỏi một toán tử PDF; data:/javascript: hrefEscape chuỗi PDF khi xuất ra; allowlist scheme và làm sạch href trên các annotation

Các giá trị mặc định kết hợp lại thành tư thế từ chối tất cả đối với tài nguyên bên ngoài: phông chữ, @import, background-image và các tham chiếu bên ngoài của SVG đều tắt cho đến khi bạn chọn bật theo từng scheme, như mô tả trong ma trận bao phủ thuộc tính bảo mật được duy trì song song với mã.

Trang này tài liệu hóa những mối đe dọa đã được xem xét. Đây không phải là báo cáo kiểm thử xâm nhập và không khẳng định rằng các biện pháp giảm thiểu được liệt kê là đầy đủ, hoặc rằng không còn lớp điểm yếu nào khác có thể áp dụng.

Đây không phải là hồ sơ tuân thủ. Mô hình mối đe dọa tham khảo quy trình mô hình hóa mối đe dọa của OWASP và phân loại điểm yếu CWE Top 25 (cwe_top25_2025#x28.x2.p42); nó không khẳng định tuân thủ bất kỳ chương trình chứng nhận bảo mật nào. Việc đánh giá độc lập thuộc về một cuộc kiểm toán, không phải tài liệu này.