Ga naar inhoud

Dreigingsmodel voor de engine

Deze pagina definieert het dreigingsmodel voor de core engine van NextPDF. Ze somt de aanvalsklassen op die binnen de scope van de engine vallen wanneer die door een aanvaller beïnvloede invoer verwerkt: Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), Scalable Vector Graphics (SVG), lettertypen, afbeeldingen en bestaande Portable Document Format (PDF)-bestanden. De pagina beschrijft de standaardhouding voor elke mogelijkheid waarbij externe resources betrokken zijn en verwijst naar de guard in de code die elke klasse beperkt.

Afbakening. Een dreigingsmodel legt de overwogen dreigingen en de maatregelen vast die daartegen zijn genomen. Het belooft niet dat kwetsbaarheden afwezig zijn. Een klasse die hier niet wordt vermeld, is niet aantoonbaar afwezig; ze kan buiten de huidige scope van het model vallen. Voordat functionaliteit die nog niet is geïmplementeerd wordt uitgebracht, doorloopt die een formele dreigingsbeoordeling. Beschouw deze pagina als een vastlegging van weloverwogen ontwerpkeuzes, niet als een beveiligingsbewijs.

Terminal window
composer require nextpdf/core:^3

De hier beschreven guards maken deel uit van het core-pakket. U hebt geen extra dependency nodig om ze in te schakelen; ze staan standaard aan.

Het model volgt het proces voor dreigingsmodellering van het Open Worldwide Application Security Project (OWASP) (owasp_threat_modeling#x1.x11.p6): ontleed het systeem op de punten waar niet-vertrouwde invoer een vertrouwensgrens overschrijdt, inventariseer de dreigingen bij elke grens en leg de maatregel vast.

De primaire vertrouwensgrens van de engine is documentinname: elke plek waar elders gemaakte content — een externe stylesheet, een @font-face-bron, een <image href>, een ingesloten Extensible Markup Language (XML)-factuur of een te inspecteren PDF — de engine ertoe kan brengen gegevens op te halen, te parsen of te decomprimeren. Het leidende principe is standaard weigeren: elke mogelijkheid waarbij externe resources betrokken zijn, is uitgeschakeld totdat u deze expliciet via een policy-object inschakelt. Zo wordt de basislijn van minimale functionaliteit uit National Institute of Standards and Technology (NIST) SP 800-53 Rev. 5 CM-7 (nist_sp_800_53r5#x4.x182.p14) toegepast op een weergave-engine: de standaardwaarde van de constructor is de strengste stand. Het openstellen van een mogelijkheid is uw expliciete beslissing.

Het dreigingsmodel is geen application programming interface (API). De policy-objecten waarmee het wordt uitgedrukt, worden gedocumenteerd op de modulepagina’s. De toegangspunten die relevant zijn voor vertrouwen zijn het policy-contract voor externe resources (ExternalResourcePolicyInterface, met DefaultExternalResourcePolicy als de alles-weigerende standaard) en de Uniform Resource Locator (URL)- en XML-guards (UrlValidator, XmlGuard). Deze pagina verwijst naar hun gedrag, zonder hun signatures opnieuw te documenteren.

De veilige houding is de standaard. U hebt geen code nodig om die te krijgen:

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

Het openstellen van een mogelijkheid is weloverwogen en nauw afgebakend. Als u in productie een webfont dat via een content delivery network (CDN) wordt gehost over Hypertext Transfer Protocol Secure (HTTPS) moet toestaan, schakel dit dan expliciet in en beperk de scope:

<?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']);
  • Niet geïmplementeerd is niet hetzelfde als per ongeluk veilig. Mogelijkheden zoals CSS background-image url() zijn niet geïmplementeerd en hebben daarom momenteel geen aanvalsoppervlak. Toch is vastgelegd dat ze vóór elke toekomstige implementatie een formele dreigingsbeoordeling vereisen. De afwezigheid van code is vandaag de maatregel, geen permanente garantie.
  • Domain Name System (DNS) rebinding is een bewegend doel. UrlValidator resolveert de hostnaam en retourneert het geresolvde Internet Protocol (IP)-adres, zodat de aanroeper de verbinding kan vastpinnen (CURLOPT_RESOLVE), waarmee het time-of-check to time-of-use (TOCTOU)-venster tussen valideren en ophalen wordt gesloten. Dit is een best-effortverdediging, geen absolute garantie. Een operator achter een tolerante egress-proxy kan nog steeds interne hosts bereiken die de library niet kan zien.
  • Permissiebits zijn geen toegangscontrole. Een document dat „kopiëren blokkeert” vertrouwt op de medewerking van de viewer, niet op afdwinging. Dit wordt behandeld in het beveiligingsmodel. Het wordt hier benoemd omdat het een veelvoorkomend misverstand over dreigingsmodellen is.

De guards falen snel en beperken de hoeveelheid werk: de XML-guard weigert een document type declaration (DOCTYPE) vóór het parsen en stelt een limiet aan de invoergrootte; het afbeeldingspad dwingt vóór decompressie een megapixel- en bytelimiet af; de URL-guard weigert op schema en host voordat er een socket wordt geopend. De veilige standaard kost een geweigerd verzoek, geen traag verzoek.

De overwogen aanvalsklassen en hun maatregelen in de code, met verwijzingen naar Common Weakness Enumeration (CWE) en OWASP waar die van toepassing zijn:

Dreigingsklasse (CWE / OWASP)Vector in een PDF-engineGuard in de code
Server-side request forgery (SSRF) (OWASP Top 10 2025; owasp_top10_2025#x3.x1.p26)@font-face/@import/url() die verwijst naar 169.254.169.254 of een interne host; fetchers voor time-stamp authority (TSA), Online Certificate Status Protocol (OCSP) en certificate revocation list (CRL)UrlValidator::validateExternalUrl() blokkeert private, gereserveerde, loopback- en link-local-bereiken en cloud-metadata-endpoints; weigert gevaarlijke schema’s; resolveert DNS; en retourneert het IP voor connection pinning
XML external entity (XXE) (cwe_top25_2025#x28.x2.p42)Externe entities of DOCTYPE in een ingesloten XML-factuur of Extensible Metadata Platform (XMP)-packetXmlGuard::loadXml() dwingt LIBXML_NONET af, weigert elke DOCTYPE-declaratie ronduit, weigert door XML 1.0 verboden control chars en past een limiet voor de invoergrootte toe
Decompressiebom1×1-afbeelding die een payload van 100 MP maskeert; te grote Web Open Font Format 2 (WOFF2)Het afbeeldingspad dwingt vóór decompressie een megapixellimiet en een bytelimiet af; het lettertypepad begrenst de bestandsgrootte en het aantal glyphs
Path traversalfile:///etc/passwd via een lettertype- of SVG-srcExterne resources worden standaard volledig geweigerd; lokale bestandspaden worden via realpath() herleid ten opzichte van een directory-allowlist wanneer dit expliciet is ingeschakeld
Content injectionGeconstrueerde string die uit een PDF-operator breekt; data:/javascript:-hrefPDF-string-escaping bij het genereren; schema-allowlist en href-sanitization op annotaties

De standaardinstellingen vormen samen een alles-weigerende houding voor externe resources: lettertype, @import, background-image en externe SVG-verwijzingen blijven uitgeschakeld totdat u per schema kiest om ze in te schakelen, zoals beschreven in de dekkingsmatrix voor beveiligingseigenschappen die naast de code wordt onderhouden.

Deze pagina documenteert overwogen dreigingen. Het is geen penetratietestrapport en beweert niet dat de vermelde maatregelen volledig zijn of dat er geen andere klasse van zwakheden van toepassing is.

Dit is geen conformiteitsprofiel. Het dreigingsmodel is gebaseerd op het proces voor dreigingsmodellering van OWASP en de zwaktetaxonomie van de CWE Top 25 (cwe_top25_2025#x28.x2.p42); het beweert geen conformiteit met een beveiligingscertificeringsschema. Onafhankelijke beoordeling hoort thuis in een audit, niet in dit document.