warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
N8n — популярная платформа для создания автоматизированных рабочих процессов (workflows). Пользователь, как в конструкторе, создает процесс, который потом платформа выполняет по расписанию или каким‑то другим триггерам. Например, парсит посты из десятков Telegram-каналов и репостит в собственный. Платформа поддерживает огромное количество интеграций. Особенно интересны интеграции с разными нейросетями.

Платформа используется не только в простых задачах, вроде обработки контента. Ты можешь развернуть n8n на своем сервере в корпоративной сети и повесить на него, например, автоматизацию документооборота, управление системой продаж и кучу других функций. С учетом массовых внедрений ИИ может оказаться, что скоринговая система в банке работает на n8n.
Для тестов скачай репозиторий: CVE-2026-21858 + CVE-2025-68613 — n8n Full Chain. Внутри уязвимый контейнер с n8n и эксплоит, который будем препарировать. В эксплоите автор реализовал комбинированную атаку с использованием двух критических уязвимостей n8n. С помощью CVE-2026-21858 эксплоит читает файлы на сервере, получает токены доступа. Используя CVE-2025-68613, получает полноценную Remote Code Execution.
CVE-2026-21858
Это критическая уязвимость в n8n, которая делает возможным произвольное чтение файлов на сервере (Arbitrary File Read). Рейтинг опасности по CVSS — 10.0. Уязвимость затрагивает версии от 1.65.0 до 1.120.x включительно. Исправлена в 1.121.0.
info
Не путай Local File Inclusion и Arbitrary File Read. Они схожи по своему смыслу и даже могут иметь очень похожую эксплуатацию, но это принципиально разные уязвимости. LFI — это включение файла. Например, в PHP файлы включаются через include или require, а значит, при чтении PHP-файла код выполнится. При Arbitrary File Read происходит чтение файла как есть, невзирая на вставки кода. Исполниться может только JavaScript, если ты эксплуатируешь уязвимость через браузер.
Уязвимость возникает, когда в n8n есть формы с загрузкой файлов. Атакующий может подделать запрос, подменив Content-Type с multipart/ на application/. Это приведет к тому, что функция парсинга parseRequestBody( запустит стандартный парсер parseBody( вместо parseFormDate(. Функция parseBody( слепо присваивает все тело запроса в req..
Следующее звено цепочки — библиотека Formidable. При нормальном поведении она должна подготовить JSON-объект для копирования файла во временное расположение. Но решение снова принимается на основе Content-Type, и снова application/ пропускает поддельный JSON напрямую.
После всех преобразований объект попадает в функцию copyBinaryFile(. Функция копирует временный файл. Читает его и возвращает данные в workflow. Рабочий процесс, в свою очередь, возвращает содержимое файла в необработанном виде в HTTP-ответе.
Пример атакующего запроса:
POST /form/vulnerable-form HTTP/1.1Host: localhost:5678Content-Type: application/jsonUser-Agent: Mozilla/5.0 (compatible; PoC)Accept: */*Content-Length: 248Connection: close{ "data": {}, "files": { "f-k9p2m7": { "filepath": "/etc/passwd", "originalFilename": "x7y8z9a1.bin", "mimetype": "application/octet-stream", "size": 45231 } }}Структура должна описывать загружаемый файл:
-
originalFilename— имя исходного файла. Укажи случайное значение; -
mimetypeуказывает на тип файла. Бинарные данные n8n не будет строго проверять; -
size— случайный размер файла в байтах. Ни на что не влияет; -
filepath— в оригинале это свойство заполняется функцией из библиотеки Formidable и должно выглядеть как‑то так:/.tmp/ upload_aaabbb2233. tmp
В тестовой машине n8n работает под root. Это значит, что ты можешь прочитать что угодно. В том числе конфиги самой n8n.
CVE-2025-68613
N8n до версии 1.121.0 содержит вторую критическую проблему, которая в цепочке с CVE-2026-21858 приводит к полноценной Remote Code Execution.
Суть проблемы — возможность подделать куку авторизации n8n-auth, если хакеру известен encryptionKey и данные администратора из базы. Кука — это обычный токен JWT, сгенерированный по известному алгоритму (продукт опенсорсный). Интересно, что для генерации JWT достаточно хеша пароля.
Сервер принимает JWT без серверной валидации состояния пользователя. В результате злоумышленник получает права администратора без знания реального пароля.

Проблема не в самой криптографии. Алгоритм HS256 корректен. Ошибка в архитектуре:
- Ключ подписи хранится локально в
~/..n8n/ config - База пользователей лежит рядом, в
~/..n8n/ database. sqlite - Подпись строится детерминированно на основе
encryptionKey,emailи bcrypt-хеша пароля.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
