Skip to content
RESEARCH INDEX BREACHROAD / INTELLIGENCE NOTE

PostgreSQL fixes 28 CVEs, including multiple code-execution paths

PostgreSQL 18.6, 17.11, 16.15, 15.19 and 14.24 address 28 vulnerabilities. We map the highest-risk classes and a safe update plan.

PUBLIC RESEARCH
AUTHOR
/ Breachroad CEO · OSCP · PNPT
PUBLISHED
13 August 2026
READING TIME
15 min read
TOPIC
Vulnerabilities and CVEs
PostgreSQL fixes 28 CVEs, including multiple code-execution paths

The PostgreSQL Global Development Group released versions 18.6, 17.11, 16.15, 15.19 and 14.24 on 13 August 2026. The official announcement lists 28 security vulnerabilities and more than 110 other bug fixes. This is not a routine collection of cosmetic changes: many entries score 8.8 and can result in code execution as the database operating-system user when their individual preconditions are met.

The PostgreSQL 18 branch jumps from 18.4 to 18.6 because 18.5 was not shipped after a regression was found. Individual CVE pages may identify 18.5 as the original fix point, but deployments should use the published 18.6 package. The other safe thresholds are 17.11, 16.15, 15.19 and 14.24. PostgreSQL 14 reaches end of life on 12 November 2026, so updating it should be paired with a migration plan.

Why the number 28 is not the whole story

The flaws span the server, contrib extensions and client tools. They do not form one anonymous exploit available through port 5432. Many require a valid database account, object ownership, function-creation rights, REPLICATION, or control of an origin server processed by pg_dump. Priority therefore depends on the permission model and whether database users and backup sources are fully trusted.

CVE-2026-14680 has one of the broadest implications. Type confusion involving internal arguments lets any database user call a function with an incompatible internal structure and potentially execute code as the PostgreSQL system account. SQL was supposed to prevent direct access to this type, but the enforcement had gaps. Its 8.8 score reflects a move from a low-privileged SQL identity to the server process.

CVE-2026-14664 covers a heap overflow in regular expressions, CVE-2026-14669 a long POSIX timezone abbreviation passed to to_char(timestamptz), and CVE-2026-14662 an integer wrap in tsvector and tsquery. Each can cause an out-of-bounds write and code execution, but input arrives through different application paths. Version scanning establishes the need to patch; reachability analysis identifies the most exposed applications.

Backup and client-tool trust boundaries

CVE-2026-18408 demonstrates that a database dump is active content. A malicious superuser on the origin server can introduce data that a plain-text restore later interprets as psql meta-commands. The previous \restrict and \unrestrict defence was incomplete. pg_dump, pg_dumpall and the path where pg_restore emits plain text are affected.

CVE-2026-19385 is a separate heap overflow while pg_dump processes long function transform lists. CVE-2026-15741 lets an object owner inject SQL through EXTRACT() deparsing, affecting pg_dump, psql commands such as \sf, and tools reusing the same mechanism. CVE-2026-6464 concerns an early failure in COPY FROM STDIN, after which input rows can be processed as psql commands.

The operational conclusion is important: restore a dump from an untrusted or compromised server in an isolated environment even when it is plain text. The client tool runs as the restoring operating-system user and may have cloud keys, filesystem rights and network access. Patching closes known paths, while isolation reduces the impact of a future parser defect.

Extensions and less obvious attack surfaces

Several CVEs affect components that are not enabled everywhere. CVE-2026-14670 covers a tied hash returned from PL/Perl, CVE-2026-14671 the refint module, CVE-2026-15742 extreme Levenshtein inputs in fuzzystrmatch, and CVE-2026-14676 pg_stat_statements in PostgreSQL 18. CVE-2026-6471 lets a user with REPLICATION name a logical-decoding library for dlopen.

This is why “do we run PostgreSQL?” is too shallow an inventory question. Teams need installed extensions, function and object ownership, REPLICATION memberships, procedural languages and the provenance of dumps. Removing an unused extension reduces exposure but does not replace the core update.

The set also includes confidentiality and authorization flaws. A row-level security plan cache may preserve old access after role changes; ctid type confusion can derive memory values; non-default SCRAM iterations create a username-existence oracle; and GSSAPI combined with direct TLS may provide weaker protection than pg_hba.conf appears to require. They do not all yield RCE, but matter in multi-tenant and regulated environments.

An update plan that protects availability and evidence

  1. Inventory every instance, container, managed service, administration client and image used for backup jobs.
  2. Map each branch to a published release: 18.6, 17.11, 16.15, 15.19 or 14.24. Do not deploy the unshipped 18.5.
  3. Confirm whether a cloud provider has already patched and whether a restart, failover or customer-selected maintenance window remains necessary.
  4. Review SQL roles, REPLICATION, procedural languages, extensions, dump sources and services accepting raw queries or full-text-search types.
  5. Test on a representative replica, including drivers, native extensions, replication, backup and restore.
  6. Roll through the cluster and prove the effective binary version on every primary, standby, worker and tooling host.
  7. Investigate the pre-patch window where less-trusted users had SQL accounts, object ownership, REPLICATION or the ability to supply dumps.

PostgreSQL minor updates are cumulative and do not require pg_upgrade or a complete dump and reload; stopping the process and replacing binaries is normally sufficient. That does not eliminate planning. Native extensions need compatibility, and HA systems need a controlled restart or failover sequence.

Three post-update actions

The project highlights additional steps for previous data-integrity bugs. First, tables with GIN indexes may have an invalid reltuples value, including Infinity or NaN, preventing autovacuum and autoanalyze; identify them and run ANALYZE. Second, btree_gist indexes on float types containing NaN, or on bit and bit varying, may require REINDEX. Third, extremely long ltree values could cause incorrect comparisons and a damaged B-tree index that also needs rebuilding.

A package manager reporting a new version is not completion evidence. Closure should cover a running process with the new binaries, healthy replication, a successful restore test, extension compatibility and the relevant index-repair actions. PostgreSQL 14 also needs a migration owner and deadline before EOL.

Hunting for pre-update compromise

The official announcement does not report mass exploitation. Where less-trusted SQL accounts existed, review function and extension creation, logical publications and objects with unusual definitions. At host level, look for child processes from postgres, new libraries, files in executable locations, startup changes and outbound connections outside the expected profile.

For client-tool issues, inspect hosts that dumped or restored data from an external source. The affected asset may be an operator workstation or CI worker rather than the database server. Correlate dump provenance, execution time, operating-system account and reachable resources. An update closes the vulnerability but does not remove persistence created earlier.

The CVE count, versions, post-update actions and vulnerability preconditions come from the PostgreSQL release announcement and project pages. Prioritisation, backup isolation and telemetry are Breachroad recommendations. This complex release is a valuable scenario for our cybersecurity training for organisations. An independent IT security assessment can review database roles, exposure and patch operations.

SHARE / COPY