CVE-2026-9082 is a highly critical, unauthenticated SQL injection in Drupal
core’s database abstraction layer. It affects sites running on PostgreSQL, it
is in the CISA Known Exploited Vulnerabilities catalog, and it is being exploited in the wild.
This post explains what the flaw is, how to tell if you are exposed without attacking your own
site, and how to find every affected Drupal host across your attack surface with Sn1per.
CVE-2026-9082 at a glance
| CVE | CVE-2026-9082 |
| Drupal advisory | SA-CORE-2026-004 (2026-05-20) |
| Type | SQL injection (CWE-89) |
| Severity | Critical – CVSS 9.8 / Drupal risk score 20 of 25 |
| Authentication | None – anonymous, remote |
| Precondition | Site uses a PostgreSQL database (MySQL/MariaDB not affected) |
| Exploited in the wild | Yes – CISA KEV, thousands of attempts observed |
| Impact | Arbitrary SQL execution: data disclosure, tampering, and in some setups privilege escalation or code execution |
What is CVE-2026-9082?
Drupal core provides a database abstraction API so module code can build queries without
writing raw SQL. CVE-2026-9082 is a flaw in how that layer neutralizes special elements when
it builds entity queries against a PostgreSQL backend. A specially crafted
request reaches the vulnerable code path and lets an anonymous attacker inject SQL into the
generated query.
Two unauthenticated routes into the vulnerable code have been described publicly: the
JSON:API filter syntax (for example the query parameters on an endpoint such as
/jsonapi/node/article) and a JSON login endpoint. Because JSON:API is on by
default in many modern Drupal builds and is reachable without a session, the practical exposure
for an internet-facing PostgreSQL Drupal site is high.
The precondition matters. The bug lives in PostgreSQL-specific query handling, so a Drupal
site on MySQL or MariaDB is not exploitable through this issue. That does not make the update
optional – it means PostgreSQL sites should treat this as an emergency and everyone else should
still patch on the normal security cadence.
Affected and fixed versions
Drupal fixed CVE-2026-9082 across every supported branch. Update to the fixed release for
your branch. Sites on unsupported branches (below the ranges shown) receive no fix and must
move to a supported release.
| Branch | Affected | Fixed in |
|---|---|---|
| 8.9.x – 10.4.x | 8.9.0 up to 10.4.9 | 10.4.10 |
| 10.5.x | 10.5.0 up to 10.5.9 | 10.5.10 |
| 10.6.x | 10.6.0 up to 10.6.8 | 10.6.9 |
| 11.0.x – 11.1.x | 11.0.0 up to 11.1.9 | 11.1.10 |
| 11.2.x | 11.2.0 up to 11.2.11 | 11.2.12 |
| 11.3.x | 11.3.0 up to 11.3.9 | 11.3.10 |
Drupal also published best-effort manual patches for the end-of-life 8.9 and 9.5 branches.
Confirm the installed version on the host with drush status or
composer show drupal/core rather than trusting an advertised version.
How the vulnerability works (detection-only)
We are deliberately not publishing a working injection string. The mechanics that matter for
defenders are:
- The entry point is an anonymous request to a JSON:API resource or the JSON login
endpoint. No credentials are required. - The crafted input is carried in query parameters that flow into an entity query. On
PostgreSQL, the abstraction layer fails to neutralize a special element, so attacker input
changes the structure of the executed SQL. - Successful injection yields read access to the database and, depending on database
privileges and site configuration, can be chained further.
Defenders have reported scanner traffic carrying markers such as
nuclei_sa_core_2026_004 against /jsonapi/node/article, which is a
useful thing to grep your own access logs for. If you see anonymous JSON:API requests with
unusual filter parameters that predate your patch, treat the host as potentially probed and
review database and application logs.
Quick manual checks
Before scaling this up, three checks tell you most of what you need on a single host:
- Is it Drupal, and what major version? Look for
<meta name="Generator" content="Drupal 11 ...">in the homepage source or
anX-Generator: Drupalresponse header. - What patch level? Request
/core/CHANGELOG.txt. Its first
line names the exact release, for exampleDrupal 11.3.10, 2026-05-20. Compare it
to the fixed-version table above. If the file has been removed, confirm on-host with
drush status. - Is JSON:API exposed? A GET to
/jsonapithat returns a JSON
document indicates the module is enabled and anonymously reachable, which is the path most
exploitation is using.
The Nuclei template
ProjectDiscovery ships an official template for this CVE, so if you run current
nuclei-templates you already have it:
# Confirm you have it, then run it against a host or a list
nuclei -id CVE-2026-9082 -u https://drupal.example.com
nuclei -id CVE-2026-9082 -l drupal-hosts.txt
The template is tagged drupal,sqli,postgresql,kev and is classified critical
(CWE-89). It works by exercising JSON:API content bundles such as article and
page to confirm the anonymous injection path, and it is marked verified. Keep your
templates current so KEV-tagged detections like this one are present:
nuclei -update-templates
If /core/CHANGELOG.txt is your only signal on a hardened host, a version
fingerprint is a reasonable fallback: any PostgreSQL Drupal below the fixed release for its
branch should be treated as exposed until proven patched.
Find every affected Drupal host with Sn1per
Running one template against one URL is easy. The real problem is knowing every Drupal
instance you own – staging copies, forgotten subdomains, an acquisition’s marketing site – and
running the check across all of them continuously. That is what
Sn1per is built for.
Sn1per handles the reconnaissance
that finds those hosts, fingerprints the technology on each one, and runs curated Nuclei
templates (including KEV-tagged CVEs like this one) as part of its
external attack surface management
pipeline. A typical workflow:
# Discover the surface, then run web detections into a persistent workspace
sniper -t example.com -m recon -w acme
sniper -t example.com -m web -w acme
# Or target a single known Drupal host
sniper -t https://drupal.example.com -m web -w acme
Findings land in the workspace with the affected URL and the matched evidence, so you can
triage the CVE-2026-9082 hits, confirm which are PostgreSQL-backed, and prioritize patching.
Because Sn1per re-runs on a schedule, a host that gets rolled back to a vulnerable image, or a
new subdomain that appears next quarter, is caught the next time the workspace scans rather
than never.
Which edition fits
| Edition | Best for | CVE detection at scale |
|---|---|---|
| Community | Single-target, ad-hoc recon | Manual, per-target |
| Professional | Individual pentesters and small teams | Workspaces, web UI, scheduled scans |
| Enterprise | Continuous attack surface management | Full ASM, scheduled re-scans, reporting, integrations |
Why on-premise matters here
Drupal SQL injection findings are sensitive: they map your unpatched, internet-facing,
database-backed systems. Sn1per runs entirely inside your own perimeter, so that inventory of
exposed hosts never leaves your control. For teams that will not send attack-surface data to a
third-party cloud scanner, a self-hosted platform is the difference between running the check
and not running it at all.
Remediation
- Patch now. Update Drupal core to the fixed release for your branch:
10.4.10, 10.5.10, 10.6.9, 11.1.10, 11.2.12 or 11.3.10 (or later). This is the only complete
fix. - Prioritize PostgreSQL sites. They are the exploitable population. If you
cannot patch immediately, put a WAF rule in front of JSON:API and the JSON login endpoint as
a temporary control, understanding that filtering is not a substitute for the update. - Hunt for prior exploitation. This CVE is actively exploited, so patching
is not enough on its own. Review access logs for anomalous anonymous JSON:API requests, check
for unexpected database queries or new users, and rotate secrets if you find evidence of
read access to the database. - Verify, do not assume. Confirm the running version on each host after
patching, and re-scan to prove the finding is cleared.
Frequently asked questions
Is CVE-2026-9082 being exploited in the wild?
Yes. It is in the CISA Known Exploited Vulnerabilities catalog and public reporting
describes thousands of exploitation attempts against Drupal sites. Treat internet-facing
PostgreSQL Drupal instances as an emergency.
My Drupal site uses MySQL. Am I affected?
The exploitable flaw is in PostgreSQL-specific query handling, so MySQL and MariaDB sites are
not exploitable through this issue. You should still update core to the fixed release on your
normal security cadence.
How do I check my Drupal version without attacking the site?
Request /core/CHANGELOG.txt and read the first line, or run
drush status / composer show drupal/core on the host. Compare against
the fixed-version table above. The generator meta tag only tells you the major version, which
is not enough to decide patch state.
Does Sn1per detect CVE-2026-9082?
Yes. Sn1per runs curated Nuclei templates as part of its scan pipeline, and the official
CVE-2026-9082 template is KEV-tagged and included in current template sets. Sn1per adds the
discovery and continuous-scanning layer so you find every Drupal host you own, not just the one
URL you already knew about.
Is scanning for this safe to run against production?
A version-fingerprint check against /core/CHANGELOG.txt is entirely
non-destructive. The official CVE template exercises the JSON:API detection path; run it in a
maintenance window if you are cautious, and never run a weaponized injection string against a
system you do not own.