n8n хранит в памяти сведения о проекте, которому принадлежит рабочий процесс, и по ним проверяет права на таблицы данных. Подставной идентификатор рабочего процесса сбивает эту привязку, и проверка начинает пропускать любой проект. В результате участник с правом создавать и запускать рабочие процессы может просматривать, читать, изменять и удалять строки таблиц данных во всех проектах экземпляра. Затронуты установки, не обновлённые до версий с исправлением.
Подставной идентификатор рабочего процесса обходит проверку проекта
Рабочий процесс в n8n - это сценарий автоматизации, который запускается по расписанию или по событию. Таблицы данных служат хранилищем строк внутри экземпляра, а проекты разделяют рабочие процессы и их данные между командами. Кэш - область памяти, где продукт держит часто нужные значения, чтобы не пересчитывать их при каждом запросе. Причина уязвимости кроется именно в кэшировании владельца рабочего процесса. Идентификатор приходит от клиента, принимается без проверки и становится ключом, по которому в памяти запоминается проект.
Подобранное значение заставляет кэш вернуть некорректный проект. Проверка таблиц данных, построенная на этом значении, совпадает с любым проектом, поэтому ограничение по проекту перестаёт действовать. Атака идёт по сети, нужна учётная запись с низкими правами, участие пользователя не требуется, а сложность атаки низкая. Уровень по классификации вендора - High, числовой оценки в уведомлении GHSA-wvjj-qg37-pv73 нет. Сильнее всего затронута целостность данных, тогда как конфиденциальность и доступность вендор оценил ниже.
Администратор экземпляра для такой атаки не нужен. Достаточно роли участника, которой разрешено создавать и запускать рабочие процессы; обычно такая роль есть у сотрудников, настраивающих автоматизацию. Поэтому в установках с несколькими командами границы проектов перестают ограничивать доступ к строкам таблиц. Проверка выполняется на стороне сервера и не зависит от действий других пользователей.
Исправление вендор выпустил в версиях 2.44.1 и 2.43.5. Обновиться нужно до одной из них или до более поздней сборки той же ветки: уязвимы все сборки младше 2.44.1 в ветке 2.44 и младше 2.43.5 в ветке 2.43. Идентификатор CVE уязвимости не присвоен, категория слабости в уведомлении не указана, поэтому в подборках по номеру CVE проблему не найти. Об эксплуатации в реальных атаках сведений нет. Публикация уведомления означает раскрытие технических деталей, а не подтверждённые случаи в работающих системах.
Если обновление откладывается, вендор называет временные меры. Доступ к экземпляру ограничивают кругом полностью доверенных пользователей. Сохранённые рабочие процессы проверяют на служебное имя встроенного свойства объекта JavaScript в поле идентификатора, а найденные записи удаляют. Модуль таблиц данных отключают, если он не нужен. Все эти меры вендор считает краткосрочными, полностью устраняющих способов, кроме обновления, он не приводит.
Проверка рабочих процессов касается только уже сохранённых записей. Новый процесс с тем же значением идентификатора можно создать после неё, поэтому такая мера не заменяет обновление. Отключение таблиц данных убирает цель атаки, но вместе с ней лишает команды рабочего хранилища строк. Ограничение доступа сужает круг возможных участников, однако не исправляет логику проверки прав.
Значимость уязвимости в том, что она снимает разделение проектов, а не открывает одну запись. Для экземпляра с общими таблицами это означает возможность менять чужие строки без ведома владельцев. Обновление до 2.44.1 или 2.43.5 закрывает проблему, а до его установки разумно сузить круг пользователей, которым разрешено создавать рабочие процессы.