Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain valid LDAP/Kerberos directory credential
-
DeliveryLog in to pgAdmin server mode with colliding username
-
ExploitSource check skipped, session bound to internal admin account
-
ExecutionInherit admin role and configured servers
-
ImpactRead saved database passwords, pivot to PostgreSQL
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Authentication mechanism validation
MITRE ATT&CK
2 techniques across 2 tactics: Defense Evasion, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires valid credentials for an LDAP directory or Kerberos realm that pgAdmin is configured to use (PR:L), and applies ONLY to pgAdmin 4 server mode before 9.19 - desktop mode is explicitly unaffected. A username collision must exist across authentication sources: the directory username must match another account's username, e.g. an LDAP/Kerberos user whose username equals an internal account (including the default administrator). The second variant additionally requires internal authentication to be listed before LDAP or Kerberos in AUTHENTICATION_SOURCES, which causes Flask-Security's internal form validation to look up the typed email's account and retain it even though the password did not match, letting a directory user log in as another user of the same source. Limiting factors: no anonymous access (a working directory login is mandatory), the flaw is absent in desktop mode and in versions 9.19+, and the second variant depends on non-default source ordering. |
| Impact | This is a genuine authentication/authorization flaw (CWE-287) in pgAdmin 4 server mode, well-substantiated by vendor source evidence (two fix commits plus issue #10675), not a speculative high-CVSS inflation. The supplied CVSS 4.0 vector (AV:N/AC:H/AT:P/PR:L/UI:N, score 8.9) is internally consistent with the description: network-reachable web login (AV:N), requiring an already-valid low-privilege directory credential (PR:L), with success gated on preconditions outside the attacker's sole control - a cross-source username collision and, for one variant, a specific AUTHENTICATION_SOURCES ordering (AC:H/AT:P). The impact metrics (VC:H/VI:H/VA:H, SC:H/SI:H) are credible because a successful bind yields another account's role, servers and saved database passwords - including the default administrator - which extends compromise to the downstream PostgreSQL systems. The vuln.today decision label is 'this_week', consistent with a serious but condition-dependent privilege flaw rather than an emergency. No CISA KEV listing, no EPSS score, and no proof-of-concept are present in the input; the only references are patch commits and the tracking issue. The absence of KEV/EPSS/PoC is not evidence of safety but does mean exploitation is, per available data, not confirmed in the wild - treat as targeted-capable given it needs valid LDAP/Kerberos credentials and a known colliding username. |
| Exploit ScenarioDerived | In a pgAdmin 4 server-mode deployment using LDAP or Kerberos, an attacker who holds a valid directory credential authenticates with a username that matches an internal account - for example the default administrator created at setup. Because pgAdmin selected the login account by username alone (or trusted the account Flask-Security's internal form had looked up) without verifying the authenticating source, the attacker's session is bound to that other account, inheriting its role, configured servers and saved database passwords. No public exploit identified at time of analysis; the only references 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
Account impersonation in pgAdmin 4 server mode before 9.19 lets a user who successfully authenticates against a configured LDAP directory or Kerberos realm be logged into a different pgAdmin account that happens to share their username - including the built-in internal administrator created at first setup - inheriting that account's role, registered servers and saved database passwords. A second variant occurs when internal authentication is listed before LDAP or Kerberos in AUTHENTICATION_SOURCES: Flask-Security's internal form validation resolves the typed email to an account and retains it even though the password did not match, so a Kerberos or LDAP user can type another directory user's principal or email and be logged in as that user. Exploitation requires valid credentials for the directory or realm pgAdmin is configured to use (authenticated, PR:L) plus a username collision across sources; desktop mode and versions 9.19 and later are not affected, and no public exploit code was identified at time of analysis.
RemediationAI
Upgrade pgAdmin 4 server mode to version 9.19, the first release containing the fix; the patched code binds the session to the account whose username and auth_source match the source that actually authenticated the user, and internal authentication now refuses any account that is not from the internal source. Upstream fixes are visible in commits 269e32d5ee01f2eb5de36e464d44487a831f2424 and 7378060e5c8f7c3279b8138d371e13fd8b45a729 and the issue at https://github.com/pgadmin-org/pgadmin4/issues/10675; deployments using the setup.py add-external-user helper should adopt the revised invocation (add-external-user <user> --auth-source ldap --admin) so externally provisioned accounts carry the correct auth source. Updating is the complete fix, but until it can be applied, exposure to the second, form.user-based variant is removed by ordering AUTHENTICATION_SOURCES so that internal authentication is not listed before LDAP or Kerberos - trade-off: the login form then no longer offers internal accounts first, changing the sign-in experience for local users. Eliminating username collisions between directory identities and internal accounts (in particular avoiding a directory username equal to the default administrator name) removes the precondition for the first variant; this is an administrative control on the directory side and does not repair the underlying code path, so the upgrade should still be scheduled.
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
pgAdmin 4's server mode stores one account per authentication source in its User model, keyed by username plus an auth_source column (INTERNAL, LDAP, KERBEROS, OAUTH2), so identical usernames can legitimately exist in several sources. The flaw is a CWE-287 improper-authentication problem: after LDAP or Kerberos verified the credentials, the login path selected the account to establish the session either by username alone or by trusting form.user, the account object that Flask-Security's internal login form had already populated from the typed email - regardless of which source actually authenticated the user and regardless of whether that account's password matched. Because the session is bound to the wrong User row, the attacker inherits the target account's role, server definitions and stored database passwords (scope change, S:C). The vendor fix, visible in commit 269e32d5ee01f2eb5de36e464d44487a831f2424 and companion commit 7378060e5c8f7c3279b8138d371e13fd8b45a729, introduces a get_login_user() method on each authentication class: LDAP now always queries User filtered by username and auth_source == LDAP (honouring the LDAP_DN_CASE_SENSITIVE setting with a case-insensitive match when disabled), Kerberos and other external sources look up only their own source's row, and internal authentication logs in form.user only when that account's auth_source is INTERNAL. The setup utility's add-external-user command gained a matching --auth-source argument so externally provisioned accounts are created with the correct source. Regression tests (test_auth_source_user_binding.py) seed a colliding account first so an unfiltered lookup would return it, verifying each source binds to its own account.
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:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:N
Network web login with a required valid directory credential gives AV:N/PR:L; dependence on a cross-source username collision and source ordering gives AC:H; capturing another account's servers and DB passwords crosses into downstream PostgreSQL systems, so S:C with C/I/A:H.
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 keeps an account per authentication source, so the same username can exist as, for example, an internal account and an LDAP account. After LDAP or Kerberos authenticated a user, pgAdmin chose the account to log in by username alone, or took the account Flask-Security's login form had looked up, without checking that it came from the source that authenticated the user. The session therefore belonged to another account, with its role, its servers and its saved database passwords:
- An LDAP or Kerberos user whose username matched an internal account was logged in as that internal account, including the administrator account created when pgAdmin is first set up.
- With internal authentication listed before LDAP or Kerberos in AUTHENTICATION_SOURCES, the login form's internal validation looks up the account whose email was typed and keeps it even though its password does not match. A Kerberos user could type another Kerberos user's principal and be logged in as that user, and an LDAP user could do the same with an LDAP account whose email is their username.
Exploitation requires valid credentials for an LDAP directory or Kerberos realm that pgAdmin is configured to use.
The fix looks the account up by the authenticated username and the source that authenticated it, and no longer uses the account the login form found for any source but internal authentication. Internal authentication logs in that account only if it is an internal account. Desktop mode is not affected.
This issue affects pgAdmin 4: before 9.19.
Articles & Coverage 1
Executive ViewAI
A high-severity vulnerability in pgAdmin 4 server mode (versions before 9.19) allows authenticated users to impersonate other accounts, including the internal administrator, by exploiting username collisions across authentication sources. This could lead to unauthorized access to sensitive database credentials and administrative functions, impacting organizations that rely on pgAdmin for database management. Leadership should prioritize patching due to the potential for privilege escalation and data breach.
Apply vendor patch.
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-114380
GHSA-mv93-hq32-623f
NVD
CVE.org
EPSS
Exploit-DB