
Техническое исследование уязвимости CVE-2025-68613 в n8n, охватывающее затронутые версии, сценарий лабораторного исследования, анализ атак и защиты, а также стратегии смягчения последствий.
n8n — это платформа автоматизации рабочих процессов, используемая для интеграции систем и сервисов с помощью визуальных потоков и выражений JavaScript.
CVE-2025-68613 — это критическая уязвимость удаленного выполнения кода (RCE) с CVSS 9.9, затрагивающая несколько версий n8n. Ошибка возникает при обработке JavaScript-выражений в рабочих процессах в уязвимых версиях, которые не имеют надлежащей изоляции. Это позволяет аутентифицированным пользователям с правами на редактирование выполнять код за пределами ожидаемого поведения приложения.
На практике эту уязвимость можно использовать для выполнения команд на сервере, где работает n8n, используя привилегии самого приложения. Уязвимые версии варьируются от 0.211.0 до версий, предшествующих исправлениям, примененным в 1.120.4, 1.121.1 и 1.122.0.
Этот репозиторий документирует CVE-2025-68613 технически, охватывая контекст ошибки, уязвимые версии, эксплуатацию и рекомендуемые меры по смягчению последствий.

Рекомендуется немедленно обновиться до версии 1.122.0 или выше.
Для демонстрации уязвимости необходимы следующие условия:
Ошибка возникает во время создания и выполнения рабочих процессов, а не до аутентификации.
Первый шаг — войти в веб-интерфейс n8n с действительным пользователем.

Этот шаг подтверждает, что атака не является анонимной. Уязвимость требует аутентифицированного пользователя.
После входа в систему убедитесь, что у пользователя есть права на создание и редактирование рабочих процессов.

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

Здесь начинается легитимное использование функциональности n8n, которая в уязвимых версиях может быть использована для эксплуатации.
Первый узел, добавляемый в рабочий процесс, — это ручной триггер.

Что делает этот узел: Позволяет вручную запускать рабочий процесс, используется как отправная точка потока.
В данном сценарии он служит только точкой входа для выполнения рабочего процесса.
Второй добавляемый узел — Edit Fields (Set).

Что делает этот узел: Этот узел позволяет создавать, изменять или перезаписывать поля данных внутри рабочего процесса. Он принимает статические значения или JavaScript-выражения, вычисляемые во время выполнения.
Именно в этом месте проявляется уязвимость.
В поле значения узла Edit Fields (Set) вставьте JavaScript-выражение, заключенное в {{ }}, что является форматом, используемым n8n для вычисления динамических выражений.

Пример полезной нагрузки:
{{ (function(){
return this.process.mainModule
.require('child_process')
.execSync('id')
.toString()
})() }}
(function(){ ... })(): Определяет самовызывающуюся функцию, позволяя инкапсулировать всю логику и вернуть значение непосредственно в выражение рабочего процесса.this.process: Обращается к внутреннему объекту process Node.js, который предоставляет информацию и ресурсы времени выполнения.process.mainModule: Позволяет получить доступ к главному модулю приложения, что дает возможность загружать другие внутренние модули Node.js.require('child_process'): Встроенный модуль Node.js, позволяющий создавать новые процессы в операционной системе и выполнять внешние команды.execSync('id'): Выполняет команду непосредственно в операционной системе, где работает n8n, используя привилегии процесса приложения..toString(): Преобразует вывод выполненной команды в текст, позволяя отобразить результат в интерфейсе n8n.Отображаемый результат подтверждает, что команда была выполнена в операционной системе с использованием привилегий процесса n8n, что характеризует удаленное выполнение кода (RCE).
| Статус | Версия n8n | Примечание |
|---|
| ❌ Уязвимо | >= 0.211.0 | Введение уязвимого механизма |
| ❌ Уязвимо | < 1.120.4 | Уязвимо до исправления в ветке 1.120 |
| ❌ Уязвимо | < 1.121.1 | Уязвимо до исправления в ветке 1.121 |
| ❌ Уязвимо | < 1.122.0 | Уязвимо до исправления в ветке 1.122 |
| ✅ Исправлено | 1.120.4 | Официальное исправление применено |
| ✅ Исправлено | 1.121.1 | Официальное исправление применено |
| ✅ Исправлено | >= 1.122.0 | Исправление включено по умолчанию |