Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach server-mode pgAdmin login page
-
DeliveryPost guesses to Flask-Security /login or case-variant username
-
ExploitBypass MAX_LOGIN_ATTEMPTS lockout
-
ExecutionBrute-force internal administrator password
-
PersistAuthenticate as administrator
-
ImpactAccess managed database servers and saved credentials
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Brute-force prevention, rate limiting
|
| Exploitation Conditions | pgAdmin 4 must run in server (web) mode using internal authentication with the default MAX_LOGIN_ATTEMPTS limit (3); desktop mode is explicitly not affected. Any one of several concrete prerequisites enables the bypass: reachability of Flask-Security's separately registered /login, /verify, /change or /reset views; supplying the target internal username in a different letter case than stored (the lock is looked up by exact username while the form matches email case-insensitively); or a deployment that also configures LDAP or webserver authentication (a wrong internal password is never counted) or Kerberos/webserver authentication (a guess can be answered without being counted). Related impacts require shared email addresses across auth sources (cross-source password reset) or a non-admin user whose email matches an administrator's (About-box server-config disclosure). The principal limiting factor is that the flaw only removes rate limiting - it does not reveal credentials, so compromise still depends on successfully brute-forcing a guessable password against an existing internal account. |
| Impact | This is a genuine high-priority issue, not a high-score-but-low-risk artifact. The input CVSS 4.0 vector is AV:N/AC:H/AT:P/PR:N/UI:N with VC:H/VI:H/VA:H (score 9.2), and the vuln.today decision label is act_now, so the urgency signals and the network/unauthenticated reach (AV:N, PR:N, UI:N) agree that this warrants prompt remediation. The practical mechanism is low-effort - the patch shows multiple independent ways to bypass the lockout (posting directly to Flask-Security's own /login, /verify, /change and /reset views; typing the internal username in a different letter case so the lock lookup misses; or relying on a coexisting LDAP/webserver/Kerberos source so a wrong internal password is never counted) - so the AC:H/AT:P metrics do NOT reflect a hard-to-reach bug; they instead reflect that the flaw removes the brute-force rate limit rather than directly yielding credentials. Success still depends on guessing the password, which is the attack requirement (AT:P) and the main real-world limiter. No CISA KEV listing is present in the input (so this is not confirmed actively exploited), and no EPSS probability was supplied, so widespread-exploitation likelihood cannot be quantified from the data given. The confirmed worst case is full takeover of a server-mode pgAdmin administrator account, which exposes the saved connection credentials for managed PostgreSQL servers - hence the uniformly High impact rating is credible. |
| Exploit ScenarioDerived | An attacker who can reach a server-mode pgAdmin 4 web login submits unlimited password guesses against the administrator's internal account - for example by posting to Flask-Security's own /login view, or by sending the admin username in a different letter case - neither of which increments pgAdmin's failed-login counter or trips the default 3-attempt lock. Once a guess succeeds, the attacker logs in as administrator and gains access to the configured database-server connections and their saved passwords. No public exploit identified at time of analysis; the only referenced artifacts are the fix commits and tracking issue. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
pgAdmin 4 server mode can be forced into unlimited password guessing against internal accounts, including the administrator's, because the three-attempt lockout is not applied consistently across every login path. The bypass is reachable by unauthenticated remote attackers (CVSS v4.0 score 9.2, PR:N) but still depends on guessing a valid password for an existing internal account; the independent assessment rates it CVSS 3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H and assigns an act_now priority. No public exploit identified at time of analysis.
RemediationAI
Vendor-released patch: 9.19. Upgrade pgAdmin 4 to 9.19 or later; the fix is represented by upstream commits 35c9235d17a7d5a99778f01b2f1b9e5e3a3b7fde, 58c531d831179dc9b0a5bf873ccb80c71c8d387a, and c6ef41a951012cd877a1992b5dac681eec36e48d, and tracked in https://github.com/pgadmin-org/pgadmin4/issues/10676. The supplied references do not document a workaround, so updating is the complete remediation. Because practical exploitability depends on password guessability, ensure internal accounts, especially administrator accounts, use strong unique passwords.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
CWE-307 (Improper Restriction of Excessive Authentication Attempts) is the root-cause class: pgAdmin 4 server mode relies on Flask and Flask-Security for authentication, and the vendor fix shows that Flask-Security registers separate /login, /verify, /change and /reset views alongside pgAdmin's own endpoints without sharing pgAdmin's failed-login counter or lock. Additional gaps arise because the internal account is looked up by exact username while the login form matches email case-insensitively, and because deployments that also configure LDAP, webserver, or Kerberos authentication can count a wrong internal password incorrectly or answer a guess without counting it. The remediation centralizes failed-login counting, performs case-insensitive email lookup for the internal account, refuses submissions to Flask-Security's own views, prevents password-bearing logins from falling back to authentication sources that do not check the password, and scopes lockout to internal authentication only. This is an authentication-brute-force exposure rather than direct credential disclosure: compromise still requires successfully guessing a valid password. Related cross-source password-reset and About-box configuration-disclosure impacts require shared email addresses across authentication sources.
Know when Python 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:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Network-reachable and unauthenticated (AV:N/PR:N/UI:N), but compromise depends on brute-forcing a guessable password so AC:H; successful admin takeover of pgAdmin yields full C/I/A with no scope change.
Primary rating from Vendor (f86ef6dc-4d3a-42ad-8f28-e6d5547a5007).
CVSS VectorVendor: f86ef6dc-4d3a-42ad-8f28-e6d5547a5007
Lifecycle Timeline
2DescriptionCVE.org
In server mode pgAdmin 4 locks an internal account after MAX_LOGIN_ATTEMPTS failed logins (3 by default). The limit could be bypassed, giving an unauthenticated attacker an unlimited number of password guesses against any internal account, including the administrator's, in the default configuration:
- Flask-Security registers its own views next to pgAdmin's. A login submitted to its /login view was checked and logged in without pgAdmin's failed login count or lock. Its /verify view checked a signed-in user's password without limit, its /change view changed a password without pgAdmin's change password permission or re-encrypting the user's saved server passwords, and its /reset views sent and applied password resets for accounts that are not internal or are locked.
- The internal account was looked up by its exact username, while the login form matches the email ignoring case, so a login with the username typed in another case was neither counted nor checked for the lock.
- With LDAP or webserver authentication also configured, a wrong internal password was never counted, and with Kerberos or webserver authentication configured a guess could be answered without being counted.
In addition, where accounts from different authentication sources share an email address, a password reset could be sent for, or applied to, an account from another source, and the About box showed the server configuration to a user whose email was that of an administrator's account.
The fix refuses submissions to Flask-Security's own views, counts every failed internal login however the username is typed and whatever other sources are configured, no longer lets a login that posts a password fall back to an authentication source that does not check it, and locks only internal authentication. Password resets and the About box act only on the user's own internal account. Desktop mode is not affected.
This issue affects pgAdmin 4: before 9.19.
Articles & Coverage 2
Executive ViewAI
CVE-2026-116238 in pgAdmin 4 server mode enables unauthenticated attackers to conduct unlimited password guessing against internal accounts, including administrators. This puts sensitive database management interfaces at risk of unauthorized access, potentially leading to data breaches or system compromise. Leadership should prioritize remediation due to the critical severity and lack of a vendor patch.
No vendor-released patch identified at time of analysis. Interim mitigations include restricting access to trusted networks, enforcing strong password policies, enabling MFA, and monitoring for brute-force attempts.
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.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
EUVD-2026-114379
GHSA-jq9v-4fgp-83ww
NVD
CVE.org
EPSS
Exploit-DB