SEC.CFG.PATCH_EOL — The server runs a release series that is out of support
- Category: security
- Severity: high
- Level: 0
- Confidence: deterministic
- Downtime class: none — the finding is about the server's version, not about a statement
- Stability: stable
- Suites: audit
- Applies to: PostgreSQL 18, MySQL 8.4
The finding is about the future, which is why it does not wait for a CVE
An out-of-support server is not insecure the moment support ends. Nothing changes on that day: the same queries return the same rows, and no scanner finds anything new.
What ended is the supply of fixes. When the next vulnerability in that engine is found — and one will be — supported series receive a patch and this one does not. The interval between a fix existing for everybody else and an exploit existing for the rest is measured in days.
So the rule reports a countdown that has already started, rather than a defect you can reproduce. That is also why there is no configuration change that answers it: the remediation is a major upgrade, planned and scheduled.
Why high and not critical
critical is reserved for exposure that has been demonstrated — a credential in the open, a grant
that hands the database to anybody who asks. Nothing here is known to be exploitable today.
A team that has to plan a major upgrade needs to know it is overdue. Telling them the building is on fire spends the weight that a real fire will need.
What the rule reads
-- What the server answers, and what the rule reads.
SHOW server_version; -- 13.22
-- PostgreSQL 13 left support on 2025-11-13: no further minor release
-- will ever carry a fix for it.
-- The same question on a series still inside its window.
SHOW server_version; -- 18.4
-- PostgreSQL 18 is supported until 2030-11-14.
There is no SQL that fixes this, which is unusual for a finding and worth saying plainly: the remediation is a major upgrade, planned and scheduled, and no setting substitutes for it. The examples show the READING rather than a repair because that is the entire surface a database exposes here -- the rule judges what the instance says it is.
Where the dates come from, and what they can and cannot say
The verdict is reached offline, from resources/data/eol.json, which this package ships. That is
deliberate: a check that had to reach the network would be unusable on a CI runner without egress,
and would answer the same question differently on two days.
Three files can answer, in a fixed order:
- a path you configure in
sqlens.security.advisories.path resources/data/eol.jsonpublished into your own application- the copy bundled with the package
The file that actually answered is named in the finding. Without that, a refresh that landed somewhere nothing reads would look exactly like a refresh that changed nothing.
The dates record premier support for MySQL rather than extended. Extended support exists, is purchased separately, and is not what most projects are on — recording the later date would let a server that stopped receiving routine fixes read as supported.
What it says when it cannot tell
Three answers are not findings about your server but statements about the check:
| Situation | What you get |
|---|---|
| the series is not in the data at all | undetermined — the server is newer than the file, or older than anything it records, and neither is a verdict |
| the version string could not be read | undetermined, naming the string |
| no advisory file could be read | undetermined, naming which path was tried and why it failed |
None of them is a pass. A version with nothing to hold it against is not a version in support.
False positives
A vendor-patched build that carries security fixes past the upstream date reads as out of support here, because the version string is all a server offers and it does not distinguish a distribution's backports from upstream's own releases. That is the honest limit of an offline check: the alternative would be trusting a build suffix, which anybody can set. Such a server is suppressed through the baseline once, with the reason recorded.
Related
- SEC.CFG.TLS_DISABLED — another finding about the server itself rather than about anything a migration wrote.