Skip to content

Cybersecurity · Vulnerability Management

PostgreSQL's Biggest Security Release Ever: 28 CVEs, and What to Actually Worry About

PostgreSQL 18.6, 17.11, 16.15, 15.19, and 14.24 shipped August 13 fixing 28 CVEs, the most in a single release, 17 of them CVSS 8.0+. Most are heap buffer overflows reachable through a crafted query. Here's which ones matter and who's actually exposed.

Shashikant Gupta

Shashikant Gupta

5 min read

PostgreSQL's Biggest Security Release Ever: 28 CVEs, and What to Actually Worry About

Sponsored

Share

PostgreSQL shipped its largest security release ever on August 13: 28 CVEs fixed in one batch, across every currently supported version, plus PostgreSQL 19’s third beta. Seventeen of those 28 carry a CVSS score of 8.0 or higher. Nine have “executes arbitrary code” in the title. If you run Postgres anywhere in production, this is worth ten minutes of your attention, but not the kind of panic the raw numbers might suggest. Almost all of the serious bugs share the same precondition, and understanding it is what tells you whether this is an emergency or a scheduled patch window.

The headline number, and the nuance that matters

28 CVEs in one release is a genuinely unusual volume for PostgreSQL, a project with a strong track record on security discipline. But CVE count alone doesn’t tell you about exploitability, and the pattern across the most severe bugs here is consistent: they’re heap buffer overflows triggered by a crafted SQL query, not by an unauthenticated network request.

CVEComponentCVSSTrigger
CVE-2026-14664regexpHighText that fails encoding validation
CVE-2026-14669to_char(timestamptz)HighA long POSIX timezone abbreviation
CVE-2026-14670plperlHighA crafted function returning a tied hash
CVE-2026-14676pg_stat_statementsHighCrafted queries containing array constants
CVE-2026-14662tsvector/tsquery8.8Integer wraparound in size allocation
CVE-2026-6471Logical decoding7.2dlopen of an arbitrary file
CVE-2026-6464psql COPY FROM STDIN8.1Early COPY failure processes input as psql commands

PostgreSQL's August 13, 2026 security release: 28 CVEs fixed, 17 at CVSS 8.0 or higher, 9 involving arbitrary code execution

Each of these needs someone, or something, able to issue a specific SQL query, define a function, or feed input to a client tool. That’s a meaningfully different threat model than “anyone on the internet can hit port 5432 and own your database.” It’s the same category of risk as a SQL injection vulnerability in your application layer: the database isn’t the weak point on its own, but a weak point upstream (an injectable query, an untrusted stored procedure author, a multi-tenant setup where tenants can run arbitrary SQL) turns these bugs from theoretical into exploitable.

Who’s actually exposed

Three profiles should treat this release as urgent rather than routine:

Multi-tenant databases where tenants run their own queries. If your product lets customers write SQL, custom reporting, embedded analytics, a query builder, an untrusted tenant is exactly the “query author” these CVEs assume. A tenant boundary that relied on PostgreSQL’s own query execution being safe just got weaker until you patch.

Applications with any SQL injection surface. These bugs turn an ordinary injection point into a code execution primitive instead of just a data leak. If you’ve been treating a known or suspected injection issue as lower priority because “worst case they read some data,” this release changes that calculus.

Anyone running pg_stat_statements, which is extremely common, it’s a standard extension for query performance monitoring, and CVE-2026-14676 puts a heap overflow directly in its query-normalization path.

If your Postgres instance only ever executes a fixed, parameterized query set from a trusted application, with no ad hoc SQL, no untrusted function authors, and no SQL injection surface, your actual exposure is lower. It’s still worth patching on the normal cadence; “lower exposure” isn’t “no exposure,” and the logical decoding bug (CVE-2026-6471, arbitrary dlopen) has a different trigger path worth checking against your own replication setup specifically.

What to run

The fix is a point-release update, not a major-version migration, on whichever line you’re already running:

18.x -> 18.6
17.x -> 17.11
16.x -> 16.15
15.x -> 15.19
14.x -> 14.24

Check your current version with SELECT version();, match it against the table, and schedule the update through your normal patch process. There’s no configuration workaround that closes these specific bugs; restricting who can execute arbitrary SQL, tightening pg_hba.conf, revoking unnecessary function-creation privileges, reduces the population of people who could trigger them, but the actual fix requires the binary update. If you’re mid-decision on whether PostgreSQL 18 is worth the upgrade already, or tracking what’s landed so far in 19’s beta cycle, this release doesn’t change either calculus, it’s orthogonal to the major-version question. Patch your current line first, then make the version decision on its own timeline.

The PostgreSQL 14 clock

Buried in this release is a separate, unrelated deadline: PostgreSQL 14 goes end of life on November 12, 2026, and 14.24 is one of the last scheduled fix windows before that cutoff. If you’re still running 14 in production, that’s not an August problem, it’s a now problem for planning purposes. A major version upgrade takes real lead time, testing, a migration window, rollback planning, and “we’ll deal with it before November” gets tighter every week you wait. Treat this release as the trigger to put that upgrade on the calendar if it isn’t already.

None of this is a reason to distrust PostgreSQL’s security process. A large, coordinated batch fix across every supported line, released together with clear CVSS scoring and precise trigger conditions per bug, is what a mature security response looks like. The number 28 is the headline. The trigger condition on almost every serious one of them is the number that should actually shape your response.

Frequently asked questions

Do I need to upgrade to a new PostgreSQL major version to get these fixes?
No. The fixes are point releases within your existing major version: 18.6 if you're on 18.x, 17.11 on 17.x, 16.15 on 16.x, 15.19 on 15.x, and 14.24 on 14.x. Each is a drop-in patch update, not a major version migration, so the usual point-release upgrade process applies.
Are these vulnerabilities exploitable by an unauthenticated attacker over the network?
No, and this is the detail worth getting right before you escalate internally. The headline heap buffer overflow bugs, in regexp, to_char, plperl, and pg_stat_statements, require the ability to execute a specific crafted SQL query. That means a logged-in user with query privileges, an application vulnerable to SQL injection, or an untrusted function/procedure author. A database that only accepts queries from a trusted, vetted application layer has meaningfully less exposure than one running ad hoc or third-party SQL.
What actually happens if one of these bugs is triggered?
Arbitrary code execution as the operating system user PostgreSQL runs as. On most production setups that's a dedicated, unprivileged postgres system account, not root, so the practical blast radius is real but not automatically total system compromise. It's still enough to read or exfiltrate any data the postgres process can reach, and a strong pivot point for further privilege escalation on a poorly hardened host.
What happens to PostgreSQL 14 in November?
PostgreSQL 14 reaches end of life on November 12, 2026, per the project's standard 5-year support window. The August 13 release, 14.24, is one of the last scheduled fix windows before that cutoff. If you're running 14 in production, this is the point to schedule the major version upgrade rather than wait for a future CVE with no vendor patch coming.

Sources

Sponsored

Sponsored

Discussion

Join the conversation.

Comments are powered by GitHub Discussions. Sign in with your GitHub account to leave a comment.

Sponsored