Tutoriel

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

Sécurité & Monitoring12 min de lecture14 étapes

Le 14 octobre 2026, PgBouncer 1.26.1 a corrigé un contournement d'authentification SCRAM, CVE-2026-107350, ainsi que deux dénis de service. Les paquets des versions stables de Debian restent vulnérables au constat : un simple `apt upgrade` ne règle donc pas la question. Il arrive qu'on ne sache pas quelle version de PgBouncer tourne sur son serveur, ni qui peut joindre son port. Ce guide donne les commandes pour constater la version en quelques minutes, mettre à jour selon l'installation (dépôt PGDG, RHEL, Docker, sources), poser des parades en attendant, puis contrôler les traces.

Sommaire· Ce que corrige PgBouncer 1.26.11/13
  1. 01Ce que corrige PgBouncer 1.26.1
  2. 02Versions touchées et état des paquets
  3. 03« Mon PgBouncer n'est pas exposé » : un critère insuffisant
  4. 04Ce qui détermine votre exposition réelle
  5. 05Constater la version et l'exposition en quelques minutes
  6. 06Quelle voie de mise à jour : l'état des paquets Debian
  7. 07Mettre à jour selon votre mode d'installation
  8. 08Redémarrer sans couper les clients, et le cas search_path
  9. 09Parades en attendant le correctif
  10. 10Contrôler les traces d'une connexion usurpée
  11. 11Fermer le dossier : de la version au suivi
  12. 12Sur un VPS à vous, vous tenez les trois leviers
  13. 13La documentation officielle

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 figureStatutAction
PgBouncer 1.17.0 à 1.26.0Touché par CVE-2026-107350, si SCRAM est utilisé pour les deux comptesPasser en 1.26.1
PgBouncer 1.20.0 à 1.26.0Touché par CVE-2026-107349 si `ignore_startup_parameters` est non vide sans `options`Passer en 1.26.1
PgBouncer 1.21.0 à 1.26.0Touché par CVE-2026-107348 seulement si `max_packet_size` dépasse 2147483648Passer en 1.26.1
Debian bookworm, paquet 1.18.0-1+deb12u1Listé vulnérable par le suivi de sécurité DebianDépôt PGDG ou compilation
Debian trixie, paquet 1.24.1-1+deb13u2Listé vulnérable par le suivi de sécurité DebianDépôt PGDG ou compilation
Debian forky et sid, paquet 1.26.1-1CorrigéMise à jour par apt
Image Docker tierceDépend de la version embarquéeVérifier `pgbouncer -V` dans le conteneur
Version antérieure à 1.17.0Hors plage annoncée pour CVE-2026-107350Ne 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_addr n'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_type et la nature des entrées du fichier désigné par auth_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_users ouvre 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_parameters non vide sans options, ou max_packet_size relevé 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

  1. Interroger la console d'administration

    psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW VERSION;"
    Seuls les utilisateurs de admin_users ou stats_users peuvent s'y connecter. La commande SHOW VERSION affiche la chaîne de version de PgBouncer : après correctif, elle doit mentionner 1.26.1.

  2. Lire la version du binaire

    pgbouncer -V
    which -a pgbouncer
    Plusieurs binaires cohabitent parfois, celui du paquet, un autre sous /usr/local après une compilation. Le premier de la liste n'est pas toujours celui que le service exécute.

  3. Lire la version du paquet

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

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

  5. Voir qui peut atteindre le port

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

  6. Compter les comptes SCRAM sans afficher les secrets

    grep -c 'SCRAM-SHA-256' /etc/pgbouncer/userlist.txt
    Remplacez le chemin par celui de auth_file. Ne collez jamais le contenu du fichier dans un ticket ou une conversation : il contient les empreintes de vos mots de passe.

  7. Inventorier les conteneurs

    docker ps
    docker 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 de docker port dit 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

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

  2. Debian et Ubuntu : activer le dépôt PGDG

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

  3. Debian et Ubuntu : installer

    sudo apt update
    sudo apt install --only-upgrade pgbouncer
    pgbouncer -V
    Si dpkg propose de remplacer votre fichier de configuration, conservez votre version locale. pgbouncer -V confirme le binaire installé.

  4. 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 makecache
    dnf info pgbouncer
    sudo dnf upgrade pgbouncer
    Contrôlez que la version proposée est bien 1.26.1 avant de valider.

  5. Docker et Compose

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

  6. Compiler depuis les sources

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

  7. Redémarrer, puis constater

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

Un serveur dont vous tenez la version et le pare-feu

Sur un VPS Cloud avec accès root, vous choisissez la version de PgBouncer, fermez le port 6432 aux seules machines prévues et lisez vos journaux. L'option d'administration VPS permet de déléguer ce suivi.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet