
PoC: changedetection.io — слепое слияние настроек, массовое присваивание (CVE-2026-71204, Средний 6.3)
Продукт: dgtlmoon/changedetection.io — v0.55.7
Файлы: changedetectionio/blueprint/settings/__init__.py, changedetectionio/forms.py
CWE: CWE-284 — Некорректное управление доступом
CVSS 3.1: AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:L — 6.3 (Средний)
CNA: Turan Security · запись CVE
Обработчик сохранения /settings в changedetection.io формирует словарь обновлений из
form.data['application'] и вслепую объединяет его с сохранёнными настройками приложения через
.update(). Поскольку HTML-флажки появляются в отправляемых данных формы только в отмеченном состоянии,
специально сформированный POST-запрос, который просто опускает значимое для безопасности поле флажка
(например, то, которое обеспечивает требование API-ключа), на уровне обработчика неотличим
от ситуации, когда пользователь снял этот флажок в интерфейсе — слепой .update() незаметно
отключает эту настройку.
Запрос, который никогда явно не устанавливает api_access_token_enabled (или аналогичный параметр)
в false — а просто не включает это поле в тело POST — приводит к тому, что настройки приложения
объединяются с фактически отключённой защитой, без какого-либо явного шага подтверждения
или сигнала аудита, отличающего «пользователь снял флажок» от «поле не было отправлено».
/settings./settings,
полностью опустив поле api_access_token_enabled (или любое другое защищённое логическое поле, которое тестируется)
из тела запроса, включив при этом только несвязанные поля:
POST /settings HTTP/1.1
Content-Type: application/x-www-form-urlencoded
application-some_other_field=value
form.data['application'] → .update() в обработчике сохранения настроек
воспринимает отсутствующее поле так же, как явное «выключено», незаметно отключая защиту,
при этом пользователь (или аудитор, просматривающий запрос) не видит явного сигнала о выключении.Использование слепого .update() словаря на основе необработанных данных формы приводит к смешению
«отсутствующего в POST поля» с «явно установленным в false» для настроек на основе флажков —
HTML-формы никогда не отправляют неотмеченные флажки, поэтому такой подход небезопасен для любых
полей настроек, влияющих на безопасность.
Явно перечисляйте ожидаемые логические поля настроек и для отсутствующих подставляйте их текущее
сохранённое значение (а не False), либо используйте библиотеку форм, которая различает «не отправлено»
и «отправлено как неотмеченное» и явно проверяет значимые для безопасности переключатели, а не выполняет
слепое объединение словарей.