Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-44789-n8n-PrototypePollution-RCE — CVE-2026-44789 — n8n <1.123.43 Загрязнение прототипа пагинации HTTP-запроса до RCE (гаджет NODE_OPTIONS runner-spawn). Лаборатория + автоматизированный PoC, проверено e2e. | Kitploit
Инструменты/GitHubGitHub/biitts/cve-2026-44789-n8n-prototypepollution-rce
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеРазработка Полезной НагрузкиЛаборатории и Практика

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
biitts/cve-2026-44789-n8n-prototypepollution-rce

CVE-2026-44789-n8n-PrototypePollution-RCE

CVE-2026-44789 — n8n <1.123.43 Загрязнение прототипа пагинации HTTP-запроса до RCE (гаджет NODE_OPTIONS runner-spawn). Лаборатория + автоматизированный PoC, проверено e2e.

Репозиторий
1 месяц назадЕщё не проверено

CVE-2026-44789 — Прототип-поллюция через пагинацию узла HTTP Request в n8n → RCE

Аутентифицированный создатель рабочего процесса n8n < 1.123.43 загрязняет Object.prototype внутри серверного процесса n8n через настройки пагинации узла HTTP Request, а затем повышает привилегии до удаленного выполнения кода, злоупотребляя тем, как n8n запускает свой исполнитель задач — передавая загрязненный NODE_OPTIONS в дочерний процесс node и обходя песочницу узла Code.

CVECVE-2026-44789
КонсультацияGHSA-c8xv-5998-g76h
Затронутые версии< 1.123.43, 2.0.0-rc.0 … < 2.20.7, 2.21.0 … < 2.22.1
Исправлено1.123.43 / 2.20.7 / 2.22.1
КлассCWE-1321 (Прототип-поллюция) → CWE-94 (RCE)
CVSS9.4 (CVSS 4.0) / Критический
АутентификацияТребуется аутентификация (права на создание/изменение рабочего процесса)
СтатусПОДТВЕРЖДЕНО — полная цепочка воспроизведена end-to-end на n8nio/n8n:1.123.42

Публичное уведомление сообщает только о том, что загрязнение «в сочетании с другими методами может привести к RCE» — оно не раскрывает гаджет. Этот репозиторий документирует и автоматизирует конкретную, проверенную цепочку от прототип-поллюции до RCE.


1. Примитив загрязнения

packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts, режим пагинации updateAParameterInEachRequest:

root@kitploit:~
paginationData.request[parameter.type]![parameterName] = parameterValue;

parameter.type, parameterName и parameterValue берутся из JSON рабочего процесса (подконтрольны атакующему). При parameter.type = "__proto__" paginationData.request["__proto__"] разрешается в Object.prototype, поэтому присваивание записывает Object.prototype[parameterName] = parameterValue — глобальная прототип-поллюция в серверном процессе n8n.

Исправление использует Object.create(null) для paginationData.request, так что ["__proto__"] становится обычным (с null-прототипом) ключом, а не прототипом.

2. Гаджет RCE

packages/cli/src/task-runners/task-runner-process-js.ts запускает исполнитель задач JS:

root@kitploit:~
return spawn('node', [...flags, startScript], { env: this.getProcessEnvVars(...) });

Node.js в normalizeSpawnArguments строит окружение дочернего процесса с помощью for (const key in env), который перечисляет унаследованные перечисляемые свойства. Загрязнение Object.prototype.NODE_OPTIONS = "--require=/path/evil.js" таким образом попадает в окружение запущенного исполнителя. Дочерний процесс — это node, который уважает NODE_OPTIONS, поэтому при запуске он --require-ит файл атакующего → выполнение кода вне песочницы узла Code, от имени пользователя службы n8n.

Исполнитель запускается при старте, но его жизненный цикл перезапускает его при каждом завершении процесса (onProcessExit → start()). Атакующий вынуждает перезапуск после загрязнения, зависая исполнителя с помощью узла Code (тайм-аут задачи или OOM убивают его).

3. Полная цепочка (что делает exploit.py)

root@kitploit:~
1. записать /tmp/evil.js                  через узлы Set → Convert to File → Read/Write Files
2. завесить исполнитель задач             через узел Code ( while(true){} )   [ДО загрязнения]
3. загрязнить Object.prototype.NODE_OPTIONS через узел HTTP Request ( type="__proto__" )
4. зависший исполнитель по тайм-ауту → основной процесс перезапускает 'node' → наследует NODE_OPTIONS
   → require('/tmp/evil.js') → RCE

Порядок важен: загрязнение делает NODE_OPTIONS перечисляемым собственным ключом на Object.prototype, что приводит к ошибкам в слое TypeORM n8n (for…in по сущностям), нарушая сохранение рабочего процесса. Поэтому исполнитель должен быть уже зависшим до загрязнения; перезапуск затем подхватывает загрязненное окружение.

4. Воспроизведение

Область конфигурации (прочитайте сначала). Примитив прототип-поллюции срабатывает в любой затронутой версии без изменений конфигурации. Гаджет RCE требует исполнитель задач, который достигается по-разному в зависимости от ветки:

  • n8n 2.x затронутые (2.0.0–2.20.6, 2.21.0–2.22.0): исполнители задач включены по умолчанию/обязательны (N8N_RUNNERS_ENABLED устарел → SAFE_TO_REMOVE), так что полная цепочка RCE — это конфигурация по умолчанию.
  • n8n 1.123.x затронутые (этот лабораторный образ): исполнители задач по умолчанию выключены, поэтому в лаборатории устанавливается N8N_RUNNERS_ENABLED=true для имитации настроек 2.x по умолчанию. N8N_RUNNERS_TASK_TIMEOUT установлен низким только для ускорения перезапуска зависшего исполнителя — он не требуется для ошибки.
root@kitploit:~
docker compose -f lab/docker-compose.yml up -d        # n8nio/n8n:1.123.42, исполнители включены для имитации 2.x

python3 exploit.py http://127.0.0.1:5678 -c "id; hostname"

# вывод команды появляется на хосте n8n:
docker compose -f lab/docker-compose.yml exec n8n cat /tmp/n8n_rce_proof
#   RCE uid=1000(node) gid=1000(node) groups=1000(node)
#   <hostname>

exploit.py использует только стандартную библиотеку Python и управляет REST API n8n end-to-end (установка владельца/вход → развертывание рабочих процессов → запуск цепочки).

Наблюдаемый вывод:

root@kitploit:~
[*] step 1: wrote --require payload to /tmp/evil.js (via Read/Write Files node)
[*] step 2: dispatched a hanging task -> runner is now busy
[*] step 3: polluted Object.prototype.NODE_OPTIONS = --require=/tmp/evil.js
[*] waiting for the hung runner to time out, be respawned, and inherit NODE_OPTIONS ...
RCE uid=1000(node) gid=1000(node) groups=1000(node),1000(node)

uid=1000(node) — это учетная запись службы исполнителя, а вывод — живое состояние id/uname — реальное выполнение, а не эхо ввода.

5. Влияние

Любой аутентифицированный пользователь, который может создавать или изменять рабочий процесс, получает выполнение команд ОС на хосте n8n, обходя песочницу Code-узла — полная компрометация сервера автоматизации и всех учетных данных/систем, к которым он имеет доступ.

6. Устранение

  • Обновитесь до n8n ≥ 1.123.43 / 2.20.7 / 2.22.1 (объект пагинации строится с Object.create(null), что предотвращает запись через __proto__).
  • Защита в глубину: ограничьте создание/изменение рабочих процессов доверенными пользователями; исполнитель уже защищен с помощью --disable-proto=delete / --disallow-code-generation-from-strings, но они защищают исполнителя, а не основной процесс, где происходит загрязнение.

7. Обнаружение

Отмечайте рабочие процессы, в параметрах пагинации HTTP Request которых используются значения type равные __proto__ / constructor / prototype, а также появление NODE_OPTIONS в виде ошибки свойства сущности в логах n8n/TypeORM.

См. ANALYSIS.md для примитива, поведения окружения Node for…in, жизненного цикла исполнителя и патча.


  • Автор: Caio Fabrício — github.com/BiiTts
  • Заслуга в обнаружении уязвимости принадлежит первоначальному репортеру / уведомлению поставщика; цепочка гаджетов поллюция→RCE здесь является независимым исследованием. Только для авторизованного тестирования безопасности.
Скачать инструмент