Salta ai contenuti

Sicurezza e gestione operativa — NextPDF su CodeIgniter 4

Questa pagina elenca le minacce a cui l’integrazione deve resistere, indica i controlli presenti nel codice sorgente del pacchetto e fornisce regole operative per un deployment sicuro.

Le superfici che un attaccante può influenzare sono tre.

  1. Payload del job in coda. Una coda memorizza i dati del job. Un attaccante con accesso al broker può modificarli. Si tratta di input deserializzato e non attendibile.
  2. Nome file della risposta. Un utente può fornire il nome del file di download. Un nome non valido può iniettare contenuto negli header.
  3. Percorsi di configurazione. Il percorso dei font e i percorsi di firma provengono dalla configurazione. Un percorso non valido può leggere o scrivere in una posizione errata.

Il job in coda tratta il proprio payload come dati deserializzati e non attendibili. OWASP ASVS richiede una gestione sicura dell’input per i dati deserializzati non attendibili (ASVS V1.5.2).

Controlli verificati in GeneratePdfJob:

  • Il builder deve essere una stringa non vuota. Il job rifiuta tutti gli altri tipi.
  • Il builder deve corrispondere al pattern App\PdfBuilders\<Class>::<method>. Il job rifiuta qualsiasi altro namespace, le funzioni semplici e i payload con prefisso o suffisso.
  • Il builder deve essere callable. Il job rifiuta una stringa che corrisponde al pattern ma non si risolve.

Queste regole impediscono l’esecuzione di codice arbitrario tramite un payload della coda manomesso. I test del pacchetto verificano tutti i casi di rifiuto.

Controllo 2 — Confinamento del percorso di output della coda

Sezione intitolata “Controllo 2 — Confinamento del percorso di output della coda”

Il job scrive un file su disco. OWASP ASVS richiede una gestione sicura dei percorsi quando un’applicazione crea percorsi per le operazioni sui file (ASVS V5.3.2).

Controlli verificati in GeneratePdfJob:

  • Il percorso di output deve essere una stringa non vuota.
  • Il job normalizza il percorso. Risolve i segmenti . e .. e converte i separatori prima di ogni controllo.
  • Il percorso normalizzato deve trovarsi all’interno di WRITEPATH/pdfs/. Il job rifiuta una directory di pari livello che condivide un prefisso nel nome (pdfs-evil/).
  • Il percorso deve terminare con .pdf (senza distinzione tra maiuscole e minuscole).

Queste regole impediscono la scrittura di un file arbitrario tramite un payload manomesso.

Controllo 3 — Hardening degli header della risposta

Sezione intitolata “Controllo 3 — Hardening degli header della risposta”

PdfResponse applica un insieme fisso di header a ogni risposta PDF:

HeaderValore
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY
Content-Security-Policydefault-src 'none'
X-Robots-Tagnoindex, nofollow
Referrer-Policyno-referrer
Cache-Controlprivate, max-age=0, must-revalidate

Il nome del file viene sanificato prima di raggiungere l’header. Il pacchetto rimuove i separatori di percorso, i byte null e i caratteri CR/LF. Esegue l’escape delle virgolette doppie nella forma tra virgolette. Aggiunge un parametro RFC 5987 filename*=UTF-8''… per un nome non ASCII. Un nome vuoto diventa document.pdf.

Controllo 4 — Validazione dei percorsi di configurazione

Sezione intitolata “Controllo 4 — Validazione dei percorsi di configurazione”

Il registro dei font rifiuta un fontsPath che contiene uno stream wrapper (://) o un byte null. Genera un errore di runtime. Questo impedisce l’uso di un percorso con wrapper come php:// o phar://.

Controllo 5 — Superficie minima del service locator

Sezione intitolata “Controllo 5 — Superficie minima del service locator”

CodeIgniter 4 non dispone di un container PSR-11. Utilizza un locator Services. PSR-11 §1.3 considera sconsigliato il pattern service locator (indicazione SHOULD NOT). Il pacchetto mantiene ridotta la superficie del locator. Ogni servizio è esposto tramite un singolo metodo factory nominato. Risolvere i servizi al confine del controller. Passare oggetti concreti verso l’interno. Non passare la classe Services al codice di dominio.

Operazioni di firma e TSA (NextPDF Pro / Enterprise)

Sezione intitolata “Operazioni di firma e TSA (NextPDF Pro / Enterprise)”

Il servizio di firma è inattivo per impostazione predefinita. Si attiva solo quando signature.enabled è true e signature.certificate non è vuoto. Il livello di firma predefinito del pacchetto è B-B. NextPDF Pro fornisce la firma baseline B-B. La validazione a lungo termine è una funzionalità Enterprise separata. È documentata nel riferimento Premium, non in questa pagina.

Regole operative:

  • Tenere i file di certificato e di chiave fuori dal controllo di versione. Fornirli tramite .env o un secrets manager.
  • Mantenere tsa.allow_insecure_http impostato su false in produzione. Un canale TSA in chiaro non è accettabile.
  • Impostare tsa.pinned_public_keys quando la TSA pubblica una chiave stabile. Mantenere tsa.warn_on_key_rotation impostato su true.
  • Limitare l’accesso in lettura al file di chiave solo all’utente dell’applicazione.
  • Bloccare tutte le versioni risolte in composer.lock.
  • Richiedere codeigniter4/queue nell’applicazione che esegue i worker.
  • Eseguire il worker della coda come utente con privilegi limitati. Concedergli l’accesso in scrittura solo a WRITEPATH/pdfs/.
  • Rendere disponibili al worker le stesse estensioni NextPDF del livello web. Un PDF firmato richiede NextPDF Pro o Enterprise nell’ambiente del worker.
  • Verificare le estensioni mbstring e zlib in ogni runtime che genera un PDF.
  • Verificare che gli header della risposta sopravvivano al reverse proxy.
  • Registrare nel log la generazione dei PDF con il relativo contesto. Non registrare nel log materiale dei certificati né password delle chiavi.
  • La gestione del payload della coda è allineata a OWASP ASVS V1.5.2.
  • La gestione del percorso di output della coda è allineata a OWASP ASVS V5.3.2.
  • Il design del locator segue le indicazioni di PSR-11 §1.3.

Il core di NextPDF è Apache-2.0. I trust anchor delle firme e l’hardening della TSA si applicano quando è installato NextPDF Pro o Enterprise. Il pacchetto CodeIgniter espone i metodi di servizio corrispondenti, che restituiscono null finché non viene installato il pacchetto Premium corrispondente. Consultare </get-license/?intent=codeigniter-signing>.

  • /integrations/codeigniter/production-usage/ — registrazione e dispatch corretti per la coda.
  • /integrations/codeigniter/configuration/ — chiavi di firma, TSA e percorso.
  • /integrations/codeigniter/troubleshooting/ — messaggi di rifiuto verificati.
  • /integrations/codeigniter/overview/ — superficie completa dell’API.