Skip to main content

pgAdmin 4 EUVDEUVD-2026-114380

| CVE-2026-116239 HIGH
Improper Authentication (CWE-287)
2026-10-30 f86ef6dc-4d3a-42ad-8f28-e6d5547a5007 GHSA-mv93-hq32-623f
8.9
CVSS 4.0 · Vendor: f86ef6dc-4d3a-42ad-8f28-e6d5547a5007
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain valid LDAP/Kerberos directory credential
  2. Delivery
    Log in to pgAdmin server mode with colliding username
  3. Exploit
    Source check skipped, session bound to internal admin account
  4. Execution
    Inherit admin role and configured servers
  5. Impact
    Read 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

pgAdmin 4 0 <9.19

Affected Packages

euvd pgadmin_4 fix: 9.19

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

Vendor (f86ef6dc-4d3a-42ad-8f28-e6d5547a5007) PRIMARY 8.9 HIGH
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
vuln.today AI 8.5 HIGH

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.

3.1 AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H
4.0 AV:N/AC:H/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:N

Primary rating from Vendor (f86ef6dc-4d3a-42ad-8f28-e6d5547a5007).

CVSS VectorVendor: f86ef6dc-4d3a-42ad-8f28-e6d5547a5007

Attack Vector
Network
Attack Complexity
High
Attack Requirements
Present
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
High
Subsequent system: Confidentiality
High
Subsequent system: Integrity
High
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Oct 30, 2026 - 21:18 EUVD
CVE Published
Oct 30, 2026 - 20:17 cve.org
HIGH 8.9

DescriptionCVE.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.

Executive ViewAI

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.4%
Top 67% exploitable
Prevalence
High
very widely used PostgreSQL admin tool; server mode with LDAP/Kerberos is the affected subset
Data Quality
3 sources
Confidence: Low

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

44
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

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

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy