โมเดลภัยคุกคามของเอนจิน
โดยสรุป
หัวข้อที่มีชื่อว่า “โดยสรุป”หน้านี้กำหนดโมเดลภัยคุกคามสำหรับเอนจินหลัก NextPDF โดยแสดงรายการคลาสการโจมตีที่เอนจินถือว่าอยู่ในขอบเขตเมื่อประมวลผลอินพุตที่ผู้โจมตีมีอิทธิพลได้ ได้แก่ Hypertext Markup Language (HTML) Cascading Style Sheets (CSS) Scalable Vector Graphics (SVG) ฟอนต์ รูปภาพ และไฟล์ Portable Document Format (PDF) ที่มีอยู่ หน้านี้ระบุท่าทีเริ่มต้นสำหรับความสามารถด้านทรัพยากรภายนอกแต่ละอย่าง และชี้ไปยัง guard ในโค้ดที่ใช้บรรเทาการโจมตีแต่ละคลาส
ขอบเขต โมเดลภัยคุกคามนี้บันทึกภัยคุกคามที่พิจารณาแล้วและ มาตรการบรรเทาที่นำมาใช้กับภัยคุกคามเหล่านั้น โมเดลนี้ไม่ได้อ้างว่าไม่มี ช่องโหว่อยู่ คลาสที่ไม่ได้แสดงไว้ที่นี่ไม่ได้พิสูจน์ว่าไม่มีอยู่ คลาสดังกล่าวอาจอยู่นอก ขอบเขตปัจจุบันของโมเดล ก่อนที่ฟีเจอร์ที่ยังไม่ได้พัฒนาจะออกใช้งาน ฟีเจอร์เหล่านั้นต้องผ่าน การทบทวนภัยคุกคามอย่างเป็นทางการ ให้ถือว่าหน้านี้เป็นบันทึกการออกแบบโดยเจตนา ไม่ใช่ การพิสูจน์ด้านความปลอดภัย
การติดตั้ง
หัวข้อที่มีชื่อว่า “การติดตั้ง”composer require nextpdf/core:^3guard ที่อธิบายไว้ที่นี่เป็นส่วนหนึ่งของแพ็กเกจ core คุณไม่จำเป็นต้องมี dependency เพิ่มเติมเพื่อเปิดใช้งาน guard เหล่านี้ เพราะเปิดใช้งานตามค่าเริ่มต้นอยู่แล้ว
ภาพรวมเชิงแนวคิด
หัวข้อที่มีชื่อว่า “ภาพรวมเชิงแนวคิด”โมเดลนี้เป็นไปตามกระบวนการสร้างโมเดลภัยคุกคามของ Open Worldwide Application Security Project (OWASP) (owasp_threat_modeling#x1.x11.p6) ได้แก่ การแยกย่อยระบบออกเป็นจุดที่อินพุตซึ่งไม่น่าเชื่อถือข้ามขอบเขตความเชื่อถือ การระบุภัยคุกคามที่ขอบเขตแต่ละจุด และการบันทึกมาตรการบรรเทา
ขอบเขตความเชื่อถือหลักของเอนจินคือ การนำเข้าเอกสาร (document ingestion) ซึ่งครอบคลุมทุกจุดที่เนื้อหาซึ่งสร้างจากภายนอก — สไตล์ชีตระยะไกล แหล่งที่มา @font-face ค่า <image href> ใบแจ้งหนี้ Extensible Markup Language (XML) ที่ฝังอยู่ หรือ PDF ที่จะตรวจสอบ — อาจทำให้เอนจินดึง แยกวิเคราะห์ หรือคลายการบีบอัดข้อมูล หลักการกำกับคือ ปฏิเสธโดยค่าเริ่มต้น (deny-by-default) นั่นคือ ความสามารถด้านทรัพยากรภายนอกทั้งหมดจะปิดอยู่จนกว่าคุณจะเปิดใช้งานอย่างชัดเจนผ่านอ็อบเจกต์ policy แนวทางนี้นำเกณฑ์พื้นฐานด้านฟังก์ชันการทำงานน้อยที่สุด (least functionality) จาก National Institute of Standards and Technology (NIST) SP 800-53 Rev. 5 CM-7 (nist_sp_800_53r5#x4.x182.p14) มาใช้กับเอนจินการเรนเดอร์ โดยค่าเริ่มต้นของ constructor คือสถานะที่เข้มงวดที่สุด การเปิดความสามารถใดความสามารถหนึ่งเป็นการตัดสินใจอย่างชัดเจนของคุณ
พื้นผิว API
หัวข้อที่มีชื่อว่า “พื้นผิว API”โมเดลภัยคุกคามไม่ใช่ application programming interface (API) อ็อบเจกต์ policy ที่แสดงโมเดลนี้มีเอกสารกำกับอยู่ในหน้าโมดูล จุดเข้าใช้งานที่เกี่ยวข้องกับความเชื่อถือ ได้แก่ สัญญา policy ด้านทรัพยากรภายนอก (ExternalResourcePolicyInterface โดยมี DefaultExternalResourcePolicy เป็นค่าเริ่มต้นแบบปฏิเสธทั้งหมด) และ guard ของ Uniform Resource Locator (URL) กับ XML (UrlValidator XmlGuard) หน้านี้อ้างอิงถึงพฤติกรรมของจุดเข้าใช้งานเหล่านั้น แต่ไม่ได้จัดทำเอกสารลายเซ็น (signature) ของจุดเหล่านั้นซ้ำ
ตัวอย่างโค้ด — เริ่มต้นอย่างรวดเร็ว
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด — เริ่มต้นอย่างรวดเร็ว”ท่าทีที่ปลอดภัยเป็นค่าเริ่มต้น คุณไม่จำเป็นต้องเขียนโค้ดเพื่อให้ได้ท่าทีนี้:
<?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();ตัวอย่างโค้ด — โปรดักชัน
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด — โปรดักชัน”การเปิดความสามารถใดความสามารถหนึ่งเป็นการกระทำโดยเจตนาและต้องจำกัดขอบเขต หากคุณจำเป็นต้องอนุญาตเว็บฟอนต์ที่โฮสต์บน content delivery network (CDN) ผ่าน Hypertext Transfer Protocol Secure (HTTPS) ในโปรดักชัน ให้เปิดใช้งานอย่างชัดเจนและจำกัดขอบเขต:
<?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()ยังไม่ได้พัฒนา จึงยังไม่มีพื้นผิวการโจมตีในปัจจุบัน ความสามารถเหล่านี้ยังคงมีเอกสารระบุว่าต้องผ่านเกตด้านภัยคุกคามอย่างเป็นทางการก่อนการพัฒนาใดๆ ในอนาคต การไม่มีโค้ดคือมาตรการบรรเทาในวันนี้ ไม่ใช่การรับประกันแบบถาวร - Domain Name System (DNS) rebinding เป็นเป้าหมายที่เปลี่ยนแปลงตลอด
UrlValidatorแปลงชื่อโฮสต์และคืนค่าที่อยู่ Internet Protocol (IP) ที่แปลงได้ เพื่อให้ผู้เรียกสามารถตรึงการเชื่อมต่อได้ (CURLOPT_RESOLVE) ซึ่งปิดช่องเวลาระหว่างการตรวจสอบกับการดึงข้อมูล หรือ time-of-check ถึง time-of-use (TOCTOU) นี่เป็นการป้องกันที่ดีที่สุดเท่าที่ทำได้ ไม่ใช่การป้องกันที่สมบูรณ์ ผู้ดำเนินการที่อยู่หลัง egress proxy ซึ่งอนุญาตอย่างหลวมยังคงเข้าถึงโฮสต์ภายในที่ไลบรารีมองไม่เห็นได้ - บิตสิทธิ์ (permission bits) ไม่ใช่การควบคุมการเข้าถึง เอกสารที่ “บล็อกการคัดลอก” อาศัยความร่วมมือของโปรแกรมอ่าน ไม่ใช่การบังคับใช้ เรื่องนี้ครอบคลุมอยู่ในโมเดลความปลอดภัย และถูกหยิบยกมากล่าวที่นี่เพราะเป็นความเข้าใจผิดเกี่ยวกับโมเดลภัยคุกคามที่พบได้บ่อย
ประสิทธิภาพ
หัวข้อที่มีชื่อว่า “ประสิทธิภาพ”guard เหล่านี้ล้มเหลวอย่างรวดเร็วและจำกัดงานที่ต้องทำ โดย guard ของ XML จะปฏิเสธ document type declaration (DOCTYPE) ก่อนการแยกวิเคราะห์และจำกัดขนาดอินพุต เส้นทางการประมวลผลรูปภาพบังคับใช้เพดานเมกะพิกเซลและจำนวนไบต์ก่อนการคลายการบีบอัด guard ของ URL ปฏิเสธตาม scheme และโฮสต์ก่อนเปิด socket ใดๆ ค่าเริ่มต้นที่ปลอดภัยมีต้นทุนเป็นคำขอที่ถูกปฏิเสธ ไม่ใช่คำขอที่ทำงานช้า
หมายเหตุด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “หมายเหตุด้านความปลอดภัย”คลาสการโจมตีที่พิจารณาแล้วและมาตรการบรรเทาในโค้ดของแต่ละคลาส พร้อมการอ้างอิง Common Weakness Enumeration (CWE) และ OWASP ในจุดที่เกี่ยวข้อง:
| คลาสของภัยคุกคาม (CWE / OWASP) | ช่องทางในเอนจิน PDF | guard ในโค้ด |
|---|---|---|
การปลอมคำขอฝั่งเซิร์ฟเวอร์ (Server-side request forgery, SSRF) (OWASP Top 10 2025; owasp_top10_2025#x3.x1.p26) | @font-face/@import/url() ที่ชี้ไปยัง 169.254.169.254 หรือโฮสต์ภายใน ตัวดึงข้อมูลของ time-stamp authority (TSA) Online Certificate Status Protocol (OCSP) และ certificate revocation list (CRL) | UrlValidator::validateExternalUrl() บล็อกช่วงที่อยู่แบบ private, reserved, loopback และ link-local รวมถึง endpoint ของ cloud-metadata ปฏิเสธ scheme ที่อันตราย แปลง DNS และคืนค่า IP เพื่อใช้ตรึงการเชื่อมต่อ |
เอนทิตีภายนอกของ XML (XML external entity, XXE) (cwe_top25_2025#x28.x2.p42) | external entity หรือ DOCTYPE ในใบแจ้งหนี้ XML ที่ฝังอยู่หรือแพ็กเก็ต Extensible Metadata Platform (XMP) | XmlGuard::loadXml() บังคับใช้ LIBXML_NONET ปฏิเสธการประกาศ DOCTYPE ทุกกรณีโดยสิ้นเชิง ปฏิเสธอักขระควบคุมต้องห้ามของ XML 1.0 และบังคับใช้เพดานขนาดอินพุต |
| Decompression bomb | รูปภาพขนาด 1×1 ที่ปกปิด payload ขนาด 100 MP ไฟล์ Web Open Font Format 2 (WOFF2) ที่มีขนาดใหญ่เกิน | เส้นทางการประมวลผลรูปภาพบังคับใช้เพดานเมกะพิกเซลและเพดานจำนวนไบต์ก่อนการคลายการบีบอัด เส้นทางการประมวลผลฟอนต์จำกัดขนาดไฟล์และจำนวน glyph |
| การลัดผ่านเส้นทาง (path traversal) | file:///etc/passwd ในแอตทริบิวต์ของฟอนต์หรือ SVG เช่น src | ทรัพยากรภายนอกปฏิเสธทั้งหมดตามค่าเริ่มต้น เส้นทางไฟล์ในเครื่องจะถูกแปลงผ่าน realpath() แล้วเทียบกับ allowlist ของไดเรกทอรีเมื่อเปิดใช้งานอย่างชัดเจน |
| การแทรกเนื้อหา (content injection) | สตริงที่ถูกสร้างขึ้นเพื่อหลุดออกจาก PDF operator; data:/javascript: ในค่า href | การ escape สตริง PDF ขณะ emit การใช้ allowlist ของ scheme และการ sanitize ค่า href บน annotation |
ค่าเริ่มต้นเหล่านี้รวมกันเป็นท่าทีปฏิเสธทั้งหมดด้านทรัพยากรภายนอก ได้แก่ ฟอนต์ @import background-image และการอ้างอิงภายนอกของ SVG จะปิดอยู่จนกว่าคุณจะเปิดใช้งานเป็นราย scheme ตามที่อธิบายไว้ในเมทริกซ์ความครอบคลุมของคุณสมบัติด้านความปลอดภัย ซึ่งดูแลควบคู่ไปกับโค้ด
หน้านี้จัดทำเอกสารภัยคุกคามที่พิจารณาแล้ว ไม่ใช่รายงานการทดสอบเจาะระบบ และไม่ได้อ้างว่ามาตรการบรรเทาที่ระบุไว้ครบถ้วนสมบูรณ์ หรือว่าไม่มีคลาสจุดอ่อนอื่นใดที่เกี่ยวข้อง
ความสอดคล้อง
หัวข้อที่มีชื่อว่า “ความสอดคล้อง”นี่ไม่ใช่โปรไฟล์ความสอดคล้อง โมเดลภัยคุกคามได้รับการกำหนดทิศทางจากกระบวนการสร้างโมเดลภัยคุกคามของ OWASP และอนุกรมวิธานจุดอ่อน CWE Top 25 (cwe_top25_2025#x28.x2.p42) โมเดลนี้ไม่ได้อ้างความสอดคล้องกับมาตรฐานการรับรองด้านความปลอดภัยใดๆ การประเมินอย่างอิสระเป็นหน้าที่ของการตรวจสอบ ไม่ใช่ของเอกสารนี้