CVE-2026-17351
pgAdmin 4: Bypass de transação somente leitura do Assistente de IA por divergência entre o lexer do sqlparse/PostgreSQL (correção incompleta para CVE-2026-12045)
- Publicado
- 31 de jul. de 2026
- Atualizado
- 1 de ago. de 2026
- Atribuindo CNA
- PostgreSQL
- Evidência observada
- 8 de ago. de 2026
CVSS primário
nvd · CVSS 4.0
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:XBaixo · próximos 30 dias
- Percentil
- 34,6%
- Data do modelo
- 21 de set. de 2026
EPSS é uma estimativa estatística, não uma certeza ou uma medida de impacto. Combine-o com CVSS, status KEV, exposição e seu ambiente.
Resumo
A correção para CVE-2026-12045 no pgAdmin 4 9.16 exigia que a consulta fornecida pela LLM passada para a ferramenta execute_sql_query do AI Assistant fosse analisada, via sqlparse, como exatamente uma única instrução que não fosse de controle de transação antes de ser executada dentro de um wrapper BEGIN TRANSACTION READ ONLY. A análise de literais de string do sqlparse pode discordar do próprio parser do PostgreSQL: com standard_conforming_strings = on (o padrão do PostgreSQL desde 9.1), uma barra invertida imediatamente antes de uma aspa é um caractere comum para o PostgreSQL, mas o sqlparse a trata como escape da aspa. Um payload como SELECT '\';COMMIT;CREATE TABLE pwn(x int);SELECT 1 --' portanto é analisado como um único SELECT pelo validador do sqlparse, enquanto o PostgreSQL o executa como quatro instruções: o COMMIT contrabandeado encerra a transação somente leitura do wrapper, e o ROLLBACK final torna-se um no-op. Isso reintroduz a mesma bypass de escrita/RCE que CVE-2026-12045 pretendia fechar, alcançável pela mesma entrega indireta de injeção de prompt (um atacante planta o payload em qualquer objeto que o AI Assistant possa ler; a LLM o emite como uma chamada de ferramenta). Uma correção candidata inicial executava a consulta com execute(..., prepare=True) do psycopg, pretendendo forçar a própria etapa Parse do PostgreSQL (protocolo de consulta estendido) a rejeitar texto com múltiplas instruções, independentemente da classificação do sqlparse. Essa correção candidata não funciona como submetida: o PrepareManager do psycopg3 ignora silenciosamente o argumento prepare sempre que o prepare_threshold da conexão é None, que é o padrão do pgAdmin para toda conexão de servidor (o campo "Prepare threshold" por servidor fica em branco a menos que um administrador o defina explicitamente) — o psycopg3 recorre ao protocolo de consulta simples, o mesmo caminho com capacidade de múltiplas instruções que a bypass explora, então a correção candidata não fecha nada em qualquer configuração padrão do mundo real. A correção corrigida define conn.prepare_threshold = 0 diretamente na conexão somente leitura dedicada e de uso único que a ferramenta do AI Assistant abre, forçando estruturalmente o protocolo de consulta estendido, independentemente de qualquer configuração no nível do servidor. Verificado contra uma instância PostgreSQL 18 ativa: o payload é executado com sucesso sob o comportamento prepare_threshold=None (padrão) e é rejeitado com "cannot insert multiple commands into a prepared statement" uma vez que prepare_threshold=0 é definido nessa conexão. Esse problema afeta o pgAdmin 4: da versão 9.13 até antes da 9.17.
Uso responsável
Use informações de vulnerabilidade apenas em sistemas que você possui ou está autorizado a testar. O Kitploit vincula-se a metadados de pesquisa pública e não armazena código de exploração ou cargas maliciosas.