
CVE catalog
CVE-2026-12044
SQL injection in pgAdmin 4 across every dialog template that renders ``COMMENT ON ... IS '<description>'`` for a user-supplied description field. The Jinja templates for Domains (and their constraints
- Severity
- High · CVSS 8.8
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Published
- Source
- [NVD] · [CVE record]
- EPSS
- 0.71% · Oct 27, 2026
SQL injection in pgAdmin 4 across every dialog template that renders ``COMMENT ON ... IS '<description>'`` for a user-supplied description field. The Jinja templates for Domains (and their constraints), Foreign Tables, Languages, and Event Triggers, plus the Views OID-lookup query, interpolated the description directly inside a single-quoted SQL literal -- ``'{{ data.description }}'`` -- instead of passing it through the ``qtLiteral`` escape filter. An authenticated pgAdmin user with permission to create or alter the affected object types could submit a description containing an apostrophe, break out of the literal and chain arbitrary SQL. The injected SQL runs under the PostgreSQL role the user is already authenticated as; for a connected role with ``COPY ... TO/FROM PROGRAM`` (typically PostgreSQL superuser), this chains to OS command execution on the PostgreSQL host. The defect does not cross a privilege boundary -- the user already has direct SQL access to that role through pgAdmin's Query Tool -- so the attacker gains no capability beyond what their database role already grants. The marginal impact captures bypass of any application-layer Query Tool gating an operator may have configured. The defect was originally reported against the Domain Dialog ``description`` field; a code-wide audit identified sixteen sites of the same pattern across the templates listed above. The same review also surfaced ten related sinks in the pgstattuple/pgstatindex stats templates -- ``pgstattuple('{{schema}}.{{table}}')`` and the matching pgstatindex shape -- where ``qtIdent`` escapes embedded double quotes inside the identifier but not apostrophes, so a user with CREATE privilege on a schema could plant a table or index named ``foo'bar`` and a later stats viewer would render an unbalanced literal. Fix is layered: 1. Sites: replace every ``'{{ x.description }}'`` with ``{{ x.description|qtLiteral(conn) }}`` (no surrounding quotes -- the filter wraps the value in escaped quotes itself). Plumb ``conn=self.conn`` through every ``render_template`` call that loads one of these templates. Also corrects a ``{ % elif`` Jinja typo in the foreign-table schema diff (dead branch). Rewrite the ten pgstattuple/pgstatindex stats sites to address the relation via OID + ``::oid::regclass`` cast (e.g. ``pgstattuple({{ tid }}::oid::regclass)``), eliminating the embedded literal-call form entirely so that bug-class can no longer recur there. 2. Driver hardening: ``qtLiteral`` (in ``utils/driver/psycopg3/__init__.py``) used to silently return the raw unescaped value when its ``conn`` argument was falsy. It now raises ``ValueError`` -- surfacing the entire bug class going forward. The change immediately uncovered eight latent plumbing bugs (in ``schemas/__init__.py``, ``schemas/functions/__init__.py``, ``schemas/tables/utils.py``, ``foreign_servers/__init__.py``, and seven sites in ``roles/__init__.py``) -- all fixed as part of this patch. The inner ``except`` block that swallowed adapter-level failures and returned the raw value is also removed, so unadaptable inputs raise instead of leaking unescaped values. 3. Regression tests: a per-template behavioural test renders each previously-vulnerable template with an apostrophe-injection payload and asserts the escaped fragment is present and the vulnerable fragment absent; a lint test walks every ``*.sql`` template flagging any ``'{{ ... }}'`` single-quote-wrapped interpolation against an explicit allowlist; unit tests cover the new qtLiteral fail-fast and inner-except raise paths. This issue affects pgAdmin 4: from 1.0 before 9.16.
Vulnerable and fixed packages
Distribution-reported package versions and fixes. These do not depend on matching against the OpenFactory package catalog.
| Distribution | Package | Release | Version | Status |
|---|---|---|---|---|
| Cpe | pgadmin_4 | Not reported | 9.16 | fixed |
| Opensuse | pgadmin4 | tumbleweed | 9.17-1.1 | fixed |
| Cpe | pgadmin_4 | Not reported | 9.16 | fixed |
Fixed-version evidence
| Distribution | Package | Type | Release | Fixed version | Urgency | Origin | Bugs |
|---|---|---|---|---|---|---|---|
| Cpe | pgadmin_4 | cpe | Not reported | 9.16 | Not reported | Not reported | Not reported |
| Opensuse | pgadmin4 | rpm | tumbleweed | 9.17-1.1 | Not reported | OPENSUSE-SU-2026:11508-1 | Not reported |
| Cpe | pgadmin_4 | cpe | Not reported | 9.16 | Not reported | NVD-CVE-2026-12044 | Not reported |
OpenFactory catalog packages
[openSUSE Tumbleweed]
- [pgadmin4-desktop]Unknown
Source package: [pgadmin4]
Details (1)
9.17-1.1· noarch · tumbleweedUnknown · Fixed:
9.17-1.1Version impact unknown
nvd · pgadmin4 · opensuse · tumbleweed
- [pgadmin4-doc]Unknown
Source package: [pgadmin4]
Details (1)
9.17-1.1· noarch · tumbleweedUnknown · Fixed:
9.17-1.1Version impact unknown
nvd · pgadmin4 · opensuse · tumbleweed
- [pgadmin4-web-uwsgi]Unknown
Source package: [pgadmin4]
Details (1)
9.17-1.1· noarch · tumbleweedUnknown · Fixed:
9.17-1.1Version impact unknown
nvd · pgadmin4 · opensuse · tumbleweed
- [system-user-pgadmin]Unknown
Source package: [pgadmin4]
Details (1)
9.17-1.1· noarch · tumbleweedUnknown · Fixed:
9.17-1.1Version impact unknown
nvd · pgadmin4 · opensuse · tumbleweed
- [pgadmin4]Fixed
Source package: [pgadmin4]
Details (1)
9.17-1.1· noarch · tumbleweedFixed · Fixed:
9.17-1.1nvd · pgadmin4 · opensuse · tumbleweed
Observed:
References
- [https://ftp.suse.com/pub/projects/security/csaf/opensuse-su-2026_11508-1.json]
- [https://github.com/pgadmin-org/pgadmin4/commit/2ae0d3610]
- [https://github.com/pgadmin-org/pgadmin4/commit/658bb585d]
- [https://github.com/pgadmin-org/pgadmin4/issues/10078]
- [https://nvd.nist.gov/vuln/detail/CVE-2026-12044]
- [https://osv.dev/vulnerability/openSUSE-SU-2026:11508-1]
- [https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-12044.json]
- [https://wid.cert-bund.de/.well-known/csaf/white/2026/wid-sec-w-2026-2005.json]
[CERT-Bund public advisories] · [FIRST EPSS] · [National Vulnerability Database (NVD)] · [OSV Package Vulnerability Database] · [Red Hat security advisories and VEX] · [SUSE security advisories and VEX]