Skip to main content

pgAdmin 4 CVE-2026-17350

| EUVDEUVD-2026-51563 MEDIUM
Missing Authorization (CWE-862)
2026-07-31 f86ef6dc-4d3a-42ad-8f28-e6d5547a5007 GHSA-4pj2-vq9j-xj3g
5.3
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
    Authenticate to pgAdmin SERVER mode with valid credentials
  2. Delivery
    Receive 403 on front-door tool route (e.g., sqleditor init, ACL panel, PSQL open)
  3. Exploit
    Send direct HTTP requests or Socket.IO events to secondary tool routes bypassing permission check
  4. Execution
    Secondary handlers verify login only, not tool permission
  5. Persist
    Execute full tool workflow (data retrieval, GRANT application, DDL comparison, interactive psql shell)
  6. Impact
    Exfiltrate data or modify database objects within existing database role's privileges

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK

1 technique across 1 tactic: Privilege Escalation

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires all four of the following: (1) a valid pgAdmin login in SERVER mode - unauthenticated access is not possible (PR:L per CVSS); (2) a stored, working database connection within that pgAdmin account, since the bypassed tool routes operate over the user's already-authenticated database session; (3) pgAdmin 4 version 9.3 through 9.16 in SERVER mode - desktop/single-user deployments do not implement per-tool RBAC and are unaffected; (4) the administrator must have explicitly denied the user at least one tool permission via the custom roles system introduced in 9.3. Exploitation does NOT elevate the user's PostgreSQL database privileges - all operations are bounded by the existing database role. Limiting factors include: the attacker must be a known, credentialed pgAdmin user (not an external threat actor without an account); the capability gained is strictly what the user's database role already permits through other means; and only multi-user SERVER mode deployments with actively configured custom role restrictions are in scope.

Impact

The CVSS 4.0 score of 5.3 (Medium) with PR:L accurately reflects that exploitation requires a pre-existing authenticated pgAdmin session and a stored, working database connection - unauthenticated or anonymous access is not possible. The low confidentiality and integrity impact ratings (VC:L/VI:L) are justified because the bypass does not grant database privileges beyond what the user's existing database role already permits; it circumvents pgAdmin's organizational segregation-of-duties policy, not the underlying PostgreSQL authorization model. This means real-world risk is primarily a compliance and governance concern rather than a privilege escalation to otherwise inaccessible data. Organizations that have explicitly deployed SERVER mode and configured custom tool permission restrictions - specifically relying on those restrictions for regulatory or operational segregation-of-duties requirements - face material control failures until patched. The PSQL interactive terminal bypass (gaining a live psql shell) represents the highest-impact scenario within the existing database session's privilege set. KEV listing is absent and no EPSS score was provided; no dedicated exploit tool is public. The fix commits and detailed GitHub issue (pgadmin4#10190) are publicly visible, providing sufficient detail for a knowledgeable attacker to reproduce exploitation without a standalone tool.

Exploit ScenarioDerived

An authenticated pgAdmin user who has been denied tools_psql_tool permission receives a 403 when attempting to open the PSQL tool's protected front-door route, but proceeds to connect directly to the /pty Socket.IO namespace - which checks only socket_login_required - and obtains an interactive psql shell operating under their existing database role's credentials. Separately, a user denied tools_grant_wizard receives a 403 on the ACL route but calls the secondary grantable-object enumeration and SQL generation endpoints, then applies GRANT statements to database objects, with the effect confirmed database-side via has_table_privilege(). The fix commits and issue report provide sufficient implementation detail for a knowledgeable attacker to reproduce both scenarios.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Jul 31, 2026

pgAdmin 4 SERVER mode (versions 9.3 through 9.16) allows authenticated users to fully bypass administrator-configured per-tool role-based access controls by exploiting incomplete permission enforcement across backend routes and Socket.IO handlers. The Flask-Security permissions_required decorator was applied only to a single front-door route per tool, while all secondary routes and Socket.IO event handlers checked only authentication, not tool permissions - meaning a user who received a 403 on the initial gated endpoint could still drive the complete tool workflow through its other endpoints. Affected tools include Query Tool, Grant Wizard, Schema Diff, ERD, PSQL (interactive terminal), Debugger, Backup, Restore, Maintenance, and Import/Export. No dedicated public exploit has been identified, though the fix commits and GitHub issue are publicly visible; exploitation requires a valid authenticated pgAdmin session.

RemediationAI

Upgrade pgAdmin 4 to version 9.17 or later. The fix applies permissions_required and the new socket_permissions_required decorator as the outermost decorators on every backend route and Socket.IO handler for all affected tools: Query Tool, Grant Wizard, Schema Diff, ERD, PSQL, Debugger, Backup, Restore, Maintenance, and Import/Export. Fix commits are at the pgadmin4 GitHub repository (see references). If immediate upgrade is not possible, the most effective compensating control is to revoke the relevant database-level privileges from restricted users via PostgreSQL's own GRANT/REVOKE system - this removes the underlying capability even if the pgAdmin tool-level bypass is exercised, at the trade-off of also revoking those privileges through any direct database connection the user might have. A second compensating control is to audit and remove stored database connections for users who have had tool permissions restricted, as the bypass requires a stored, working connection; this reduces blast radius but requires ongoing administrative attention as new connections may be added. Organizations relying on pgAdmin tool permissions for segregation-of-duties compliance documentation should record this as a control failure for affected versions until patched.

Affected VersionsENISA

pgAdmin 4 9.3 <9.17

Affected Packages

euvd pgadmin_4 fix: 9.17

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 is a Python/Flask web application for PostgreSQL administration that supports a SERVER mode enabling multiple users under a shared deployment. Version 9.3 introduced a per-tool permission system backed by Flask-Security's permissions_required decorator and a custom role model. CWE-862 (Missing Authorization) applies precisely here: the authorization check existed but was only enforced at the entry point of each tool's request workflow. All downstream routes (e.g., server connection, viewdata initialization, table data retrieval) and Socket.IO event handlers (e.g., compare_database for schema diff, the /pty namespace for PSQL) relied solely on pga_login_required/socket_login_required, which verify session authentication but not role-level tool permissions. The fix (commits 461c3af, 64a9cdb, ba19847, d36bd8d) introduces a socket_permissions_required decorator mirroring permissions_required, reading permissions via has_permission() on CustomUserMixin (which also honours the Administrator bypass), and applies both decorators to every backend route and Socket.IO handler for all affected tools.

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

Vendor (f86ef6dc-4d3a-42ad-8f28-e6d5547a5007) PRIMARY 5.3 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
vuln.today AI 5.4 MEDIUM

Requires authenticated pgAdmin session with stored DB connection (PR:L, AV:N, AC:L); scope unchanged as bypass stays within user's existing database privileges (S:U, C:L, I:L, A:N).

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
SUSE 5.4 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
Red Hat 5.4 MEDIUM

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

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

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

Lifecycle Timeline

1
Patch available
Jul 31, 2026 - 17:01 EUVD

DescriptionCVE.org

The per-tool permission system (custom roles / role-based tool permissions, introduced in pgAdmin 4 9.3) did not enforce its permission check consistently. In SERVER mode, pgAdmin 4 gates each tool behind a per-tool Flask-Security permission, but the permission decorator (permissions_required) was applied only to a single "front door" route per tool. Every other backend route and Socket.IO handler in that tool's workflow relied solely on pga_login_required/socket_login_required, which check authentication but not the tool permission.

The reporter verified three cases against a test build: (1) a user without tools_query_tool permission received 403 on the protected sqleditor initialization route, but the same session went on to connect the server, initialize the viewdata backend chain, and retrieve real table row content; (2) a user without tools_grant_wizard received 403 on the protected acl route, but the same session still enumerated grantable objects, generated GRANT SQL, and successfully applied it -- confirmed database-side via has_table_privilege(); (3) a user without tools_schema_diff received 403 on the protected panel route, but the same session initialized schema diff, enumerated and connected databases, and obtained real DDL differences via the compare_database Socket.IO handler. The reporter also confirmed a related but distinct issue: a non-owner triggering /misc/workspace/adhoc_connect_server against an administrator-owned shared server caused pgAdmin to persist a new server row still owned by the administrator (user_id/shared unchanged from the source), even though the connection attempt itself reported failure.

During remediation, the same front-door-only permission gap was found to also affect the ERD, PSQL, and Debugger tools, and the Backup, Restore, Maintenance, and Import/Export blueprints, none of which were part of the original report; these were fixed using the same pattern as an extension of the reported defect class.

An authenticated user who had valid pgAdmin login and a stored, working database connection, but had been explicitly denied a specific tool's permission by an administrator, could therefore still drive that tool end-to-end through its other routes and sockets, including obtaining an interactive psql session over the /pty Socket.IO namespace and invoking backup/restore/maintenance/import-export jobs.

Because the bypass only restores access to tools operating over the user's own already-authenticated database connection, it does not grant the user any database privilege they did not already hold; it circumvents pgAdmin's own tool-level access-control policy (an organisational segregation-of-duties control, separate from database-level authorization), letting a user reach a pgAdmin feature an administrator intended to withhold from them, using capabilities their existing database role already permits through other means.

Socket.IO event handlers had no permission-aware equivalent of permissions_required; only socket_login_required existed, checking authentication but not the tool permission.

Fix adds a socket_permissions_required decorator (mirroring permissions_required, honouring the Administrator bypass, reading permissions via has_permission()) and applies it, alongside permissions_required, as the outermost decorator on every backend route and Socket.IO handler for the affected tools. Regression tests assert 403 on every gated route and socket handler for a permission-less user.

This issue affects pgAdmin 4 in SERVER mode: from 9.3 before 9.17.

Threat Intelligence Overview

EPSS Score
0.2%
Top 86% exploitable
Prevalence
Medium
popular PostgreSQL GUI, but SERVER mode with custom RBAC narrows footprint
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment Vendor GitHub

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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

26
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +26
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.

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-2024-2044 CRITICAL POC
9.9 Mar 07

pgAdmin <= 8.3 is affected by a path-traversal vulnerability while deserializing users’ sessions in the session handling

CVE-2024-3116 CRITICAL POC
9.8 Apr 04

pgAdmin <= 8.4 is affected by a Remote Code Execution (RCE) vulnerability through the validate binary path API. Rated cr

CVE-2026-12046 CRITICAL POC
9.5 Jun 18

Remote unauthenticated access to two SQL Editor endpoints in pgAdmin 4 server-mode deployments (versions 6.9 through 9.1

CVE-2022-4223 HIGH POC
8.8 Dec 13

The pgAdmin server includes an HTTP API that is intended to be used to validate the path a user selects to external Post

CVE-2024-9014 MEDIUM POC
6.5 Sep 23

pgAdmin versions 8.11 and earlier are vulnerable to a security flaw in OAuth2 authentication. Rated medium severity (CVS

CVE-2025-12762 CRITICAL
9.8 Nov 13

Remote code execution in pgAdmin 4 (versions up to and including 9.9) lets an attacker who can get a crafted PLAIN-forma

CVE-2026-12045 CRITICAL
9.4 Jun 18

Remote SQL injection via prompt injection in pgAdmin 4 versions 9.13 through 9.15 allows attackers who can write content

CVE-2026-17351 CRITICAL
9.4 Jul 31

SQL injection sandbox escape in pgAdmin 4's AI Assistant (versions 9.13 through 9.16) lets an attacker break out of the

CVE-2026-17566 CRITICAL POC
9.4 Jul 31

OS command injection in pgAdmin 4 (all versions before 9.18) lets an authenticated user with the commonly-granted tools_

CVE-2026-7813 CRITICAL
9.4 May 11

Authorization bypass and privilege escalation in pgAdmin 4 server mode allows authenticated users to access other users'

CVE-2024-4216 MEDIUM POC
5.4 May 02

pgAdmin <= 8.5 is affected by XSS vulnerability in /settings/store API response json payload. Rated medium severity (CVS

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise High Performance Computing 15 SP7 Not-Affected
SUSE Linux Enterprise Module for Python 3 15 SP7 Not-Affected
SUSE Linux Enterprise Server 15 SP7 Not-Affected
SUSE Linux Enterprise Server for SAP Applications 15 SP7 Not-Affected

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