Invio di registri, avvisi e dati di telemetria tramite un diodo di dati

Scopri come
Per le traduzioni dei siti utilizziamo l'intelligenza artificiale e, sebbene ci sforziamo di essere accurati, non sempre le traduzioni sono precise al 100%. La vostra comprensione è apprezzata.

CVE-2026-25049: Sandbox delle espressioni con conseguente esecuzione di codice remoto in n8n

Di Loc Nguyen, responsabile del team di test di penetrazione
Condividi questo post

Nel febbraio 2026 è stata resa pubblica una grave vulnerabilità di tipo "sandbox escape" in n8n, la piattaforma open source per l'automazione dei flussi di lavoro ampiamente diffusa. Identificata con il codice CVE-2026-25049, questa vulnerabilità consente agli utenti autenticati di aggirare la sandbox di valutazione delle espressioni ed eseguire comandi di sistema arbitrari sul server host, ottenendo l'esecuzione completa di codice remoto con un punteggio CVSS v3.1 pari a 9,9.

Nell'ambito del programma di borse di studioOPSWAT , i nostri borsisti hanno condotto un'analisi tecnica approfondita della vulnerabilità CVE-2026-25049, esaminandone la causa principale, il meccanismo di sfruttamento e l'impatto sulle organizzazioni.

Questo blog offre una guida dettagliata alla vulnerabilità: dall'architettura di elaborazione delle espressioni di n8n e dai suoi controlli di sicurezza a più livelli fino alla tecnica specifica che riesce a eludere contemporaneamente tutti e cinque i livelli di difesa.

CVE-2026-25049 è una vulnerabilità critica di tipo "sandbox escape" in n8n, classificata sotto il codice CWE-913: "Controllo improprio delle risorse del codice gestito dinamicamente". La vulnerabilità interessa tutte le versioni di n8n precedenti alla 1.123.17, nonché le versioni dalla 2.0.0 alla 2.5.1, ed è stata corretta nelle versioni 1.123.17 e 2.5.2. Consente agli utenti autenticati con permessi di creazione di flussi di lavoro di creare espressioni JavaScript dannose che aggirano la sandbox delle espressioni della piattaforma, ottenendo in ultima analisi l'esecuzione di comandi arbitrari sul server host.

Figura 1: CVE-2026-25049 (fonte: NVD)

La vulnerabilità è particolarmente grave poiché n8n occupa solitamente una posizione privilegiata all'interno dell'infrastruttura di un'organizzazione. In qualità di hub per l'automazione dei flussi di lavoro, n8n dispone in genere di accesso diretto alle API interne, ai database, agli archivi di credenziali e ai servizi di terze parti. Un'istanza di n8n compromessa non si limita a esporre il server di automazione, ma funge da punto di accesso a tutti i sistemi collegati, ampliando notevolmente la portata dell'attacco.

CVE-2026-25049 non rappresenta una vulnerabilità a sé stante, bensì un aggiramento della patch relativa a CVE-2025-68613, una precedente fuga dalla sandbox nell’evaluator delle espressioni di n8n. Nonostante l'implementazione di difese a più livelli dopo la vulnerabilità iniziale, una lacuna fondamentale nel modo in cui il sanitizer elabora i tipi di nodi dell'AST (Abstract Syntax Tree) di JavaScript ha permesso alla classe di attacchi originale di riemergere attraverso un vettore sintattico diverso. Questo modello, in cui una patch affronta la tecnica di exploit specifica piuttosto che la debolezza di progettazione sottostante, evidenzia la sfida persistente di proteggere gli ambienti di valutazione del codice dinamico.

La vulnerabilità è stata resa nota il 4 febbraio 2026, insieme ad altri dieci avvisi di sicurezza relativi a n8n, ed è stata analizzata in modo indipendente da diversi team di ricerca nel campo della sicurezza.

Informazioni su n8n

n8n è una piattaforma open source per l'automazione dei flussi di lavoro che consente alle organizzazioni di collegare sistemi, automatizzare processi e creare integrazioni tra centinaia di servizi. Grazie alla sua ampia diffusione e alle oltre 1.300 integrazioni disponibili, n8n è diventato uno degli strumenti più popolari nel suo settore, utilizzato dai team di sviluppo e dalle aziende per automatizzare ogni aspetto, dagli strumenti interni alle pipeline di dati fondamentali per l'attività aziendale.

Figura 2: Un esempio di flusso di lavoro n8n.

La piattaforma supporta sia implementazioni self-hosted che su cloud e offre un generatore visivo di flussi di lavoro, oltre al supporto diretto di JavaScript per la logica personalizzata. L'architettura di n8n è basata su nodi: i flussi di lavoro sono composti da nodi interconnessi che scambiano dati in formato JSON tra trigger, azioni e passaggi di funzione. L'esecuzione può avvenire in modalità manuale per i test o in modalità di produzione per l'implementazione live. Questa architettura, combinata con il supporto nativo per le espressioni JavaScript e l'accesso alle API interne e agli archivi di credenziali, rende n8n un potente strumento di automazione, ma anche un bersaglio di alto valore quando si presentano delle vulnerabilità.

Contesto tecnico

Alberi di sintassi astratta

Un albero di sintassi astratta (AST) è una rappresentazione gerarchica del codice sorgente generata da un analizzatore sintattico. Anziché considerare il codice come una stringa piatta, un AST lo scompone in nodi strutturati che rappresentano i suoi elementi sintattici: dichiarazioni di variabili, espressioni di funzione, espressioni di membro, identificatori e letterali.

Figura 3: Fasi del compilatore.

Comprendere i tipi di nodi AST è fondamentale per questa analisi, poiché i controlli di sicurezza di n8n operano a livello di AST. I sanitizer esaminano tipi di nodi specifici per individuare e bloccare modelli pericolosi. La vulnerabilità sfrutta il fatto che la stessa operazione semantica – l'accesso alla proprietà di un oggetto – può generare tipi di nodi AST completamente diversi a seconda della sintassi JavaScript utilizzata.

Figura 4: Alcuni nodi AST in JavaScript.

Ad esempio, l'espressione `obj.constructor ` genera un nodo `MemberExpression `, mentre `const { constructor } = obj` genera una `VariableDeclaration ` contenente un `ObjectPattern` con un nodo `Property`. Entrambe estraggono la stessa proprietà, ma le strutture AST sono fondamentalmente diverse – e i sanitizer di n8n controllano solo il primo modello.

Valutazione delle espressioni e architettura di sicurezza di n8n

L'architettura di n8n è strutturata in cinque livelli: Frontend, CLI, Core, Workflow e Nodes. Il livello Workflow gestisce la valutazione delle espressioni, che è la componente interessata da questa vulnerabilità.

Figura 5: Panoramica del flusso di n8n.

n8n consente agli utenti di incorporare espressioni JavaScript nei parametri dei nodi del flusso di lavoro per manipolare dinamicamente i dati. Queste espressioni vengono valutate lato server utilizzando una libreria chiamata Tournament, che analizza le espressioni in un AST prima dell'esecuzione. Gli hook di sanificazione vengono inseriti direttamente nel processo di creazione di Tournament, eseguendo controlli durante la costruzione dell'AST per intercettare modelli pericolosi prima che il codice venga eseguito.

Figura 6: Creazione iniziale del torneo.

Poiché queste espressioni vengono eseguite all'interno dello stesso processo Node.js del server n8n, la piattaforma implementa cinque livelli di sicurezza distinti, progettati per impedire che codice non attendibile riesca a sfuggire alla sandbox.

Livello 1 - Sovrascrittura del contesto globale

Prima che qualsiasi espressione venga valutata, n8n crea un contesto di esecuzione limitato sovrascrivendo oggetti e funzioni globali potenzialmente pericolosi. Proprietà quali document, window, globalThis, eval, setTimeout, setInterval e Function vengono sostituite con oggetti vuoti, impedendo così l'accesso diretto a tali funzionalità.

Figura 7: Avvio del contesto globale.
Figura 8: Sovrascrivere tutte le funzioni pericolose.

Questo approccio presenta un limite intrinseco: se un malintenzionato riesce a sfuggire al contesto limitato e a raggiungere il vero oggetto di processo globale, le proprietà sovrascritte perdono ogni rilevanza.

Livello 2 - Convalida tramite espressioni regolari

Prima che l'espressione raggiunga il valutatore, n8n esegue un controllo tramite espressione regolare sulla stringa dell'espressione grezza per bloccare l'accesso alla proprietà del costruttore, un vettore comune per ottenere il costruttore Function e consentire l'esecuzione del codice.

Figura 9: Convalida tramite espressioni regolari.

L'espressione regolare /\.\s*constructor/gm rileva l'accesso tramite notazione con il punto a .constructor. Tuttavia, questo controllo presenta dei limiti intrinseci, poiché JavaScript offre diversi modi sintattici per accedere alla stessa proprietà, non tutti basati sulla notazione con il punto.

Livello 3 - Sanitizer di runtime AST – PrototypeSanitizer

La difesa più sofisticata entra in azione durante la costruzione dell'AST. Il hook PrototypeSanitizer esamina l'AST e controlla i nodi MemberExpression per verificare se la proprietà a cui si accede figura in un elenco di proprietà degli oggetti non sicure, tra cui constructor, __proto__, prototype, mainModule e binding.

Figura 10: Prototipo di sanificatore.

Il sanitizer gestisce tre casi: la notazione con il punto (obj.prop), in cui verifica il nome dell'identificatore; la notazione statica tra parentesi quadre (obj['prop']), in cui verifica il valore letterale della stringa; e le espressioni dinamiche, che vengono racchiuse in una funzione di sanitizer eseguita in fase di runtime. Come mostrato nella Figura 10, vengono ispezionati solo i nodi MemberExpression: i modelli di destrutturazione non vengono analizzati.

Livello 4 - Funzione di sanificazione del runtime AST ThisSanitizer

Aggiunto come patch diretta per la vulnerabilità CVE-2025-68613, FunctionThisSanitizer intercetta le espressioni di funzione a esecuzione immediata (IIFE) e le riscrive in modo da associare `this` a un oggetto vuoto. Ciò impedisce l'utilizzo della tecnica impiegata nell'exploit originale, in cui (function(){ return this })() causava la divulgazione dell'oggetto di processo globale attraverso il riferimento `this` non associato.

Figura 11: Funzione GlobalThisSanitizer

È importante sottolineare che questo sanitizer gestisce solo i nodi FunctionExpression. Esce esplicitamente dalla procedura per qualsiasi oggetto chiamato che non sia un FunctionExpression, comprese le funzioni freccia.

Le proprietà pericolose come `eval`, `Function` e `process.mainModule` vengono rimosse o sovrascritte nel contesto di esecuzione, impedendo l'accesso diretto alle primitive di esecuzione del codice anche se i livelli precedenti vengono aggirati.

Analisi delle vulnerabilità

Causa principale

La causa principale della vulnerabilità CVE-2026-25049 risiede in un presupposto comune a tutti e cinque i livelli di sicurezza: ogni livello partiva dal presupposto che l'accesso alle proprietà avvenisse tramite la notazione con il punto (obj.constructor) o la notazione con le parentesi quadre (obj['constructor']). Nessuno di essi teneva conto della sintassi di destrutturazione di JavaScript.

La destrutturazione in JavaScript consente di estrarre proprietà dagli oggetti utilizzando una struttura AST sostanzialmente diversa:

// Traditional access - produces MemberExpression node
obj.constructor; // Blocked by regex, AST sanitizer, and runtime checks

// Destructuring - produces ObjectPattern → Property node
const { constructor } = obj; // Not checked by any layer

Sebbene entrambi i modelli portino allo stesso risultato, generano rappresentazioni AST completamente diverse. PrototypeSanitizer ispeziona solo i nodi MemberExpression, mentre l'espressione regolare trova corrispondenze solo con i modelli .constructor. Le assegnazioni con destrutturazione creano nodi VariableDeclaration → ObjectPattern → Property, che nessuno dei sanitizer analizza.

A ciò si aggiunge il modo in cui n8n gestisce le funzioni freccia. Il FunctionThisSanitizer intercetta solo i nodi FunctionExpression e li riscrive per associare `this` a un contesto sicuro. Le funzioni freccia generano nodi AST di tipo ArrowFunctionExpression, che il sanitizer non elabora. Poiché le funzioni freccia ereditano `this` dall'ambito circostante (this lessicale), consentono l'accesso al contesto globale non sanificato.

Insieme, queste due omissioni danno luogo a un bypass completo: la destrutturazione estrae il costruttore Function senza attivare alcun controllo sull'accesso alle proprietà, mentre le funzioni freccia forniscono un contesto di esecuzione che FunctionThisSanitizer non intercetta.

Sfruttamento

L'exploit sfrutta entrambe le vulnerabilità per aggirare contemporaneamente tutti i livelli di sicurezza. I nostri colleghi hanno individuato il seguente percorso di exploit:

Passaggio 1 - Inserimento della funzione freccia. Il payload inizia con una funzione freccia racchiusa in un'espressione di funzione a esecuzione immediata (IIFE):

={{(() => {
// Funzione freccia - aggira FunctionThisSanitizer
...
})()}}

La funzione `FunctionThisSanitizer` verifica se l'oggetto chiamato è un'espressione di funzione (FunctionExpression); poiché si tratta di un'espressione di funzione freccia (ArrowFunctionExpression), il sanitizer termina l'esecuzione anticipatamente senza riscrivere la chiamata. La funzione freccia viene eseguita con pieno accesso al contesto globale reale.

Passaggio 2 - Bypass della destrutturazione. All'interno della funzione freccia, la destrutturazione estrae il costruttore Function da un'istanza della funzione freccia:

const { constructor } = () => {};

Poiché si tratta di un'assegnazione di destrutturazione, l'AST contiene un nodo ObjectPattern anziché un MemberExpression. Il controllo tramite espressione regolare non rileva alcun pattern .constructor e il PrototypeSanitizer non verifica mai il nome della proprietà. L'autore dell'attacco dispone ora di un riferimento al costruttore Function.

Fase 3 - Esecuzione dinamica di codice. Una volta ottenuto il costruttore della funzione, l'autore dell'attacco crea ed esegue codice arbitrario:

return constructor(
'return process.mainModule.require("child_process").execSync("whoami").toString()',
);)

La funzione generata dinamicamente viene eseguita al di fuori del contesto della sandbox con pieno accesso all'oggetto del processo Node.js, consentendo l'esecuzione di comandi di sistema arbitrari sull'host.

Figura 12: Carico utile dell'attacco finale

Prova di concetto

Per dimostrare l'impatto concreto di questa vulnerabilità, i nostri ricercatori hanno riprodotto l'exploit in un ambiente di laboratorio controllato. Lo scenario di attacco prevede l'hosting di un'istanza vulnerabile di n8n e l'importazione di un flusso di lavoro contenente il payload dannoso all'interno di un parametro del nodo, prendendo di mira in particolare il nodo "Modifica campi", che consente la valutazione delle espressioni.

Figura 13: Un amministratore importa un flusso di lavoro dannoso.

Una volta avviato il flusso di lavoro, il payload aggira tutti e cinque i livelli di sanificazione ed esegue una reverse shell sul server host, restituendo all'autore dell'attacco la piena capacità di eseguire comandi.

Figura 14: Esecuzione del payload tramite trigger del flusso di lavoro.

Escalation del webhook a RCE senza autenticazione

La gravità di questa vulnerabilità aumenta in modo significativo se combinata con la funzionalità webhook di n8n. n8n consente ai flussi di lavoro di esporre endpoint HTTP come webhook con opzioni di autenticazione configurabili, tra cui token bearer, autenticazione di base e, cosa fondamentale, nessuna autenticazione. Un aggressore con accesso alla creazione di flussi di lavoro può configurare un webhook pubblico con autenticazione: "nessuna", incorporare il payload RCE in un nodo connesso e attivare il flusso di lavoro. A quel punto, qualsiasi richiesta HTTP all'URL del webhook - da qualsiasi punto di Internet - innesca l'esecuzione di comandi arbitrari sul server host.

Questo percorso di escalation trasforma la vulnerabilità CVE-2026-25049 da una vulnerabilità interna e soggetta ad autenticazione in un vettore di attacco di fatto non soggetto ad autenticazione, con esposizione a livello di Internet.

Mitigazione

Il team di n8n ha risolto la vulnerabilità CVE-2026-25049 nelle versioni 1.123.17 e 2.5.2 implementando un adeguato controllo dei tipi in fase di esecuzione nelle funzioni di sanificazione ed estendendo la copertura dell'AST per gestire i modelli di destrutturazione. Le organizzazioni che utilizzano le versioni interessate dovrebbero effettuare immediatamente l'aggiornamento.

Se non è possibile effettuare un aggiornamento immediato, gli amministratori dovrebbero limitare i permessi di creazione e modifica dei flussi di lavoro esclusivamente agli utenti di piena fiducia e implementare n8n in un ambiente protetto, con privilegi del sistema operativo e accesso alla rete limitati.

Data la gravità della vulnerabilità e la facilità con cui può essere sfruttata – in particolare se combinata con i webhook pubblici – le organizzazioni dovrebbero inoltre verificare i flussi di lavoro esistenti alla ricerca di espressioni sospette, monitorare l'esecuzione di comandi di sistema anomali provenienti dal processo n8n e controllare le configurazioni dei webhook per individuare eventuali endpoint esposti senza autenticazione.

Mitigazione con OPSWAT

Grazie a OPSWAT , le organizzazioni possono identificare rapidamente i componenti n8n vulnerabili presenti nella propria infrastruttura e intervenire prima che si verifichino attacchi. OPSWAT , una tecnologia fondamentale della piattaforma MetaDefender®, fornisce un inventario completo di tutti i componenti software, le librerie e le dipendenze in uso nell'ambiente di un'organizzazione.

Figura 15: Rilevamento della vulnerabilità CVE-2026-25049 OPSWAT

Come illustrato nella Figura 15, MetaDefender ha analizzato il file package.json contenente la dipendenza n8n e ha automaticamente classificato la vulnerabilità CVE-2026-25049 come "Critica", indicando l'intervallo di versioni interessate e le versioni corrette consigliate per la risoluzione. Ciò consente ai team di sicurezza di identificare rapidamente la vulnerabilità e stabilirne la priorità nell'intero panorama delle implementazioni.

OPSWAT è disponibile in MetaDefender e MetaDefender Software Chain™, consentendo ai team di sicurezza di:

  • Individua rapidamente i componenti vulnerabili - Identifica immediatamente le dipendenze open source interessate da vulnerabilità relative alla fuga dalla sandbox e all'esecuzione di codice, consentendo una rapida correzione o rimozione.
  • Garantire l'applicazione proattiva delle patch e degli aggiornamenti - Monitorare costantemente i componenti open source per individuare pacchetti obsoleti o non sicuri, consentendo aggiornamenti tempestivi e riducendo l'esposizione ai rischi.
  • Garantire la conformità e la rendicontazione - Rispettare i requisiti normativi, dato che i quadri normativi impongono sempre più la trasparenza nelle catene di fornitura del software.

Riferimenti

Rimanete aggiornati con OPSWAT!

Iscriviti oggi stesso per ricevere gli ultimi aggiornamenti sull'azienda, storie, informazioni sugli eventi e altro ancora.