Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAttacker discovers pgAdmin 4 instance
-
DeliveryIdentifies valid INTERNAL username
-
ExploitSubmits credentials to Flask-Security /login endpoint
-
ExecutionBypasses lockout mechanism
-
ImpactObtains valid session
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Brute-force prevention, rate limiting
|
| Exploitation Conditions | The vulnerability requires the following specific conditions: (1) pgAdmin 4 instance must be accessible over the network (AV:N confirmed by CVSS); (2) the target account must use INTERNAL authentication source (accounts with LDAP, OAuth2, Kerberos, or Webserver authentication are protected); (3) the attacker must know or guess a valid username for an INTERNAL account; (4) the Flask-Security /login endpoint must be reachable from the attacker's network position (no authentication or special privileges required). No user interaction is required and the attack succeeds against default configurations. The vulnerability does NOT require: account pre-lockout (attackers can perform unbounded guessing without triggering lockout first), non-default MAX_LOGIN_ATTEMPTS settings (the bypass works regardless of the configured threshold), or authentication credentials for other accounts. Organizations using only centralized authentication (LDAP, OAuth2, Kerberos, Webserver) with no INTERNAL accounts have zero exploitable surface. |
| Impact | CVSS 6.5 with network vector (AV:N/AC:L/PR:N/UI:N) indicates remote unauthenticated exploitation with low complexity and no user interaction required. The vulnerability provides two distinct attack paths: (1) credential enumeration via lockout bypass for accounts previously locked by brute-force attempts, and (2) unbounded password guessing against any INTERNAL account without rate-limiting or account lockout consequences. The impact is limited to confidentiality and integrity (C:L/I:L) with no availability impact, as attackers can gain unauthorized session access but cannot directly cause service disruption. No EPSS score or KEV status is provided, so exploitation probability cannot be independently assessed; however, the straightforward attack vector (sending HTTP requests to an unauthenticated endpoint) and low technical complexity suggest practical exploitability. The limitation to INTERNAL authentication sources reduces the real-world risk surface in organizations using centralized identity systems (LDAP, OAuth2, Kerberos), but any pgAdmin instance with local user accounts faces direct risk. The fact that this bypasses a known security control (MAX_LOGIN_ATTEMPTS) elevates priority despite the moderate CVSS score. |
| Exploit ScenarioDerived | An attacker discovers a pgAdmin 4 instance and identifies a valid username through information disclosure or enumeration. The attacker submits invalid credentials multiple times to /authenticate/login, triggering the account lockout by exceeding MAX_LOGIN_ATTEMPTS. However, instead of giving up, the attacker then bypasses the lockout by submitting the same valid credentials directly to Flask-Security's /login endpoint, obtaining a valid session without triggering the lockout mechanism. Alternatively, an attacker can skip the lockout trigger entirely and perform continuous password-guessing against /login with no rate-limiting or lockout consequences, eventually recovering credentials through brute force. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – May 11, 2026
pgAdmin 4 before version 9.15 allows unauthenticated attackers to bypass account lockout and perform unbounded password-guessing attacks against INTERNAL authentication accounts by exploiting Flask-Security's default /login endpoint, which does not enforce the locked column that the custom /authenticate/login view relies on for brute-force protection. The vulnerability affects only accounts using pgAdmin's INTERNAL authentication source; LDAP, OAuth2, Kerberos, and Webserver authentication methods are not vulnerable because they do not use local passwords.
RemediationAI
Upgrade pgAdmin 4 to version 9.15 or later, which overrides User.is_active and User.is_locked() methods to enforce the locked column on all authentication paths including Flask-Security's default /login endpoint. This patch ensures that MAX_LOGIN_ATTEMPTS lockouts are enforced uniformly regardless of which endpoint an attacker targets. Organizations unable to patch immediately should implement network-level rate-limiting on the /login endpoint using a reverse proxy or Web Application Firewall to prevent unbounded password-guessing attacks. Additionally, review and minimize the use of INTERNAL authentication for non-administrative accounts; prefer centralized authentication systems (LDAP, Kerberos, OAuth2) where feasible, as those authentication sources are not vulnerable to this bypass. The rate-limiting mitigation has a trade-off of increased operational complexity and potential for legitimate user lockout if thresholds are set too aggressively.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in pypi, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
pgAdmin 4 implements account lockout via the MAX_LOGIN_ATTEMPTS setting, enforced only in a custom /authenticate/login view that checks the User.locked column. However, pgAdmin's User model inherits from Flask-Security's UserMixin and Flask-Login's UserMixin, both of which have authentication checks that do not consult the locked column. Specifically, Flask-Security's default /login view (automatically registered by security.init_app()) uses only Flask-Security's is_locked() method (which always returns False due to pgAdmin's User model override) and Flask-Login's is_active check (which only examines the active column). This architectural flaw in the authentication framework allows attackers to bypass the lockout mechanism by submitting valid credentials to the unprotected Flask-Security endpoint instead of pgAdmin's custom endpoint. The CWE-307 classification correctly identifies this as improper restriction of excessive authentication attempts. The INTERNAL authentication source stores passwords locally in pgAdmin's database, making it vulnerable to online brute-force attacks; other authentication methods (LDAP, OAuth2, Kerberos, Webserver) delegate credential validation to external systems and do not store passwords in pgAdmin, thus are not affected.
Know when Pgadmin 4 gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
Primary rating from Vendor (PostgreSQL).
CVSS VectorVendor: PostgreSQL
Lifecycle Timeline
3DescriptionCVE.org
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.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
pgAdmin <= 8.3 is affected by a path-traversal vulnerability while deserializing users’ sessions in the session handling
pgAdmin <= 8.4 is affected by a Remote Code Execution (RCE) vulnerability through the validate binary path API. Rated cr
Remote unauthenticated access to two SQL Editor endpoints in pgAdmin 4 server-mode deployments (versions 6.9 through 9.1
The pgAdmin server includes an HTTP API that is intended to be used to validate the path a user selects to external Post
pgAdmin versions 8.11 and earlier are vulnerable to a security flaw in OAuth2 authentication. Rated medium severity (CVS
Remote code execution in pgAdmin 4 (versions up to and including 9.9) lets an attacker who can get a crafted PLAIN-forma
Remote SQL injection via prompt injection in pgAdmin 4 versions 9.13 through 9.15 allows attackers who can write content
SQL injection sandbox escape in pgAdmin 4's AI Assistant (versions 9.13 through 9.16) lets an attacker break out of the
OS command injection in pgAdmin 4 (all versions before 9.18) lets an authenticated user with the commonly-granted tools_
Authorization bypass and privilege escalation in pgAdmin 4 server mode allows authenticated users to access other users'
pgAdmin <= 8.5 is affected by XSS vulnerability in /settings/store API response json payload. Rated medium severity (CVS
Same technique Authentication Bypass
View allVendor StatusVendor
SUSE
Severity: Medium| Product | Status |
|---|---|
| SUSE Linux Enterprise Desktop 15 SP7 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP7 | Fixed |
| SUSE Linux Enterprise Module for Python 3 15 SP7 | Fixed |
| SUSE Linux Enterprise Server 15 SP7 | Fixed |
| SUSE Linux Enterprise Server for SAP Applications 15 SP7 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP4 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP4-LTSS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP5 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP5-LTSS | Fixed |
| SUSE Linux Enterprise Module for Python 3 15 SP6 | Fixed |
| SUSE Linux Enterprise Module for Server Applications 15 SP4 | Fixed |
| SUSE Linux Enterprise Module for Server Applications 15 SP5 | Fixed |
| SUSE Linux Enterprise Server 15 SP4 | Fixed |
| SUSE Linux Enterprise Server 15 SP4-LTSS | Fixed |
| SUSE Linux Enterprise Server 15 SP5 | Fixed |
| SUSE Linux Enterprise Server 15 SP5-LTSS | Fixed |
| SUSE Linux Enterprise Server 15 SP6 | Fixed |
| SUSE Linux Enterprise Server 15 SP6-LTSS | Fixed |
| SUSE Linux Enterprise Server for SAP Applications 15 SP6 | Fixed |
| SUSE Manager Proxy 4.3 | Fixed |
| SUSE Manager Proxy LTS 4.3 | Fixed |
| SUSE Manager Retail Branch Server 4.3 | Fixed |
| SUSE Manager Retail Branch Server LTS 4.3 | Fixed |
| SUSE Manager Server 4.3 | Fixed |
| SUSE Manager Server LTS 4.3 | Fixed |
| SUSE CaaS Platform 4.0 | Fixed |
| SUSE Enterprise Storage 6 | Fixed |
| SUSE Enterprise Storage 7 | Fixed |
| SUSE Enterprise Storage 7.1 | Fixed |
| SUSE Linux Enterprise Desktop 15 SP6 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP1 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP1-ESPOS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP1-LTSS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP2 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP2-ESPOS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP2-LTSS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP3 | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP3-ESPOS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP3-LTSS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP4-ESPOS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP5-ESPOS | Fixed |
| SUSE Linux Enterprise High Performance Computing 15 SP6 | Fixed |
| SUSE Linux Enterprise Module for Server Applications 15 SP1 | Fixed |
| SUSE Linux Enterprise Module for Server Applications 15 SP2 | Fixed |
| SUSE Linux Enterprise Module for Server Applications 15 SP3 | Fixed |
| SUSE Linux Enterprise Real Time 15 SP2 | Fixed |
| SUSE Linux Enterprise Real Time 15 SP3 | Fixed |
| SUSE Linux Enterprise Real Time 15 SP4 | Fixed |
| SUSE Linux Enterprise Server 15 SP1 | Fixed |
| SUSE Linux Enterprise Server 15 SP1-BCL | Fixed |
| SUSE Linux Enterprise Server 15 SP1-LTSS | Fixed |
| SUSE Linux Enterprise Server 15 SP2 | Fixed |
| SUSE Linux Enterprise Server 15 SP2-BCL | Fixed |
| SUSE Linux Enterprise Server 15 SP2-LTSS | Fixed |
| SUSE Linux Enterprise Server 15 SP3 | Fixed |
| SUSE Linux Enterprise Server 15 SP3-BCL | Fixed |
| SUSE Linux Enterprise Server 15 SP3-LTSS | Fixed |
| SUSE Linux Enterprise Server for SAP Applications 15 SP1 | Fixed |
| SUSE Linux Enterprise Server for SAP Applications 15 SP2 | Fixed |
| SUSE Linux Enterprise Server for SAP Applications 15 SP3 | Fixed |
| SUSE Linux Enterprise Server for SAP Applications 15 SP4 | Fixed |
| SUSE Linux Enterprise Server for SAP Applications 15 SP5 | Fixed |
| SUSE Manager Proxy 4.0 | Fixed |
| SUSE Manager Proxy 4.1 | Fixed |
| SUSE Manager Proxy 4.2 | Fixed |
| SUSE Manager Retail Branch Server 4.0 | Fixed |
| SUSE Manager Retail Branch Server 4.1 | Fixed |
| SUSE Manager Retail Branch Server 4.2 | Fixed |
| SUSE Manager Server 4.0 | Fixed |
| SUSE Manager Server 4.1 | Fixed |
| SUSE Manager Server 4.2 | Fixed |
| openSUSE Leap 15.3 | Fixed |
| openSUSE Leap 15.4 | Fixed |
| openSUSE Leap 15.5 | Fixed |
EUVD-2026-29088
GHSA-hv9p-2pqf-r5w3
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB