Qué corrige PgBouncer 1.26.1
El 14 de octubre de 2026, el proyecto PgBouncer publicó la versión 1.26.1, que corrige tres fallos. El más serio, CVE-2026-107350, es una evasión de autenticación: un cliente que conoce la contraseña de un usuario SCRAM puede conectarse como cualquier otro usuario SCRAM, incluidos los administradores de PgBouncer y los superusuarios de PostgreSQL. El mecanismo es un segundo mensaje de inicio, el StartupMessage, procesado durante la autenticación SCRAM cuando la conexión apunta a una base de datos inexistente. Según la descripción de Mend, el intercambio SCRAM se sigue verificando con las claves del primer usuario, mientras que la sesión se abre con la identidad del segundo. El changelog precisa que el ataque exige SCRAM en ambos usuarios.
Los otros dos fallos son denegaciones de servicio, activables sin autenticación pero solo con ciertas opciones de configuración: CVE-2026-107349 y CVE-2026-107348. Mend asigna a CVE-2026-107350 una puntuación CVSS v4 de 8,7. La puntuación importa menos que una pregunta práctica: qué versión corre en sus máquinas y quién puede alcanzar el puerto 6432.
Versiones afectadas y estado de los paquetes
Desplace la tabla
| Caso | Estado | Acción |
|---|---|---|
| PgBouncer 1.17.0 a 1.26.0 | Afectado por CVE-2026-107350 si ambas cuentas usan SCRAM | Pasar a 1.26.1 |
| PgBouncer 1.20.0 a 1.26.0 | Afectado por CVE-2026-107349 si `ignore_startup_parameters` no está vacío y no incluye `options` | Pasar a 1.26.1 |
| PgBouncer 1.21.0 a 1.26.0 | Afectado por CVE-2026-107348 solo si `max_packet_size` supera 2147483648 | Pasar a 1.26.1 |
| Debian bookworm, paquete 1.18.0-1+deb12u1 | Listado como vulnerable por el rastreador de seguridad de Debian | Repositorio PGDG o compilación |
| Debian trixie, paquete 1.24.1-1+deb13u2 | Listado como vulnerable por el rastreador de seguridad de Debian | Repositorio PGDG o compilación |
| Debian forky y sid, paquete 1.26.1-1 | Corregido | Actualizar con apt |
| Imagen Docker de terceros | Depende de la versión incluida | Comprobar `pgbouncer -V` dentro del contenedor |
| Versión anterior a 1.17.0 | Fuera del rango anunciado para CVE-2026-107350 | No conformarse, planificar la actualización |
"Mi PgBouncer no está expuesto": un criterio insuficiente
La objeción es legítima: un PgBouncer que solo escucha en una dirección privada no es accesible desde Internet. Pero el ataque no requiere fuerza bruta. Basta conocer la contraseña de un único usuario SCRAM válido y poder alcanzar el puerto. La contraseña de una aplicación vive en un archivo .env, una variable de CI, un equipo de desarrollo, a veces un registro. Una aplicación comprometida aporta a la vez la contraseña y la posición de red. Desde ahí, el fallo convierte una cuenta de aplicación limitada en una cuenta de administración, o incluso en superusuario del servidor PostgreSQL que hay detrás.
El criterio que decide no es entonces "Internet o no", sino dos preguntas: quién puede abrir una conexión al puerto 6432 y cuántas contraseñas válidas circulan. Una versión vulnerable tras un cortafuegos estricto es un riesgo reducido, no eliminado.
Lo que determina su exposición real
- Dirección de escucha —
listen_addrno tiene valor por defecto: sin él, PgBouncer solo acepta sockets Unix. El valor*abre todas las interfaces. - Tipo de autenticación — el ataque exige SCRAM en ambos usuarios. Revise
auth_typey la naturaleza de las entradas del archivo indicado porauth_file. - Número de cuentas — cada contraseña válida es una puerta de entrada hacia todas las demás cuentas SCRAM. Diez cuentas de aplicación son diez llaves de la misma puerta.
- Cuentas de administración —
admin_usersabre la consola, y el rol usado para llegar a PostgreSQL puede ser un superusuario. - Docker y cortafuegos — un puerto publicado por Docker pasa por sus propias reglas de red, que a menudo eluden las de ufw. Compruebe cómo se publica el puerto, no solo el cortafuegos.
- Opciones ligadas a las denegaciones de servicio —
ignore_startup_parametersno vacío sinoptions, omax_packet_sizeelevado por encima de su valor por defecto. - Contenedores y pilas integradas — un PgBouncer entregado en una pila Compose o un chart conserva la versión de su imagen, sea cual sea la del servidor anfitrión.
Comprobar la versión y la exposición en pocos minutos
Consultar la consola de administración
psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW VERSION;"
Solo los usuarios deadmin_usersostats_userspueden conectarse. El comandoSHOW VERSIONmuestra la cadena de versión de PgBouncer: tras la corrección, debe mencionar 1.26.1.Leer la versión del binario
pgbouncer -Vwhich -a pgbouncer
A veces conviven varios binarios, el del paquete y otro bajo/usr/localtras una compilación. El primero de la lista no siempre es el que ejecuta el servicio.Leer la versión del paquete
Debian y Ubuntu:
dpkg -l pgbouncerapt-cache policy pgbouncer
RHEL, AlmaLinux, Rocky:rpm -q pgbouncerdnf info pgbouncer
Compare con la tabla anterior. Un paquete de distribución puede recibir una corrección sin cambiar su número de versión original: confíe más en el rastreador de seguridad de la distribución que en el número por sí solo.Releer la configuración realmente cargada
ps -eo pid,args | grep '[p]gbouncer'grep -nE '^(listen_addr|listen_port|auth_type|auth_file|admin_users|ignore_startup_parameters|max_packet_size)' /etc/pgbouncer/pgbouncer.ini
El archivo.inique debe leer es el pasado como argumento al proceso, no necesariamente la ruta habitual.Ver quién puede alcanzar el puerto
sudo ss -ltnp | grep 6432sudo ufw status numberednc -vz <server_ip> 6432
El último comando, lanzado desde otra máquina, indica si el puerto responde fuera de la red prevista. Una respuesta inesperada exige una decisión inmediata sobre el cortafuegos.Contar las cuentas SCRAM sin mostrar secretos
grep -c 'SCRAM-SHA-256' /etc/pgbouncer/userlist.txt
Sustituya la ruta por la deauth_file. No pegue nunca el contenido del archivo en un ticket o una conversación: contiene las huellas de sus contraseñas.Inventariar los contenedores
docker psdocker port <container>docker exec <container> pgbouncer -V
Un contenedor en ejecución conserva la imagen con la que arrancó. El resultado dedocker portindica si el puerto está publicado en el anfitrión.
Qué vía de actualización: el estado de los paquetes Debian
En el momento de redactar esto, el rastreador de seguridad de Debian lista bookworm (1.18.0-1+deb12u1) y trixie (1.24.1-1+deb13u2) como vulnerables a CVE-2026-107350, y solo forky y sid disponen del paquete corregido 1.26.1-1. Mientras Debian no publique una corrección para su versión, apt upgrade por sí solo no protege. Vuelva a consultar el rastreador el día en que actúe: el estado puede haber cambiado.
Existen tres vías. La primera: el repositorio PGDG, apt.postgresql.org para Debian y Ubuntu, yum.postgresql.org para RHEL y derivadas, que la página de descargas de PgBouncer presenta como compilaciones a veces más recientes que las de las distribuciones. La segunda: una imagen Docker o una etiqueta actualizada, sabiendo que el proyecto no menciona ninguna imagen oficial y que usted usa por tanto una imagen de terceros. La tercera: compilar el archivo de código fuente de la versión 1.26.1. Antes de cambiar, confirme con apt-cache policy pgbouncer o dnf info pgbouncer que el repositorio ofrece realmente la versión corregida.
Actualizar según su modo de instalación
Respaldar la configuración
sudo cp -a /etc/pgbouncer /root/pgbouncer-etc-backup
Esta copia permite volver atrás si una actualización reemplaza un archivo. Anote también la versión actual antes de empezar.Debian y Ubuntu: activar el repositorio PGDG
sudo apt install -y postgresql-common ca-certificatessudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.shapt-cache policy pgbouncer
El script oficial configura el repositorio apt.postgresql.org. El último comando debe mostrar un candidato 1.26.1; si falta, no avance más por esta vía.Debian y Ubuntu: instalar
sudo apt updatesudo apt install --only-upgrade pgbouncerpgbouncer -V
Si dpkg propone reemplazar su archivo de configuración, conserve su versión local.pgbouncer -Vconfirma el binario instalado.RHEL, AlmaLinux y Rocky
Añada el repositorio PGDG con los comandos que genera el selector de yum.postgresql.org para su distribución y después:
sudo dnf makecachednf info pgbouncersudo dnf upgrade pgbouncer
Compruebe que la versión propuesta es 1.26.1 antes de confirmar.Docker y Compose
docker compose pull pgbouncerdocker compose up -d pgbouncerdocker compose exec pgbouncer pgbouncer -V
Si la imagen está fijada a una etiqueta o un digest antiguo, actualice primero esa referencia en su archivo Compose. Si no existe ninguna etiqueta 1.26.1, construya la imagen desde el código fuente.Compilar desde el código fuente
curl -LO https://www.pgbouncer.org/downloads/files/1.26.1/pgbouncer-1.26.1.tar.gzsha256sum pgbouncer-1.26.1.tar.gz
Compare la suma obtenida con la publicada en la página de descargas antes de continuar.tar xzf pgbouncer-1.26.1.tar.gzcd pgbouncer-1.26.1./configure --prefix=/usr/localmakesudo make install
La compilación requiere libevent 2.0 o superior, OpenSSL 1.0.1 o superior y un compilador C11. La documentación recomienda Autoconf para producción.Reiniciar y después comprobar
sudo systemctl restart pgbouncerps -o lstart= -p $(pgrep -o pgbouncer)sudo readlink -f /proc/$(pgrep -o pgbouncer)/exe
Una recarga no basta: el proceso debe arrancar de nuevo con el nuevo binario. La hora de inicio y la ruta del ejecutable lo demuestran. Por último, vuelva a ejecutarSHOW VERSIONen la consola.
Reiniciar sin cortar a los clientes, y el caso search_path
Un reinicio corta las conexiones abiertas. La documentación describe una alternativa: varios procesos en el mismo puerto con so_reuseport, y después SHUTDOWN WAIT_FOR_CLIENTS en un proceso cada vez mientras los clientes se reconectan. Otro punto de atención: desde la versión 1.26.0, search_path se rastrea por defecto, y 1.26.1 hace que ignore_startup_parameters prevalezca sobre los parámetros rastreados. Si una aplicación enviaba search_path al iniciar y usted contaba con ignorarlo, añada ignore_startup_parameters = search_path a la configuración para recuperar el comportamiento de la 1.25.
Mitigaciones mientras llega la corrección
Para CVE-2026-107350, el anuncio no da ninguna mitigación de configuración: la actualización es la única respuesta real. Sí puede reducir quién tiene la oportunidad de intentarlo. Limite el puerto 6432 a la red de aplicaciones:sudo ufw allow from <app_subnet> to any port 6432 proto tcpsudo ufw status numberedsudo ufw delete <n>
Aquí <n> es el número de una regla más amplia ya presente, por ejemplo una que abre el puerto 6432 a todos, que se elimina una vez colocada la regla restringida. En RHEL y derivadas, la misma regla se define con firewalld. Si listen_addr vale *, sustitúyalo por la dirección privada del servidor. Después audite el archivo auth_file: elimine las cuentas sin uso, cambie las contraseñas que hayan circulado y reduzca admin_users al mínimo imprescindible.
Para las dos denegaciones de servicio, lo que sigue es nuestra lectura de las condiciones del changelog, no una consigna del editor. CVE-2026-107349 supone ignore_startup_parameters no vacío y sin options: añadir options a la lista elimina la condición; vaciar el parámetro también, pero puede provocar el rechazo de clientes que envían parámetros de inicio (véase el caso de search_path más arriba). CVE-2026-107348 supone un max_packet_size superior a 2147483648: mantener el valor por defecto, 2147483647, lo descarta.
Revisar las huellas de una conexión suplantada
PgBouncer registra por defecto las conexiones logradas y las desconexiones, con su motivo, gracias a log_connections y log_disconnections. Lea el periodo posterior a la publicación de las correcciones, y más atrás si sus registros lo permiten:sudo journalctl -u pgbouncer --since "2026-10-14"
Busque intentos hacia nombres de base de datos que no existen en su sección [databases], seguidos de una sesión abierta justo después con otro nombre de usuario desde la misma dirección. En la consola, estos dos comandos muestran el estado actual:psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW DATABASES;"psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW CLIENTS;"
Del lado de PostgreSQL, liste los roles y sus cambios recientes con psql -c "\du".
No disponemos de una firma exacta de este ataque en los registros, y no la inventamos. La ausencia de huellas no prueba la ausencia de intrusión, sobre todo si log_connections estaba desactivado o si los registros han rotado. Ante una duda seria, cambie las contraseñas de todas las cuentas SCRAM y de los roles privilegiados del servidor PostgreSQL.
Cerrar el expediente: de la versión al seguimiento
Una actualización lograda se demuestra, no se supone. Para cada servidor, anote en una tabla la máquina, el modo de instalación, la versión antes y después, la regla de cortafuegos aplicada y la fecha de la comprobación. Verifique que SHOW VERSION anuncia 1.26.1, que el proceso se reinició tras la instalación y que el puerto 6432 solo es accesible desde la red prevista. Confirme también que sus dos ajustes de denegación de servicio respetan las condiciones descritas antes, o que han quedado sin objeto.
Por último, no cuente con las actualizaciones automáticas: un paquete de distribución sin corregir no se actualiza solo, y una imagen Docker fijada tampoco. Añada un recordatorio para volver a consultar el rastreador de seguridad de su distribución y pase a su paquete cuando esté corregido, o mantenga el repositorio PGDG de forma deliberada.
En un VPS propio, usted controla las tres palancas
Corregir PgBouncer requiere tres accesos: elegir la versión instalada, definir el cortafuegos del puerto 6432 y leer los registros. En un VPS Cloud con acceso root, esas tres palancas son suyas, sin depender del calendario de un alojamiento compartido. Las guías enlazadas bajo este artículo detallan el cortafuegos y la puesta en marcha de PostgreSQL. Esta guía se ofrece sin soporte: la actualización queda a su cargo. Si prefiere delegar la administración del servidor, existe la opción de administración de VPS, que conviene valorar según su necesidad.
La documentación oficial
Anuncio de la versión 1.26.1: https://www.postgresql.org/about/news/pgbouncer-1261-released-fixes-three-cves-3403/
Registro de cambios de PgBouncer: https://www.pgbouncer.org/changelog.html
Descargas de PgBouncer: https://www.pgbouncer.org/downloads/
Uso y consola de administración: https://www.pgbouncer.org/usage.html
Configuración de PgBouncer: https://www.pgbouncer.org/config.html
Rastreador de seguridad de Debian para CVE-2026-107350: https://security-tracker.debian.org/tracker/CVE-2026-107350
Ficha de Mend de CVE-2026-107350: https://www.mend.io/vulnerability-database/CVE-2026-107350/
Repositorio apt de PostgreSQL: https://wiki.postgresql.org/wiki/Apt
Repositorio yum de PostgreSQL: https://yum.postgresql.org/
Docker y cortafuegos: https://docs.docker.com/engine/network/packet-filtering-firewalls/