PostgreSQL lanza actualizaciones que solucionan el fallo en libpq
Hace pocos días, PostgreSQL dio a conocer el lanzamiento de las actualizaciones correctivas para todas las ramas compatibles de PostgreSQL (versiones 17.3, 16.7, 15.11, 14.16 y 13.19). Estas actualizaciones, que corrigen más de 70 errores y sobre todo eliminan la vulnerabilidad identificada como CVE-2025-1094, vinculada a un ataque que afectó a BeyondTrust y al Departamento del Tesoro de EE. UU. a fines de diciembre.
La vulnerabilidad fue detectada durante el análisis de otra falla remota (CVE-2024-12356) en los servicios BeyondTrust PRA (Privileged Remote Access) y BeyondTrust RS (Remote Support), y se vio agravada por la presencia de una vulnerabilidad previamente desconocida (0-day) en la biblioteca libpq.
Sobre la vulnerabilidad que afecto a BeyondTrust
Se menciona que el fallo en PostgreSQL se originó en libpq, la biblioteca que proporciona la API para interactuar con PostgreSQL desde programas escritos en C, y que también es la base para los enlaces en C++, Perl, PHP y Python.
La vulnerabilidad reside en el manejo inadecuado de la validación de caracteres Unicode en funciones cruciales de escape. Estas funciones son fundamentales para neutralizar caracteres especiales en las consultas SQL y evitar inyecciones de código. Sin embargo, la falta de validación adecuada permite que ciertas secuencias multibyte UTF-8 no válidas eludan la normalización de las comillas.
Método de ataque
Este fallo permite la sustitución de SQL en aplicaciones que utilizan estas funciones para procesar consultas, especialmente cuando las consultas se envían a través de la utilidad de línea de comandos psql. Por ejemplo, se puede aprovechar esta vulnerabilidad para ejecutar comandos arbitrarios en el servidor mediante la sustitución en la línea de comandos «!», como se demostró con un ejemplo en el que se invocó la utilidad «id».
La explotación se basa en la utilización de un carácter UTF-8 no válido, formado por los bytes 0xC0 y 0x27. El byte 0x27 corresponde a una comilla simple en ASCII, que normalmente se escaparía para evitar problemas de inyección SQL. Pero al combinarse con 0xC0, la secuencia se interpreta como un único carácter Unicode, dejando la comilla simple sin escapar.
Impacto del ataque
Como resultado de esta vulnerabilidad, los atacantes lograron obtener una clave de acceso a la API que se utiliza para ofrecer soporte remoto a través de los servicios BeyondTrust SaaS. Con esta clave, se pudo restablecer contraseñas y comprometer la infraestructura del Departamento del Tesoro de EE. UU., accediendo a documentos confidenciales y a estaciones de trabajo de empleados. El ataque expuso serios fallos en la cadena de seguridad, destacando la importancia de contar con mecanismos robustos de validación de entrada en bibliotecas tan críticas como libpq.
Actualizaciones y medidas correctivas
Ante este panorama, el equipo de PostgreSQL ha implementado actualizaciones que corrigen esta vulnerabilidad y una serie de errores adicionales. La solución reside en mejorar la validación de caracteres en las funciones de escape, garantizando que cualquier secuencia UTF-8 se procese correctamente y evitando que se interprete de forma errónea una comilla simple.
Además de ello, como ya se mencionó, esta actualización, corrige más de 70 errores que se informaron en los últimos meses:
- Se soluciona la posible reutilización de resultados obsoletos en agregados de ventanas, lo que podría generar resultados incorrectos.
- Varias correcciones de condiciones de carrera para el vacío que, en el peor de los casos, podrían provocar daños en un catálogo del sistema.
- Varias correcciones para truncar tablas e índices que evitan posibles daños.
- Solución para separar una partición donde su propia restricción de clave externa hace referencia a una tabla particionada.
- Corrección de los códigos de formato FFn(por ejemplo, FF1) to_timestamp, donde un código de formato entero antes de FFnconsumiría todos los dígitos disponibles.
- Correcciones para SQL/JSON y XMLTABLE()para poner comillas dobles en entradas específicas cuando sea necesario.
- Incluir la ldapschemeopción en pg_hba_file_rules().
- Varias correcciones para UNION, incluida la de no fusionar columnas con intercalaciones no compatibles.
- Varias correcciones que podrían afectar la disponibilidad o la velocidad de inicio de una conexión a PostgreSQL.
- Corrige múltiples fugas de memoria en la salida de decodificación lógica.
- Corrige varias pérdidas de memoria en PL/Python.
- Corrección de una pérdida de memoria pg_restore con datos comprimidos en zstd.
- Corrección pg_basebackup para manejar correctamente archivos pg_wal.tar que superen los 2 GB en Windows.
- Se soluciona el fallo en pageinspect en instancias donde la brin_page_items()definición de la función no está actualizada a la última versión.
- Corrige la condición de carrera al intentar cancelar una postgres_fdw consulta remota.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.