🔍 CVE-2026-7820

6.5
CVSS Score
MEDIUM
2026-05-11
2026-10-26 18:10
✅ 완료

🇰🇷 한글 설명

pgAdmin 4의 인증 시도 횟수 제한(MAX_LOGIN_ATTEMPTS)이 커스텀 /authenticate/login 뷰에서만 적용되어, Flask-Security의 기본 /login 뷰를 통해 계정 잠금을 우회할 수 있습니다. 이로 인해 INTERNAL 인증 계정에 대한 무제한 온라인 비밀번호 대입 공격이 가능합니다. 9.15 이전 버전에 영향을 줍니다.

💡 쉬운 설명

pgAdmin은 비밀번호를 여러 번 틀리면 계정을 잠그는 기능이 있지만, 다른 로그인 경로에서는 이 잠금이 적용되지 않습니다. 공격자가 이 경로를 이용하면 계정이 잠긴 뒤에도 비밀번호를 계속 시도할 수 있습니다.

🇺🇸 원문 (English)

Improper restriction of excessive authentication attempts (CWE-307) in pgAdmin 4. pgAdmin enforces MAX_LOGIN_ATTEMPTS only inside its custom /authenticate/login view. Flask-Security's default /login view, which is registered automatically by security.init_app() and is reachable on every server, never consulted the User.locked field: pgAdmin's User model relied on Flask-Security's UserMixin.is_locked() (which always returns 'not locked') and Flask-Login's is_active (which only checks the active column, not locked). An attacker who triggered an account lockout via /authenticate/login could therefore obtain a session by re-submitting valid credentials directly to /login, defeating the brute-force-protection control for accounts using the INTERNAL authentication source. The same bypass also means that login attempts via /login are never rate-limited, so an attacker can perform an unbounded online password-guessing attack against INTERNAL accounts regardless of MAX_LOGIN_ATTEMPTS. Fix overrides User.is_active and User.is_locked() so the locked column is enforced on every authentication path. LDAP, OAuth2, Kerberos, and Webserver users are not reachable by this bypass because they have no local password and are rejected by Flask-Security's LoginForm.validate before the locked check; the lockout itself is also internal-only (the /authenticate/login view filters by auth_source=INTERNAL). This issue affects pgAdmin 4: before 9.15.

📍 영향받는 시스템

pgAdmin 4 9.15 미만 버전 (INTERNAL 인증 사용 환경)

⚔️ 공격 벡터

잠금 유발 후 /login 엔드포인트로 직접 자격증명을 재전송하거나, 해당 경로로 제한 없이 비밀번호를 대입하여 세션을 획득

🛡️ 대응 방법

pgAdmin 4를 9.15 이상으로 업그레이드하고, 업그레이드 전까지는 /login 경로를 네트워크 단에서 차단하거나 접근을 제한

🔧 검증 코드

출력된 버전이 9.15 미만이면 취약하므로 업그레이드가 필요하고, 9.15 이상이면 패치가 적용된 것입니다.

Shell / Script
pip show pgadmin4 2>/dev/null | grep -i version || dpkg -l pgadmin4 2>/dev/null | grep -E '^ii'

📊 CVSS Vector String

CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N

💻 영향받는 소프트웨어

Log Server