CVE-2026-17351
pgAdmin 4: Bypass de transacción de solo lectura del Asistente de IA mediante discrepancia entre el lexer de sqlparse/PostgreSQL (corrección incompleta para CVE-2026-12045)
- Publicado
- 31 jul 2026
- Actualizado
- 1 ago 2026
- Asignación de CNA
- PostgreSQL
- Evidencia observada
- 8 ago 2026
CVSS primario
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:XBajo · próximos 30 días
- Percentil
- 34,6 %
- Fecha del modelo
- 21 sept 2026
EPSS es una estimación estadística, no una certeza o una medida de impacto. Combínelo con CVSS, estado KEV, exposición y su entorno.
Resumen
La corrección para CVE-2026-12045 en pgAdmin 4 9.16 requería que la consulta suministrada por el LLM pasada a la herramienta execute_sql_query del Asistente de IA se analizara, mediante sqlparse, como exactamente una sentencia que no fuera de control de transacciones antes de ejecutarla dentro de un envoltorio BEGIN TRANSACTION READ ONLY. El análisis léxico de literales de cadena de sqlparse puede discrepar con el propio analizador de PostgreSQL: con standard_conforming_strings = on (el valor predeterminado de PostgreSQL desde 9.1), una barra invertida inmediatamente antes de una comilla es un carácter ordinario para PostgreSQL, pero sqlparse la trata como si escapara la comilla. Por lo tanto, una carga útil como SELECT '\';COMMIT;CREATE TABLE pwn(x int);SELECT 1 --' se analiza como un único SELECT para el validador de sqlparse, mientras que PostgreSQL la ejecuta como cuatro sentencias: el COMMIT introducido de forma encubierta finaliza la transacción de solo lectura envolvente, y el ROLLBACK final se convierte en un no-op. Esto reintroduce la misma evasión de escritura/RCE que CVE-2026-12045 pretendía cerrar, alcanzable mediante el mismo método de entrega indirecta por inyección de indicaciones (un atacante coloca la carga útil en cualquier objeto que el Asistente de IA pueda leer; el LLM la emite como una llamada a herramienta). Una corrección candidata inicial ejecutaba la consulta con execute(..., prepare=True) de psycopg, con la intención de forzar el propio paso Parse de PostgreSQL (protocolo de consulta extendido) para rechazar texto con múltiples sentencias independientemente de la clasificación de sqlparse. Esta corrección candidata no funciona tal como se presentó: el PrepareManager de psycopg3 ignora silenciosamente el argumento prepare siempre que prepare_threshold de la conexión sea None, que es el valor predeterminado de pgAdmin para cada conexión de servidor (el campo "Umbral de preparación" por servidor está en blanco a menos que un administrador lo establezca explícitamente) — psycopg3 recurre al protocolo de consulta simple, la misma vía capaz de múltiples sentencias que explota la evasión, por lo que la corrección candidata no cierra nada en ninguna configuración predeterminada del mundo real. La corrección corregida establece conn.prepare_threshold = 0 directamente en la conexión de solo lectura dedicada y de un solo uso que abre la herramienta del Asistente de IA, forzando estructuralmente el protocolo de consulta extendido independientemente de cualquier configuración a nivel de servidor. Verificado contra una instancia real de PostgreSQL 18: la carga útil se ejecuta correctamente bajo el comportamiento prepare_threshold=None (predeterminado), y se rechaza con "cannot insert multiple commands into a prepared statement" una vez que se establece prepare_threshold=0 en esa conexión. Este problema afecta a pgAdmin 4: desde 9.13 hasta antes de 9.17.
Uso responsable
Utilice información sobre vulnerabilidades solo en sistemas de su propiedad o que esté autorizado a probar. Kitploit enlaza con metadatos de investigación pública y no almacena código de explotación ni cargas útiles maliciosas.