Спред-оператор переписал chatId: одна строка во Flowise отдала чужие диалоги
Разбор CVE-2026-69258: в конце объектного литерала flowConfig стоит ...incomingInput.overrideConfig, и всё, что пришло в теле запроса, перекрывает поля выше — включая идентичность разговора. Нужная проверка apiOverrideStatus в файле есть, но лежит двадцатью строками ниже и на этот путь не распространяется. Читать стоит не ради Flowise: «переопределение параметров запроса» есть в любом оркестраторе, и пишет оно в тот же объект, где хранится сессия.
- Неаутентифицированный POST на /api/v1/prediction/:id подменяет chatId и открывает чужую переписку; перечислить цели помогает GET /api/v1/public-chatflows.
- Через chatHistory модели подсовывают выдуманное прошлое. С моделью не спорят — ей просто выдают другую историю.
- Приёмник — резолвер шаблонов {{$flow.*}} на lodash get, поэтому вложенные ключи адресуются на любой глубине.
- CVSS 4.0 — 8,8. Версии по 3.1.2 включительно уязвимы, починено в 3.1.3: PR #6279, коммит 23b997e, спред заменён на pick по списку разрешённых полей.
- Дыра: приведённый в статье grep ищет пять конкретных имён переменных и не ловит ...userInput — тот самый случай, что вынесен в заголовок. Список надо расширять руками, иначе получите ложное «чисто».
- Пройтись по своему TS-сервису: grep -rnE '\.\.\.[A-Za-z_$][A-Za-z0-9_$.]*' --include='*.ts' src/ и отобрать спреды, куда попадает тело запроса.
- Вторым проходом найти шлюзы (apiOverrideStatus|allowOverride|canOverride) и сверить два списка по файлу и строке.
- Над каждым неприкрытым спредом прочитать объявленные ключи: нашли chatId, sessionId, userId — заменить на явный pick(input, ALLOWED).
- Метрика: ни одного спреда из тела запроса без списка разрешённых полей рядом.