Tutorial

PgBouncer 1.26.1: corregir CVE-2026-107350 (SCRAM)

Seguridad y monitorización12 min de lectura14 pasos

El 14 de octubre de 2026, PgBouncer 1.26.1 corrigió una evasión de autenticación SCRAM, CVE-2026-107350, y dos denegaciones de servicio. Los paquetes de las versiones estables de Debian seguían listados como vulnerables al comprobarlo, así que un simple `apt upgrade` no resuelve la cuestión. A veces nadie sabe qué versión de PgBouncer corre en un servidor, ni quién puede alcanzar su puerto. Esta guía da los comandos para comprobar la versión en pocos minutos, actualizar según la instalación (repositorio PGDG, RHEL, Docker, código fuente), aplicar mitigaciones mientras tanto y revisar los registros.

Contenido· Qué corrige PgBouncer 1.26.11/13
  1. 01Qué corrige PgBouncer 1.26.1
  2. 02Versiones afectadas y estado de los paquetes
  3. 03"Mi PgBouncer no está expuesto": un criterio insuficiente
  4. 04Lo que determina su exposición real
  5. 05Comprobar la versión y la exposición en pocos minutos
  6. 06Qué vía de actualización: el estado de los paquetes Debian
  7. 07Actualizar según su modo de instalación
  8. 08Reiniciar sin cortar a los clientes, y el caso search_path
  9. 09Mitigaciones mientras llega la corrección
  10. 10Revisar las huellas de una conexión suplantada
  11. 11Cerrar el expediente: de la versión al seguimiento
  12. 12En un VPS propio, usted controla las tres palancas
  13. 13La documentación oficial

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

CasoEstadoAcción
PgBouncer 1.17.0 a 1.26.0Afectado por CVE-2026-107350 si ambas cuentas usan SCRAMPasar a 1.26.1
PgBouncer 1.20.0 a 1.26.0Afectado 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.0Afectado por CVE-2026-107348 solo si `max_packet_size` supera 2147483648Pasar a 1.26.1
Debian bookworm, paquete 1.18.0-1+deb12u1Listado como vulnerable por el rastreador de seguridad de DebianRepositorio PGDG o compilación
Debian trixie, paquete 1.24.1-1+deb13u2Listado como vulnerable por el rastreador de seguridad de DebianRepositorio PGDG o compilación
Debian forky y sid, paquete 1.26.1-1CorregidoActualizar con apt
Imagen Docker de tercerosDepende de la versión incluidaComprobar `pgbouncer -V` dentro del contenedor
Versión anterior a 1.17.0Fuera del rango anunciado para CVE-2026-107350No 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_addr no 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_type y la naturaleza de las entradas del archivo indicado por auth_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_users abre 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_parameters no vacío sin options, o max_packet_size elevado 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

  1. Consultar la consola de administración

    psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW VERSION;"
    Solo los usuarios de admin_users o stats_users pueden conectarse. El comando SHOW VERSION muestra la cadena de versión de PgBouncer: tras la corrección, debe mencionar 1.26.1.

  2. Leer la versión del binario

    pgbouncer -V
    which -a pgbouncer
    A veces conviven varios binarios, el del paquete y otro bajo /usr/local tras una compilación. El primero de la lista no siempre es el que ejecuta el servicio.

  3. Leer la versión del paquete

    Debian y Ubuntu:
    dpkg -l pgbouncer
    apt-cache policy pgbouncer
    RHEL, AlmaLinux, Rocky:
    rpm -q pgbouncer
    dnf 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.

  4. 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 .ini que debe leer es el pasado como argumento al proceso, no necesariamente la ruta habitual.

  5. Ver quién puede alcanzar el puerto

    sudo ss -ltnp | grep 6432
    sudo ufw status numbered
    nc -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.

  6. Contar las cuentas SCRAM sin mostrar secretos

    grep -c 'SCRAM-SHA-256' /etc/pgbouncer/userlist.txt
    Sustituya la ruta por la de auth_file. No pegue nunca el contenido del archivo en un ticket o una conversación: contiene las huellas de sus contraseñas.

  7. Inventariar los contenedores

    docker ps
    docker port <container>
    docker exec <container> pgbouncer -V
    Un contenedor en ejecución conserva la imagen con la que arrancó. El resultado de docker port indica 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

  1. 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.

  2. Debian y Ubuntu: activar el repositorio PGDG

    sudo apt install -y postgresql-common ca-certificates
    sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
    apt-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.

  3. Debian y Ubuntu: instalar

    sudo apt update
    sudo apt install --only-upgrade pgbouncer
    pgbouncer -V
    Si dpkg propone reemplazar su archivo de configuración, conserve su versión local. pgbouncer -V confirma el binario instalado.

  4. 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 makecache
    dnf info pgbouncer
    sudo dnf upgrade pgbouncer
    Compruebe que la versión propuesta es 1.26.1 antes de confirmar.

  5. Docker y Compose

    docker compose pull pgbouncer
    docker compose up -d pgbouncer
    docker 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.

  6. Compilar desde el código fuente

    curl -LO https://www.pgbouncer.org/downloads/files/1.26.1/pgbouncer-1.26.1.tar.gz
    sha256sum 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.gz
    cd pgbouncer-1.26.1
    ./configure --prefix=/usr/local
    make
    sudo 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.

  7. Reiniciar y después comprobar

    sudo systemctl restart pgbouncer
    ps -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 ejecutar SHOW VERSION en 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 tcp
sudo ufw status numbered
sudo 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/

Un servidor cuya versión y cortafuegos usted controla

En un VPS Cloud con acceso root, usted elige la versión de PgBouncer, cierra el puerto 6432 a las máquinas previstas y lee sus propios registros. La opción de administración de VPS permite delegar ese seguimiento.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva