Tredici vulnerabilità corrette in un colpo solo, di cui due classificate come critiche: è questo il biglietto da visita di Twig 3.26.0, l'aggiornamento del motore di template per PHP che alimenta buona parte dell'ecosistema Symfony. Non si tratta di funzionalità nuove o ritocchi cosmetici. Si parla di iniezione di codice PHP arbitrario attraverso la cache compilata, di sandbox aggirate come se non esistessero e di filtri che dichiaravano il proprio output «sicuro» quando non lo era affatto. Per chi gestisce template non fidati - e in molti contesti multiutente è esattamente la situazione - l'aggiornamento non è facoltativo.

Due falle critiche: quando la cache diventa un'arma
Il problema più grave risiede in CVE-2026-46633, una vulnerabilità di iniezione di codice PHP attraverso il tag {% use %}. Il meccanismo è tanto elegante quanto pericoloso. Il metodo Compiler::string() di Twig si occupa di sfuggire i caratteri problematici - virgolette doppie, il simbolo del dollaro, il backslash, NUL e TAB - quando genera stringhe letterali PHP racchiuse tra virgolette doppie. Le virgolette singole, però, non vengono toccate.
Il problema emerge in ModuleNode::compileConstructor(), dove il nome del template proveniente da un tag {% use %} viene compilato tramite subcompile() → string() e inserito all'interno di una stringa PHP delimitata da virgolette singole. Un nome di template che contenga una virgoletta singola chiude prematuramente la stringa circostante, aprendo la porta all'iniezione di espressioni PHP arbitrarie nel file di cache compilato.
Il codice iniettato viene eseguito nel processo PHP al primo caricamento del file di cache, aggirando completamente la sandbox di Twig e ottenendo esecuzione di codice remoto. A peggiorare le cose, SecurityPolicy consente incondizionatamente il tag {% use %} indipendentemente dai tag configurati come permessi: il vettore d'attacco è raggiungibile anche da template eseguiti in sandbox.
La seconda vulnerabilità critica riguarda la sintassi macro _self.(<string>), che permette anch'essa l'iniezione di codice PHP arbitrario nella cache compilata. I dettagli tecnici sul meccanismo specifico non sono stati resi pubblici, ma la classificazione come critica e il vettore - sempre iniezione tramite cache - la rendono altrettanto urgente.
La sandbox che non isola
Sotto le due falle critiche si estende un panorama di bypass della sandbox classificati ad alta e media gravità. Tre vulnerabilità ad alta gravità colpiscono meccanismi diversi: un bypass tramite destrutturazione di oggetti, coercizioni __toString() non controllate e una gestione errata delle source policy.
A gravità media troviamo il filtro column che aggira le liste di proprietà consentite, controlli sandbox incompleti sulle inclusioni in cache e template_from_string che sfugge alle policy sulle sorgenti. Il quadro complessivo suggerisce che la sandbox di Twig, prima di questa versione, presentava una superficie d'attacco considerevole per chi riuscisse a far eseguire template controllati dall'attaccante.
Filtri «sicuri» che non lo erano: CVE-2026-46637
CVE-2026-46637 riguarda i pacchetti twig/markdown-extra e twig/cssinliner-extra nelle versioni precedenti alla 3.26.0. Diversi filtri erano registrati con la dichiarazione is_safe => ['all'], che dice all'autoescaper di Twig di trattare l'output come sicuro in qualsiasi contesto: HTML, JavaScript, CSS, URL.
Il filtro html_to_markdown emette testo Markdown semplice. La libreria sottostante, league/html-to-markdown, decodifica le entità HTML quando produce blocchi di codice - il che significa che un input come <code><img src=x onerror=alert(1)></code> diventa un blocco Markdown contenente markup HTML attivo. Se l'output finisce in un contesto non HTML - una stringa JavaScript, un parametro URL - viene emesso così com'è, senza alcun escape, con XSS servito su un piatto d'argento.
I filtri markdown_to_html e inline_css emettono HTML e sono effettivamente sicuri nel contesto HTML, ma non in contesti JavaScript, CSS o URL. La correzione è chirurgica: html_to_markdown non dichiara più di essere sicuro in alcun contesto, mentre markdown_to_html e inline_css sono ora dichiarati is_safe => ['html'] soltanto.
Un dettaglio curioso nei crediti: la segnalazione e la correzione per html_to_markdown e markdown_to_html sono attribuite a «Claude Mythos Preview (via Project Glasswing)», con l'audit esteso a inline_css da Christophe Coevoet. Vedere strumenti di intelligenza artificiale accreditati formalmente in una CVE non è più una rarità assoluta, ma nei changelog ufficiali di un progetto del calibro di Twig fa ancora un certo effetto.
Bassa gravità, ma non trascurabile
Completano il quadro tre vulnerabilità a bassa gravità: un XSS nel profiler HtmlDumper, annotazioni is_safe errate su filtri che emettono HTML e un problema di memoizzazione illimitata dei formatter in twig/intl-extra. Quest'ultimo potrebbe non sembrare un problema di sicurezza, ma un consumo di memoria non controllato è un vettore classico per attacchi di tipo denial of service - e classificarlo come «bassa gravità» non significa ignorarlo.

Il contesto più ampio
Nello stesso periodo, Symfony ha rilasciato le versioni v8.1.0-BETA3 e v6.4.40, contenenti a loro volta correzioni di sicurezza tra cui una per XSS in CodeExtension::fileExcerpt() nel TwigBridge. L'attività coordinata fa pensare a un ciclo di audit ampio sull'intero stack di templating dell'ecosistema Symfony.
Vale la pena guardare anche un passo indietro: Twig 3.25.0 aveva introdotto l'opzione needs_is_sandboxed per filtri, funzioni e test, oltre a rendere deterministico l'output compilato dei template che usano {% embed %}. Con il senno di poi, quell'infrastruttura appare come il terreno preparatorio per il lavoro di irrobustimento della sandbox culminato nella 3.26.0.
Chi deve aggiornare e quando
Risposta breve: subito. Chi esegue template non fidati attraverso la sandbox di Twig non ha margini di attesa. Ma anche chi non usa la sandbox in modo esplicito farebbe bene a non temporeggiare: le vulnerabilità legate ai filtri is_safe colpiscono chiunque utilizzi twig/markdown-extra o twig/cssinliner-extra in contesti dove l'output del template finisce in attributi JavaScript o URL - una situazione meno rara di quanto si voglia credere.
Due falle critiche che permettono esecuzione di codice remoto attraverso la cache compilata, su un componente onnipresente nell'ecosistema PHP moderno: la superficie d'attacco potenziale è vasta e il rischio per le applicazioni esposte su Internet è concreto. L'aggiornamento a Twig 3.26.0 è, nei fatti, un'operazione di emergenza.
Fonti: symfony.com, github.com