Description
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.
Published: 2026-10-30
Score: 9.2 Critical
EPSS: n/a
KEV: No
Impact: Unrestricted password guessing against internal and administrator accounts
Action: Apply Patch
AI Analysis

Impact

The vulnerability allows an attacker to bypass the built‑in login‑attempt counter in pgAdmin 4, enabling unlimited password guesses against any internal account, including the administrator account, in the default configuration. Because Flask‑Security’s own login, password verification, change, and reset endpoints bypass pgAdmin’s lockout logic, repeated failed attempts do not trigger account locking, and password resets can be applied to accounts from different authentication sources. This issue maps to CWE‑307 (Improper Limitation of Login Attempts) and CWE‑863 (Improper Authentication via Security Surface), and carries a CVSS score of 9.2, indicating a high severity impact on confidentiality and integrity.

Affected Systems

All installations of pgAdmin 4 running a version earlier than 9.19 are affected, regardless of whether LDAP, Kerberos, or web server authentication is enabled. The vulnerability does not impact the desktop mode of the application.

Risk and Exploitability

The flaw is exploitable through the web interface by sending HTTP requests to Flask‑Security endpoints such as /login, /verify, /change, and /reset. Because the server does not enforce login‑attempt limits, an unauthenticated attacker can iterate over valid usernames and passwords without triggering a lockout. The EPSS score is unavailable, but the high CVSS and lack of a KEV listing suggest that exploitation is plausible in environments where attackers have network access to the pgAdmin service. The vulnerability’s exploitation requires only standard web‑interface access and does not rely on privileged local access.

Generated by OpenCVE AI on October 30, 2026 at 21:20 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade pgAdmin 4 to version 9.19 or later, which restores proper login‑attempt counting and restricts Flask‑Security endpoints to internal authentication only.
  • If the upgrade cannot be applied immediately, block or restrict access to the Flask‑Security URLs (e.g., /login, /verify, /change, /reset) using a firewall or reverse proxy, thereby preventing unauthorized password attempts.
  • Review and enforce strong password policies for internal accounts, disable unnecessary authentication sources, and monitor for repeated failed login attempts to detect brute‑force activity.

Generated by OpenCVE AI on October 30, 2026 at 21:20 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Fri, 30 Oct 2026 20:15:00 +0000

Type Values Removed Values Added
Description 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.
Title pgAdmin 4: The failed login limit can be bypassed, and Flask-Security's own views skip pgAdmin's login and password checks
Weaknesses CWE-307
CWE-863
References
Metrics cvssV3_1

{'score': 8.1, 'vector': 'CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H'}

cvssV4_0

{'score': 9.2, 'vector': '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'}


Subscriptions

No data.

cve-icon MITRE

Status: PUBLISHED

Assigner: PostgreSQL

Published:

Updated: 2026-10-30T19:55:11.056Z

Reserved: 2026-10-25T16:26:16.419Z

Link: CVE-2026-116238

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-30T20:17:02.433

Modified: 2026-10-30T20:17:02.433

Link: CVE-2026-116238

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-30T21:30:12Z

Weaknesses
  • CWE-307

    Improper Restriction of Excessive Authentication Attempts

  • CWE-863

    Incorrect Authorization