Étude technique de la vulnérabilité CVE-2025-68613 dans n8n, couvrant les versions concernées, un scénario d'exploration en laboratoire, une analyse offensive et défensive, ainsi que des 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 CVSS 9.9, affectant plusieurs versions de n8n. Le défaut se produit lors du traitement des expressions JavaScript dans les workflows des versions vulnérables qui ne sont pas correctement isolées. Cela permet aux utilisateurs authentifiés disposant d'autorisations de modification d'exécuter du code en dehors du comportement attendu de l'application.
En pratique, ce défaut peut être exploité 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 CVE-2025-68613 techniquement, couvrant le contexte du défaut, les versions affectées, l'exploitation et les mesures d'atténuation recommandées.

| Statut | Version n8n | Note |
|---|---|---|
| ❌ 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 :
Le défaut se produit lors de la création et de l'exécution des workflows, pas 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 connexion, vérifiez que l'utilisateur a les autorisations pour créer et modifier des workflows.

Ceci est pertinent car seuls les utilisateurs avec 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.

Ici commence l'utilisation légitime des fonctionnalités n8n qui, dans les versions vulnérables, peuvent être exploitées.
Le premier nœud ajouté au workflow est le déclencheur manuel.

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 nœud Edit Fields (Set).

Ce que fait ce nœud : Ce nœud permet de créer, modifier ou écraser des champs de données dans le 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 valeur du nœud Edit Fields (Set), insérez une expression JavaScript encadrée par {{ }}, qui est le format utilisé par n8n pour évaluer les expressions dynamiques.

Exemple de charge utile :
{{ (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 process interne de Node.js, qui expose les informations et ressources d'exécution.process.mainModule : Permet d'accéder au module principal de l'application, permettant de charger 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 au résultat d'être affiché 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).