Étude technique de la vulnérabilité CVE-2025-68613 dans n8n, couvrant les versions affectées, un scénario d'exploration en laboratoire, une analyse offensive et défensive, ainsi que les stratégies d'atténuation.
n8n est une plateforme d'automatisation de workflows utilisée pour intégrer des systèmes et des services via des flux visuels et des expressions JavaScript.
CVE-2025-68613 est une vulnérabilité critique d'exécution de code à distance (RCE), avec un score CVSS de 9.9, affectant plusieurs versions de n8n. La faille se produit dans le traitement des expressions JavaScript dans les workflows des versions vulnérables qui ne sont pas correctement isolées. Cela permet à des utilisateurs authentifiés disposant de permissions d'édition d'exécuter du code en dehors du comportement attendu de l'application.
En pratique, cette faille peut être exploitée pour exécuter des commandes sur le serveur où n8n est en cours d'exécution, en utilisant les privilèges de l'application elle-même. Les versions affectées vont de 0.211.0 jusqu'aux versions antérieures aux correctifs appliqués dans 1.120.4, 1.121.1 et 1.122.0.
Ce dépôt documente techniquement CVE-2025-68613, couvrant le contexte de la faille, les versions affectées, l'exploitation et les mesures d'atténuation recommandées.

| Statut | Version n8n | Remarque |
|---|---|---|
| ❌ Affectée | >= 0.211.0 | Introduction du mécanisme vulnérable |
| ❌ Affectée | < 1.120.4 | Vulnérable jusqu'au correctif dans la branche 1.120 |
| ❌ Affectée | < 1.121.1 | Vulnérable jusqu'au correctif dans la branche 1.121 |
| ❌ Affectée | < 1.122.0 | Vulnérable jusqu'au correctif dans la branche 1.122 |
| ✅ Corrigée | 1.120.4 | Correctif officiel appliqué |
| ✅ Corrigée | 1.121.1 | Correctif officiel appliqué |
| ✅ Corrigée | >= 1.122.0 | Correctif intégré par défaut |
Il est recommandé de mettre à jour immédiatement vers la version 1.122.0 ou supérieure.
Pour démontrer la vulnérabilité, les conditions suivantes sont requises :
La faille se produit lors de la création et de l'exécution de workflows, et non avant l'authentification.
La première étape consiste à se connecter à l'interface web n8n avec un utilisateur valide.

Cette étape confirme que l'attaque n'est pas anonyme. La vulnérabilité nécessite un utilisateur authentifié.
Après la connexion, vérifiez que l'utilisateur dispose des permissions pour créer et éditer des workflows.

Cela est pertinent car seuls les utilisateurs disposant de ce niveau d'accès peuvent insérer des expressions dynamiques dans les workflows.
Avec l'utilisateur authentifié, créez un nouveau workflow à partir de zéro.

C'est ici que commence l'utilisation légitime de la fonctionnalité n8n qui, dans les versions vulnérables, peut être exploitée.
Le premier nœud ajouté au workflow est le Manual Trigger.

Ce que fait ce nœud : Permet l'exécution manuelle du workflow, utilisé comme point de départ du flux.
Dans ce scénario, il sert uniquement de point d'entrée pour l'exécution du workflow.
Le deuxième nœud ajouté est le Edit Fields (Set).

Ce que fait ce nœud : Ce nœud permet de créer, modifier ou écraser des champs de données au sein du workflow. Il accepte des valeurs statiques ou des expressions JavaScript évaluées au moment de l'exécution.
C'est précisément à ce stade que la vulnérabilité se manifeste.
Dans le champ de valeur du nœud Edit Fields (Set), insérez une expression JavaScript entourée de {{ }}, qui est le format utilisé par n8n pour évaluer les expressions dynamiques.

Exemple de payload :
{{ (function(){
return this.process.mainModule
.require('child_process')
.execSync('id')
.toString()
})() }}
(function(){ ... })() : Définit une fonction auto-invoquée, permettant d'encapsuler toute la logique et de retourner directement une valeur à l'expression du workflow.this.process : Accède à l'objet interne process de Node.js, qui expose des informations et des ressources d'exécution.process.mainModule : Permet d'accéder au module principal de l'application, permettant le chargement d'autres modules internes de Node.js.require('child_process') : Module natif de Node.js qui permet de créer de nouveaux processus sur le système d'exploitation et d'exécuter des commandes externes.execSync('id') : Exécute une commande directement sur le système d'exploitation où n8n est en cours d'exécution, en utilisant les privilèges du processus de l'application..toString() : Convertit la sortie de la commande exécutée en texte, permettant d'afficher le résultat dans l'interface n8n.Le résultat affiché confirme que la commande a été exécutée sur le système d'exploitation en utilisant les privilèges du processus n8n, caractérisant une exécution de code à distance (RCE).