Salta ai contenuti

Modello delle minacce del motore

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.

Terminal window
composer require nextpdf/core:^3

Le protezioni descritte qui fanno parte del pacchetto core; per abilitarle non è necessaria alcuna dipendenza aggiuntiva. Sono attive per impostazione predefinita.

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.

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.

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

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']);
  • 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. UrlValidator risolve 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.

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.

Le classi di attacco considerate e le relative mitigazioni nel codice:

Classe di minaccia (CWE / OWASP)Vettore in un motore PDFProtezione 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/CRLUrlValidator::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 XMPXmlGuard::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 decompressioneImmagine 1×1 che maschera un payload da 100 MP; WOFF2 sovradimensionatoIl 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 traversalfile:///etc/passwd tramite un font o un SVG srcRisorse 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 injectionStringa appositamente costruita per uscire da un operatore PDF; data:/javascript: hrefEscaping 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.

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.