Две ошиб­ки в логике n8n прев­раща­ются в пол­ноцен­ную цепоч­ку ком­про­мета­ции. Пер­вая дает чте­ние любых фай­лов на сер­вере. Вто­рая поз­воля­ет под­делать JWT адми­нис­тра­тора. Соеди­нив их, получа­ем экс­пло­ит, который в нес­коль­ко зап­росов зах­ватыва­ет сер­вер и выпол­няет про­изволь­ные коман­ды.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

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

Пример Workflow n8n
При­мер Workflow n8n

Плат­форма исполь­зует­ся не толь­ко в прос­тых задачах, вро­де обра­бот­ки кон­тента. Ты можешь раз­вернуть 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/form-data на application/json. Это при­ведет к тому, что фун­кция пар­синга parseRequestBody() запус­тит стан­дар­тный пар­сер parseBody() вмес­то parseFormDate(). Фун­кция parseBody() сле­по прис­ваивает все тело зап­роса в req.body.

Сле­дующее зве­но цепоч­ки — биб­лиоте­ка Formidable. При нор­маль­ном поведе­нии она дол­жна под­готовить JSON-объ­ект для копиро­вания фай­ла во вре­мен­ное рас­положе­ние. Но решение сно­ва при­нима­ется на осно­ве Content-Type, и сно­ва application/json про­пус­кает под­дель­ный JSON нап­рямую.

Пос­ле всех пре­обра­зова­ний объ­ект попада­ет в фун­кцию copyBinaryFile(). Фун­кция копиру­ет вре­мен­ный файл. Чита­ет его и воз­вра­щает дан­ные в workflow. Рабочий про­цесс, в свою оче­редь, воз­вра­щает содер­жимое фай­ла в необ­работан­ном виде в HTTP-отве­те.

При­мер ата­кующе­го зап­роса:

POST /form/vulnerable-form HTTP/1.1
Host: localhost:5678
Content-Type: application/json
User-Agent: Mozilla/5.0 (compatible; PoC)
Accept: */*
Content-Length: 248
Connection: 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 кор­ректен. Ошиб­ка в архи­тек­туре:

  1. Ключ под­писи хра­нит­ся локаль­но в ~/.n8n/config.
  2. Ба­за поль­зовате­лей лежит рядом, в ~/.n8n/database.sqlite.
  3. Под­пись стро­ится детер­миниро­ван­но на осно­ве encryptionKey, email и bcrypt-хеша пароля.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии