Ce que corrige PgBouncer 1.26.1
Le 14 octobre 2026, le projet PgBouncer a publié la version 1.26.1, qui corrige trois failles. La plus sérieuse, CVE-2026-107350, est un contournement d'authentification : un client qui connaît le mot de passe d'un utilisateur SCRAM peut se connecter comme n'importe quel autre utilisateur SCRAM, y compris les administrateurs de PgBouncer et les superutilisateurs de PostgreSQL. Le mécanisme tient à un deuxième message de démarrage, le StartupMessage, traité pendant l'authentification SCRAM lorsque la connexion vise une base inexistante. D'après la description de Mend, l'échange SCRAM reste vérifié avec les clés du premier utilisateur, tandis que la session s'ouvre sous l'identité du second. Le changelog précise que l'attaque exige SCRAM pour les deux utilisateurs.
Les deux autres failles sont des dénis de service, déclenchables sans authentification, mais seulement sous certaines options de configuration : CVE-2026-107349 et CVE-2026-107348. Mend attribue à CVE-2026-107350 un score CVSS v4 de 8,7. Le score compte moins qu'une question pratique : quelle version tourne chez vous, et qui peut atteindre le port 6432 ?
Versions touchées et état des paquets
Faites défiler le tableau
| Cas de figure | Statut | Action |
|---|---|---|
| PgBouncer 1.17.0 à 1.26.0 | Touché par CVE-2026-107350, si SCRAM est utilisé pour les deux comptes | Passer en 1.26.1 |
| PgBouncer 1.20.0 à 1.26.0 | Touché par CVE-2026-107349 si `ignore_startup_parameters` est non vide sans `options` | Passer en 1.26.1 |
| PgBouncer 1.21.0 à 1.26.0 | Touché par CVE-2026-107348 seulement si `max_packet_size` dépasse 2147483648 | Passer en 1.26.1 |
| Debian bookworm, paquet 1.18.0-1+deb12u1 | Listé vulnérable par le suivi de sécurité Debian | Dépôt PGDG ou compilation |
| Debian trixie, paquet 1.24.1-1+deb13u2 | Listé vulnérable par le suivi de sécurité Debian | Dépôt PGDG ou compilation |
| Debian forky et sid, paquet 1.26.1-1 | Corrigé | Mise à jour par apt |
| Image Docker tierce | Dépend de la version embarquée | Vérifier `pgbouncer -V` dans le conteneur |
| Version antérieure à 1.17.0 | Hors plage annoncée pour CVE-2026-107350 | Ne pas s'en contenter, planifier la mise à jour |
« Mon PgBouncer n'est pas exposé » : un critère insuffisant
L'objection est légitime : un PgBouncer qui n'écoute que sur une adresse privée n'est pas joignable depuis Internet. Mais l'attaque ne demande pas de force brute. Il suffit de connaître le mot de passe d'un seul utilisateur SCRAM valide, et de pouvoir joindre le port. Or le mot de passe d'une application vit dans un fichier .env, une variable de CI, un poste de développement, parfois un journal. Une application compromise fournit à la fois le mot de passe et la position réseau. Depuis cette position, la faille transforme un compte applicatif limité en compte d'administration, voire en superutilisateur du serveur PostgreSQL derrière.
Le critère qui tranche n'est donc pas « Internet ou pas Internet », mais deux questions : qui peut ouvrir une connexion vers le port 6432, et combien de mots de passe valides circulent. Une version vulnérable derrière un pare-feu strict est un risque réduit, pas supprimé.
Ce qui détermine votre exposition réelle
- Adresse d'écoute —
listen_addrn'a pas de valeur par défaut : sans lui, PgBouncer n'accepte que les sockets Unix. La valeur*ouvre toutes les interfaces. - Type d'authentification — l'attaque exige SCRAM pour les deux utilisateurs. Regardez
auth_typeet la nature des entrées du fichier désigné parauth_file. - Nombre de comptes — chaque mot de passe valide est un point d'entrée vers tous les autres comptes SCRAM. Dix comptes applicatifs, c'est dix clés vers la même porte.
- Comptes d'administration —
admin_usersouvre la console, et le rôle utilisé pour joindre PostgreSQL peut être un superutilisateur. - Docker et pare-feu — un port publié par Docker passe par ses propres règles réseau, qui contournent souvent celles d'ufw. Vérifiez la publication du port, pas seulement le pare-feu.
- Options liées aux dénis de service —
ignore_startup_parametersnon vide sansoptions, oumax_packet_sizerelevé au-dessus de sa valeur par défaut. - Conteneurs et piles embarquées — un PgBouncer livré dans une pile Compose ou un chart garde la version de son image, quelle que soit celle du serveur hôte.
Constater la version et l'exposition en quelques minutes
Interroger la console d'administration
psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW VERSION;"
Seuls les utilisateurs deadmin_usersoustats_userspeuvent s'y connecter. La commandeSHOW VERSIONaffiche la chaîne de version de PgBouncer : après correctif, elle doit mentionner 1.26.1.Lire la version du binaire
pgbouncer -Vwhich -a pgbouncer
Plusieurs binaires cohabitent parfois, celui du paquet, un autre sous/usr/localaprès une compilation. Le premier de la liste n'est pas toujours celui que le service exécute.Lire la version du paquet
Debian et Ubuntu :
dpkg -l pgbouncerapt-cache policy pgbouncer
RHEL, AlmaLinux, Rocky :rpm -q pgbouncerdnf info pgbouncer
Comparez avec le tableau ci-dessus. Un paquet de distribution peut recevoir un correctif sans changer de numéro de version amont : fiez-vous au suivi de sécurité de la distribution plus qu'au seul numéro.Relire la configuration réellement chargée
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
Le fichier.inià lire est celui passé en argument au processus, pas forcément celui du chemin habituel.Voir qui peut atteindre le port
sudo ss -ltnp | grep 6432sudo ufw status numberednc -vz <server_ip> 6432
La dernière commande, lancée depuis une autre machine, dit si le port répond hors du réseau prévu. Une réponse inattendue vaut décision immédiate sur le pare-feu.Compter les comptes SCRAM sans afficher les secrets
grep -c 'SCRAM-SHA-256' /etc/pgbouncer/userlist.txt
Remplacez le chemin par celui deauth_file. Ne collez jamais le contenu du fichier dans un ticket ou une conversation : il contient les empreintes de vos mots de passe.Inventorier les conteneurs
docker psdocker port <container>docker exec <container> pgbouncer -V
Un conteneur en cours d'exécution garde l'image avec laquelle il a démarré. Le résultat dedocker portdit si le port est publié sur l'hôte.
Quelle voie de mise à jour : l'état des paquets Debian
Au jour de la rédaction, le suivi de sécurité Debian liste bookworm (1.18.0-1+deb12u1) et trixie (1.24.1-1+deb13u2) comme vulnérables à CVE-2026-107350, seuls forky et sid disposant du paquet corrigé 1.26.1-1. Tant que Debian n'a pas publié de correctif pour votre version, apt upgrade seul ne protège donc pas. Revérifiez le suivi le jour où vous agissez : l'état peut avoir changé.
Trois voies existent. La première : le dépôt PGDG, apt.postgresql.org pour Debian et Ubuntu, yum.postgresql.org pour RHEL et dérivés, que la page de téléchargement de PgBouncer présente comme des constructions parfois plus récentes que celles des distributions. La deuxième : une image Docker ou un tag à jour, sachant que le projet ne mentionne aucune image officielle et que vous utilisez donc une image tierce. La troisième : compiler l'archive des sources de la version 1.26.1. Avant de basculer, confirmez par apt-cache policy pgbouncer ou dnf info pgbouncer que le dépôt propose bien la version corrigée.
Mettre à jour selon votre mode d'installation
Sauvegarder la configuration
sudo cp -a /etc/pgbouncer /root/pgbouncer-etc-backup
Cette copie permet de revenir en arrière si une mise à jour remplace un fichier. Notez aussi la version actuelle avant de commencer.Debian et Ubuntu : activer le dépôt PGDG
sudo apt install -y postgresql-common ca-certificatessudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.shapt-cache policy pgbouncer
Le script officiel configure le dépôt apt.postgresql.org. La dernière commande doit afficher un candidat en 1.26.1 ; s'il est absent, n'allez pas plus loin avec cette voie.Debian et Ubuntu : installer
sudo apt updatesudo apt install --only-upgrade pgbouncerpgbouncer -V
Si dpkg propose de remplacer votre fichier de configuration, conservez votre version locale.pgbouncer -Vconfirme le binaire installé.RHEL, AlmaLinux et Rocky
Ajoutez le dépôt PGDG avec les commandes que génère le sélecteur de yum.postgresql.org pour votre distribution, puis :
sudo dnf makecachednf info pgbouncersudo dnf upgrade pgbouncer
Contrôlez que la version proposée est bien 1.26.1 avant de valider.Docker et Compose
docker compose pull pgbouncerdocker compose up -d pgbouncerdocker compose exec pgbouncer pgbouncer -V
Si l'image est épinglée par un tag ou un digest ancien, mettez d'abord à jour cette référence dans votre fichier Compose. Si aucun tag 1.26.1 n'existe, construisez l'image à partir des sources.Compiler depuis les sources
curl -LO https://www.pgbouncer.org/downloads/files/1.26.1/pgbouncer-1.26.1.tar.gzsha256sum pgbouncer-1.26.1.tar.gz
Comparez la somme obtenue avec celle publiée sur la page de téléchargement avant de poursuivre.tar xzf pgbouncer-1.26.1.tar.gzcd pgbouncer-1.26.1./configure --prefix=/usr/localmakesudo make install
La compilation demande libevent 2.0 ou supérieur, OpenSSL 1.0.1 ou supérieur et un compilateur C11. La documentation recommande Autoconf pour la production.Redémarrer, puis constater
sudo systemctl restart pgbouncerps -o lstart= -p $(pgrep -o pgbouncer)sudo readlink -f /proc/$(pgrep -o pgbouncer)/exe
Un rechargement ne suffit pas : le processus doit repartir sur le nouveau binaire. La date de démarrage et le chemin de l'exécutable le prouvent. Relancez enfinSHOW VERSIONsur la console.
Redémarrer sans couper les clients, et le cas search_path
Un redémarrage coupe les connexions en cours. La documentation décrit une alternative : plusieurs processus sur le même port avec so_reuseport, puis SHUTDOWN WAIT_FOR_CLIENTS sur un processus à la fois pendant que les clients se reconnectent. Autre point de vigilance : depuis la version 1.26.0, search_path est suivi par défaut, et 1.26.1 fait primer ignore_startup_parameters sur les paramètres suivis. Si une application envoyait search_path au démarrage et que vous comptiez l'ignorer, ajoutez ignore_startup_parameters = search_path dans la configuration pour retrouver le comportement de la 1.25.
Parades en attendant le correctif
Pour CVE-2026-107350, l'annonce ne donne aucune parade de configuration : la mise à jour est la seule vraie réponse. Vous pouvez en revanche réduire qui tente sa chance. Limitez le port 6432 au réseau applicatif :sudo ufw allow from <app_subnet> to any port 6432 proto tcpsudo ufw status numberedsudo ufw delete <n>
Ici <n> est le numéro d'une règle plus large déjà présente, par exemple une ouverture du port 6432 à tous, que l'on supprime une fois la règle restreinte posée. Sur RHEL et dérivés, la même règle se pose avec firewalld. Si listen_addr vaut *, remplacez-le par l'adresse privée du serveur. Auditez ensuite le fichier auth_file : retirez les comptes inutilisés, faites tourner les mots de passe qui ont circulé, et réduisez admin_users au strict nécessaire.
Pour les deux dénis de service, voici notre lecture des conditions du changelog, pas une consigne de l'éditeur. CVE-2026-107349 suppose ignore_startup_parameters non vide et sans options : ajouter options à la liste lève la condition ; vider le paramètre la lève aussi, mais peut faire rejeter les clients qui envoient des paramètres de démarrage (voir le cas de search_path ci-dessus). CVE-2026-107348 suppose un max_packet_size supérieur à 2147483648 : garder la valeur par défaut, 2147483647, l'écarte.
Contrôler les traces d'une connexion usurpée
PgBouncer journalise par défaut les connexions réussies et les déconnexions, avec leur motif, grâce à log_connections et log_disconnections. Lisez la période qui suit la publication des correctifs, et au-delà si vos journaux le permettent :sudo journalctl -u pgbouncer --since "2026-10-14"
Cherchez des tentatives vers des noms de base qui n'existent pas dans votre section [databases], puis une session ouverte juste après sous un autre nom d'utilisateur depuis la même adresse. Sur la console, ces deux commandes montrent l'état courant :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;"
Côté PostgreSQL, listez les rôles et leurs changements récents avec psql -c "\du".
Nous n'avons pas de signature exacte de cette attaque dans les journaux, et nous n'en inventons pas. Une absence de trace ne prouve pas l'absence d'intrusion, surtout si log_connections était coupé ou si les journaux ont tourné. En cas de doute sérieux, changez les mots de passe de tous les comptes SCRAM et des rôles privilégiés du serveur PostgreSQL.
Fermer le dossier : de la version au suivi
Une mise à jour réussie se prouve, elle ne se suppose pas. Pour chaque serveur, consignez dans un tableau la machine, le mode d'installation, la version avant et après, la règle de pare-feu posée, et la date du contrôle. Vérifiez que SHOW VERSION annonce 1.26.1, que le processus a redémarré après l'installation, et que le port 6432 n'est joignable que depuis le réseau prévu. Confirmez aussi que vos deux réglages de déni de service respectent les conditions décrites plus haut, ou qu'ils sont devenus sans objet.
Enfin, ne comptez pas sur les mises à jour automatiques : un paquet de distribution non corrigé ne se met pas à jour tout seul, et une image Docker épinglée non plus. Ajoutez un rappel pour revérifier le suivi de sécurité de votre distribution, puis basculez sur son paquet quand il sera corrigé, ou gardez le dépôt PGDG de façon délibérée.
Sur un VPS à vous, vous tenez les trois leviers
Corriger PgBouncer demande trois accès : choisir la version installée, poser le pare-feu du port 6432 et lire les journaux. Sur un VPS Cloud avec accès root, ces trois leviers sont les vôtres, sans dépendre du calendrier d'un hébergeur mutualisé. Les guides liés sous cet article détaillent le pare-feu et la mise en place de PostgreSQL. Ce guide est fourni sans prise en charge : la mise à jour reste à votre charge. Si vous préférez déléguer l'administration du serveur, l'option d'administration VPS existe, à examiner selon votre besoin.
La documentation officielle
Annonce de la version 1.26.1 : https://www.postgresql.org/about/news/pgbouncer-1261-released-fixes-three-cves-3403/
Journal des modifications de PgBouncer : https://www.pgbouncer.org/changelog.html
Téléchargements de PgBouncer : https://www.pgbouncer.org/downloads/
Utilisation et console d'administration : https://www.pgbouncer.org/usage.html
Configuration de PgBouncer : https://www.pgbouncer.org/config.html
Suivi de sécurité Debian pour CVE-2026-107350 : https://security-tracker.debian.org/tracker/CVE-2026-107350
Fiche Mend de CVE-2026-107350 : https://www.mend.io/vulnerability-database/CVE-2026-107350/
Dépôt apt de PostgreSQL : https://wiki.postgresql.org/wiki/Apt
Dépôt yum de PostgreSQL : https://yum.postgresql.org/
Docker et pare-feu : https://docs.docker.com/engine/network/packet-filtering-firewalls/