Posted on 2026-09-17T00:00:00Z · pgAdmin Development Team · PostgreSQL News
The pgAdmin Development Team is pleased to announce the release of pgAdmin 4 version 9.18. This release of pgAdmin 4 includes 29 bug fixes and new features, including fixes for four security vulnerabilities (CVE-2026-86861 through CVE-2026-86864). For more details, please see the release notes.
pgAdmin is the leading open-source graphical management tool for PostgreSQL. For more information, please see the website.
Notable changes in this release include:
Features
- Collapse and restore the Object Explorer by re-clicking the current workspace icon, in the manner of the VS Code side bar, remembering the choice across refreshes. A keyboard shortcut,
Ctrl+Alt+Bby default, does the same thing and can be changed through the newtoggle_object_explorerpreference. - Harden the default Content-Security-Policy so inline scripts run under a per-request nonce rather than a blanket
'unsafe-inline', and drop'unsafe-eval'.style-srckeeps'unsafe-inline', because MUI and React inject runtime styles and inlinestyleattributes that cannot carry a nonce, and development bundles have'unsafe-eval're-added automatically whenDEBUGis set.
Security Fixes
- Fix an authentication bypass in Webserver authentication mode, where
get_user()fell back to reading the configuredWEBSERVER_REMOTE_USERname from the inbound request headers when it was absent from the WSGI environment. Because a header is written by whoever sends the request, any client that could reach pgAdmin could assert any identity, including an administrator's, without presenting a credential. A header-asserted identity is now opt-in, restricted to a configured list of trusted proxies with an optional shared secret, and refused for accounts whose authentication source is notwebserver(CVE-2026-86863). - Fix argument and connection-string injection in the Backup tool, where the client-supplied database name was appended to the
pg_dumpargument vector as a bare positional value. Becausegetopt_longpermutes arguments, a value beginning with a dash supplied further options such as--file, overriding the storage-confined output path; and because libpq expands a database name containing an equals sign into a full connection string, the same field could redirect the connection, and the password exported inPGPASSWORD, to a host of the caller's choosing. The database name is now passed through thePGDATABASEenvironment variable, which libpq never expands (CVE-2026-86864). - Fix connection-string injection in the Restore and Maintenance tools, where the client-supplied database name was passed straight to
--dbnameand could likewise redirect the connection, and the exported password, to a server of the caller's choosing (CVE-2026-86862). - Fix a time-of-check to time-of-use flaw in the File Manager's
save_fileendpoint, which backs saving from the Query Tool and ERD: the requested path was validated withcheck_access_permission()and then opened with a plainopen(), so a symbolic link planted in between was followed, writing outside the user's storage directory. This is the write sink that CVE-2026-7819's hardening of the separate upload path did not cover (CVE-2026-86861). - Refuse HTTP redirects on LLM API requests, rather than following a
Locationheader on to a destination theALLOWED_LLM_API_URLScheck was never applied to. This is hardening rather than a fix for an exploitable flaw, since returning the redirect at all requires control of a host already on the allowlist. - Reject an empty or null
Usernamewhen importing a non-shared server, which previously imported cleanly and left a server that libpq would silently authenticate as the OS account running pgAdmin rather than reject outright.
Bugs/Housekeeping
- Fix login being impossible against Flask-Security-Too 5.8.2, which corrected a long-standing inversion in
UserMixin.is_locked()that pgAdmin's ownis_locked()had been written against. - Fix inherited columns in the Table dialog being editable and deletable, and the Data type dropdown on the expanded Definition tab offering every type rather than honouring the allowed-type restriction applied inline.
- Reinstate dependency ordering of the script Schema Diff generates, which had been lost since the React port left
dependLevelunset. - Fix Schema Diff reporting false differences for SERIAL and BIGSERIAL columns, duplicating any column that also differs when recreating a foreign table, losing a foreign table column's collation, injecting whitespace into an applied function or procedure body, generating SQL that PostgreSQL rejects when a sequence's MINVALUE is raised above its current value, and reporting a comparison that fails part way through as a success.
- Share concurrent identical GET requests behind
getNodeAjaxOptions()so a wide table's Columns tab no longer fires one duplicateget_typesrequest per column row. - Fix the argument grid on the Definition tab of a user-defined function or procedure refusing to delete, or add, a row in edit mode.
- Omit the redundant
TABLESPACE pg_defaultclause from generated index SQL, which was invalid on a partitioned table. - Fix a crash when a per-server Password Exec Command is used with a service-only (
pg_service.conf) connection, which leaves host, port and username unset. - Accept
SharedUsernamewhen importing a shared server from aservers.jsondefinition, instead of insisting onUsernamefor every server. - Render the Validate binary path dialog as HTML, instead of showing the raw markup.
- Remove a trailing quote from the Windows installer's
ProductVersion, and fix theexistingSecretpath in the Helm deployment template. - Skip importing and initialising the Kerberos, LDAP, MFA, OAuth2 and Webserver authentication providers unless
SERVER_MODEis set, leaving desktop mode with internal authentication alone. - Bump JavaScript and Python third-party dependencies, and update the message catalogs, including a fix for the Korean catalog that had not been recompiled since November 2025.
Builds for Windows and macOS are available now, along with a Python Wheel, Docker Container, RPM, DEB Package, and source code tarball from the download area.
Source records
- center.news_newsarticle · 3381 · 2026-10-03T04:08:35.169032Z
- headline:upstream-news · https://www.postgresql.org/about/news/pgadmin-4-v918-released-3381/ · 2026-10-01T05:35:38.846352Z
- official:news · n3381 · 2026-10-03T04:37:45.174294Z
- pgweb.news_newsarticle · 3381 · 2026-10-03T04:08:55.967155Z