{"id":"CVE-2026-12050","title":"SQL injection in pgAdmin 4's named restore point endpoint (POST /browser/server/restore_point/{gid}/{sid})","summary":"SQL injection in pgAdmin 4's named restore point endpoint (POST /browser/server/restore_point/{gid}/{sid}). The user-supplied 'value' field was interpolated directly into the SQL string with str.format() instead of being passed as a boun…","severity":"medium","cvss":4.3,"cvssVector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N","cwe":["CWE-89"],"vendor":"pgadmin","product":"pgadmin_4","affected":["pgadmin_4 >= 1.0, < 9.16"],"patched":["pgadmin_4 9.16"],"published":"2026-06-19","updated":"2026-06-29","source":"NVD","sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-12050","references":[{"url":"https://github.com/pgadmin-org/pgadmin4/commit/3379c39865d3ab6f52afce97361fb16bcdd77cd2","label":"f86ef6dc-4d3a-42ad-8f28-e6d5547a5007"},{"url":"https://github.com/pgadmin-org/pgadmin4/issues/10026","label":"f86ef6dc-4d3a-42ad-8f28-e6d5547a5007"}],"tags":["nvd"],"epss":0.00426,"epssPercentile":0.36529,"ingestedAt":"2026-06-29T15:48:27.687Z","slug":"CVE-2026-12050","body":"## Overview\n\nSQL injection in pgAdmin 4's named restore point endpoint (POST /browser/server/restore_point/{gid}/{sid}). The user-supplied 'value' field was interpolated directly into the SQL string with str.format() instead of being passed as a bound parameter, allowing an authenticated pgAdmin user with a connected PostgreSQL session to inject additional statements through that endpoint.\n\nThe injected SQL executes under the database role the user is already authenticated as. The defect does not cross a privilege boundary -- the user already has direct SQL access to that role through the Query Tool -- so the attacker gains no capability beyond what their database role already grants them. The marginal impact accounts for the fact that the injection path is not the documented SQL-execution interface, so a deployment that gates the Query Tool at the application layer could see SQL executed through a path it did not anticipate.\n\nFix passes the restore point name as a bound parameter and schema-qualifies the function call as pg_catalog.pg_create_restore_point so a non-default search_path on the connection cannot redirect the call to a shadow definition. A regression test asserts the value arrives as a bound parameter and not spliced into the SQL string.\n\nThis issue affects pgAdmin 4: from 1.0 before 9.16.\n\n## Affected\n\n- `pgadmin_4 >= 1.0, < 9.16`\n\n## Remediation\n\nUpgrade past the affected range:\n\n- `pgadmin_4 9.16`","depth":"sunlit","depthScore":24,"depthScoreParts":{"impact":23.7,"likelihood":0.1,"exploitation":0,"ransomware":0},"changes":[]}