Modello delle minacce del motore
In breve
Sezione intitolata “In breve”Questa pagina documenta il modello delle minacce del motore core di NextPDF. Elenca le classi di attacco che il motore considera nel proprio ambito quando elabora input influenzati da un attaccante (HTML, CSS, SVG, font, immagini e PDF esistenti). Indica la postura predefinita per ciascuna capacità relativa alle risorse esterne. Rimanda alle protezioni nel codice che mitigano ciascuna classe.
Confine. Un modello delle minacce documenta le minacce che sono state considerate e le mitigazioni applicate. Non afferma l’assenza di vulnerabilità. Il fatto che una classe non sia elencata qui non ne dimostra l’assenza — potrebbe essere al di fuori dell’ambito attuale del modello. Le funzionalità non implementate sono subordinate a una revisione formale delle minacce prima del rilascio. Considerare questa pagina una registrazione di scelte progettuali deliberate, non come una prova di sicurezza.
Installazione
Sezione intitolata “Installazione”composer require nextpdf/core:^3Le protezioni descritte qui fanno parte del pacchetto core; per abilitarle non è necessaria alcuna dipendenza aggiuntiva. Sono attive per impostazione predefinita.
Panoramica concettuale
Sezione intitolata “Panoramica concettuale”Il modello segue la struttura raccomandata dal processo di threat modeling OWASP (owasp_threat_modeling#x1.x11.p6): scomporre il sistema nei punti in cui input non attendibili attraversano un confine di fiducia, enumerare le minacce per ciascun confine e registrarne le mitigazioni.
Il confine di fiducia primario del motore è l’ingestione dei documenti: qualunque punto in cui contenuti prodotti altrove — un foglio di stile remoto, una sorgente @font-face, un <image href>, una fattura XML incorporata, un PDF da ispezionare — potrebbe indurre il motore a recuperare, analizzare o decomprimere qualcosa. Il principio guida è deny-by-default: ogni capacità relativa alle risorse esterne è disattivata finché il chiamante non la abilita esplicitamente tramite un oggetto policy. Questa è la baseline di funzionalità minima di NIST SP 800-53 Rev. 5 CM-7 (nist_sp_800_53r5#x4.x182.p14) applicata a un motore di rendering: la configurazione più restrittiva è il valore predefinito del costruttore. Abilitare una capacità è una decisione esplicita del chiamante.
Superficie dell’API
Sezione intitolata “Superficie dell’API”Il modello delle minacce non è di per sé un’API. Gli oggetti policy che lo esprimono sono documentati nelle pagine dei moduli; i punti di ingresso rilevanti per la fiducia sono il contratto della policy per le risorse esterne (ExternalResourcePolicyInterface, con DefaultExternalResourcePolicy come impostazione predefinita deny-all) e le protezioni per URL e XML (UrlValidator, XmlGuard). Questa pagina fa riferimento al loro comportamento; non ne ridocumenta le firme.
Esempio di codice — Avvio rapido
Sezione intitolata “Esempio di codice — Avvio rapido”La postura sicura è quella predefinita. Non è richiesto alcun codice per ottenerla:
<?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();Esempio di codice — Produzione
Sezione intitolata “Esempio di codice — Produzione”Abilitare una capacità è un’operazione deliberata e circoscritta. Un chiamante in produzione che deve consentire un webfont ospitato su CDN tramite HTTPS opta esplicitamente per l’abilitazione e ne delimita l’ambito:
<?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']);Casi limite e insidie
Sezione intitolata “Casi limite e insidie”- Non implementato non significa sicuro per caso. Capacità come
background-image url()in CSS non sono implementate. Pertanto presentano una superficie di attacco attuale pari a zero. Tuttavia sono documentate come soggette a un gate formale sulle minacce prima di qualsiasi futura implementazione. L’assenza di codice è la mitigazione di oggi, non una garanzia permanente. - Il DNS rebinding è un bersaglio mobile.
UrlValidatorrisolve il nome host e restituisce l’IP risolto in modo che il chiamante possa vincolare la connessione (CURLOPT_RESOLVE), chiudendo la finestra TOCTOU tra validazione e recupero. Si tratta di una difesa best-effort, non assoluta. Un operatore dietro un proxy di egress permissivo può comunque raggiungere host interni che la libreria non può osservare. - I bit di permesso non sono un controllo degli accessi. Un documento che «blocca la copia» fa affidamento sulla collaborazione del reader, non su un vincolo imposto. Questo aspetto è trattato nel modello di sicurezza. Viene evidenziato qui perché è un fraintendimento frequente del modello delle minacce.
Prestazioni
Sezione intitolata “Prestazioni”Le protezioni sono progettate per fallire rapidamente e limitare il lavoro: la protezione XML rifiuta DOCTYPE prima dell’analisi e impone un limite alla dimensione dell’input; il percorso delle immagini applica un limite massimo in megapixel e in byte prima della decompressione; la protezione URL rifiuta in base a scheme/host prima dell’apertura di qualsiasi socket. Il costo dell’impostazione predefinita sicura è una richiesta rifiutata, non una richiesta lenta.
Note sulla sicurezza
Sezione intitolata “Note sulla sicurezza”Le classi di attacco considerate e le relative mitigazioni nel codice:
| Classe di minaccia (CWE / OWASP) | Vettore in un motore PDF | Protezione nel codice |
|---|---|---|
SSRF (OWASP Top 10 2025; owasp_top10_2025#x3.x1.p26) | @font-face/@import/url() che puntano a 169.254.169.254 o a un host interno; fetcher TSA/OCSP/CRL | UrlValidator::validateExternalUrl() blocca gli intervalli private/reserved/loopback/link-local e gli endpoint di metadati cloud, rifiuta gli schemi pericolosi, risolve il DNS e restituisce l’IP per il pinning della connessione |
XXE (cwe_top25_2025#x28.x2.p42) | Entità esterne / DOCTYPE in una fattura XML incorporata o in un pacchetto XMP | XmlGuard::loadXml() impone LIBXML_NONET e rifiuta categoricamente qualsiasi dichiarazione DOCTYPE, oltre ai caratteri di controllo vietati da XML 1.0 e a un limite sulla dimensione dell’input |
| Bomba di decompressione | Immagine 1×1 che maschera un payload da 100 MP; WOFF2 sovradimensionato | Il percorso delle immagini applica un limite massimo in megapixel e un limite in byte prima della decompressione; il percorso dei font limita la dimensione del file e il numero di glifi |
| Path traversal | file:///etc/passwd tramite un font o un SVG src | Risorse esterne deny-all per impostazione predefinita; i percorsi di file locali vengono risolti tramite realpath() rispetto a una allowlist di directory quando abilitati esplicitamente |
| Content injection | Stringa appositamente costruita per uscire da un operatore PDF; data:/javascript: href | Escaping delle stringhe PDF in emissione; allowlist degli schemi + sanitizzazione degli href sulle annotazioni |
Le impostazioni predefinite si riassumono in una postura deny-all per le risorse esterne: font, @import, background-image e i riferimenti esterni SVG sono disattivati finché il chiamante non li abilita per singolo schema, secondo la matrice di copertura delle proprietà di sicurezza mantenuta insieme al codice.
Questa pagina documenta le minacce considerate. Non è un report di penetration test e non asserisce che le mitigazioni elencate siano complete né che nessun’altra classe di debolezza si applichi.
Conformità
Sezione intitolata “Conformità”Non è un profilo di conformità. Il modello delle minacce trae spunto dal processo di threat modeling OWASP e dalla tassonomia delle debolezze CWE Top 25 (cwe_top25_2025#x28.x2.p42); non dichiara conformità ad alcuno schema di certificazione di sicurezza. La valutazione indipendente è oggetto di un audit, non di questo documento.