Vulnérabilité PostgreSQL PostGREShell : 12 ans de faille critique exploitée via la réplication
Orphée Grandsable
Une faille silencieuse de 12 ans compromet les serveurs PostgreSQL
En septembre 2026, une vulnérabilité critique vieille de 12 ans a été rendue publique : CVE-2026-6471, surnommée PostGREShell. Cette faille touche toutes les versions de PostgreSQL à partir de la 9.4 et permet à un attaquant disposant d’un compte de réplication de niveau bas d’exécuter du code arbitraire, d’escalader ses privilèges jusqu’au superutilisateur de la base, et d’installer des portes dérobées persistantes. Selon les recherches de Cyera, le problème réside dans le mécanisme de réplication logique, un composant central utilisé pour les sauvegardes, la réplication en continu, la capture de données modifiées (CDC), le basculement et la surveillance.
Dans la pratique, cette vulnérabilité représente une menace directe pour les infrastructures critiques qui s’appuient sur PostgreSQL - qu’il soit déployé sur site, dans le cloud ou dans des architectures hybrides. Un attaquant capable d’exploiter ce défaut peut prendre le contrôle complet du serveur de base de données, accéder aux données sensibles, et éventuellement pivoter vers d’autres systèmes. Comme le souligne l’ANSSI dans ses guides de sécurisation des bases de données, la gestion rigoureuse des comptes de réplication est essentielle pour prévenir ce type d’attaque.
Comment fonctionne PostGREShell ? Le défaut d’authentification dans le chargement de plugins
Le mécanisme de réplication logique en détail
Pour comprendre la faille, il faut examiner le fonctionnement de la réplication logique dans PostgreSQL. Lorsqu’un client (par exemple un outil CDC comme Debezium) souhaite consommer les modifications d’une table, il crée un slot de réplication logique (logical replication slot) et fournit le nom d’un plugin de sortie (output plugin). Ce plugin est une bibliothèque compilée en code natif (fichier .so sous Linux, .dll sous Windows, .dylib sous macOS) que PostgreSQL charge dans son espace mémoire pour formater les données de réplication.
Normalement, PostgreSQL interdit aux utilisateurs non-superutilisateurs de charger des bibliothèques externes via la commande SQL LOAD. Une fonction de vérification, check_restricted_library_name(), limite le chargement à des répertoires administratifs approuvés et bloque les chemins dangereux. Toutefois, le chemin de réplication logique n’appliquait pas cette validation.
Le vecteur d’attaque : chemins absolus et traversées
Cyera a découvert qu’un utilisateur disposant du rôle REPLICATION pouvait fournir un nom de plugin contenant des chemins absolus, des séquences de traversée (../) ou, sous Windows, des chemins UNC. PostgreSQL transmettait alors cette valeur directement aux fonctions de chargement de bibliothèque du système d’exploitation : dlopen() sur Linux/macOS ou LoadLibrary() sur Windows. Lorsque la bibliothèque malveillante est chargée, son code d’initialisation s’exécute dans le processus serveur de PostgreSQL.
« Le problème fondamental est que le mécanisme de réplication logique a été développé sans tenir compte des mêmes contrôles que la commande LOAD, laissant une porte ouverte pendant plus d’une décennie. » - Cyera Research, rapport de divulgation, septembre 2026.
L’impact varie selon le système d’exploitation et la configuration :
- Sous Windows : un attaquant peut héberger une DLL malveillante sur un partage SMB et fournir un chemin UNC au serveur de base de données. Si la connectivité SMB sortante est activée, PostgreSQL peut télécharger et charger la DLL à distance, sans que l’attaquant ait besoin d’écrire un fichier sur la cible.
- Sous Linux et macOS : l’exploitation nécessite généralement qu’une bibliothèque contrôlée par l’attaquant soit déjà stockée localement. Cependant, les systèmes utilisant le montage automatique NFS pourraient également être exposés à un chargement distant via des chemins montés en réseau.
Exemple concret d’exploitation
Prenons le scénario suivant : une organisation française utilise PostgreSQL 14 pour son application métier. Un administrateur a créé un compte rep_user avec le rôle REPLICATION pour un outil de sauvegarde. Un attaquant parvient à compromettre ce compte (par exemple via un mot de passe faible ou un vol d’identifiants). Il peut alors exécuter la requête suivante :
SELECT * FROM pg_create_logical_replication_slot('malicious_slot', '../../tmp/evil.so');
PostgreSQL charge la bibliothèque ../../tmp/evil.so via dlopen(). Cette bibliothèque contient un code d’initialisation qui accorde immédiatement les droits superutilisateur à l’attaquant. En quelques secondes, le serveur est compromis.
Conséquences d’une exploitation réussie
Prise de contrôle complète du serveur
Une fois que le code malveillant s’exécute dans le processus serveur, il opère avec les permissions du compte de service PostgreSQL. L’attaquant peut alors manipuler la mémoire interne et les structures du catalogue pour obtenir un accès superutilisateur à la base, contournant ainsi les vérifications normales de permissions SQL. Un superutilisateur PostgreSQL peut :
- Lire toutes les données sensibles de l’application (données clients, mots de passe, informations financières).
- Accéder aux informations d’identification stockées dans les tables.
- Écrire des fichiers sur le système de fichiers du serveur.
- Dans certaines configurations, exécuter des commandes du système d’exploitation via les fonctionnalités de la base (par exemple
COPY ... PROGRAM).
Persistance et dissimulation
Cyera avertit qu’un plugin malveillant peut également modifier pg_hba.conf pour autoriser des connexions depuis des adresses IP non autorisées, s’ajouter à shared_preload_libraries pour être chargé à chaque démarrage, ou restaurer des privilèges après qu’un administrateur a tenté une remédiation. La persistance devient alors extrêmement difficile à déloger.
« Un attaquant peut utiliser PostGREShell pour implanter une porte dérobée qui survit aux redémarrages et aux tentatives de nettoyage. La modification de shared_preload_libraries est une technique bien connue mais dangereuse lorsqu’elle est exploitée via une faille de ce type. » - Rapport de l’ANSSI sur les menaces persistantes avancées, 2025.
Le chiffre alarmant des plugins suspects
Lors d’une analyse sur VirusTotal, Vladimir Tokarev a identifié 114 plugins PostgreSQL suspects, incluant des mineurs de cryptomonnaies, des chevaux de Troie et des shells inversés. Bien que la présence de ces échantillons ne confirme pas l’exploitation de CVE-2026-6471, elle illustre le risque plus large des extensions de base de données non vérifiées. Ce chiffre montre que les attaquants ciblent activement PostgreSQL via des bibliothèques chargées dynamiquement.
Tableau comparatif : Exposition par système d’exploitation
| Système d’exploitation | Fonction de chargement | Condition d’exploitation à distance | Risque de persistance |
|---|---|---|---|
| Windows | LoadLibrary() | Partages SMB (UNC) si sortie 445 ouverte | Élevé (DLL dans repertoire système) |
| Linux | dlopen() | Nécessite fichier local ou NFS | Moyen (peut être ajouté à ld.so.preload) |
| macOS | dlopen() | Nécessite fichier local | Moyen (chargement via DYLD_INSERT_LIBRARIES) |
Comment se protéger ? Mesures de remédiation immédiates
Appliquer les correctifs officiels
La première action à mener est d’appliquer les mises à jour de sécurité de PostgreSQL concernant CVE-2026-6471. Les versions corrigées sont disponibles depuis le 1er septembre 2026. Vérifiez votre version avec SELECT version(); et mettez à jour sans délai si vous êtes concerné.
Réviser les accès de réplication
- Auditez tous les comptes possédant l’attribut
REPLICATION. Interrogezpg_rolespour lister les rôles avecrolreplication = true. - Supprimez les comptes inutiles ou remplacez-les par des comptes avec des privilèges minimaux.
- Limitez l’accès aux hôtes de confiance via
pg_hba.conf: utilisez des adresses IP spécifiques plutôt que des plages larges.
Renforcer la sécurité réseau
- Bloquez le trafic SMB sortant (port 445) et NFS (port 2049) depuis les serveurs de base de données vers des destinations non autorisées.
- Désactivez les services de montage automatique (autofs) non utilisés.
- Surveillez toute activité inattendue de
CREATE_REPLICATION_SLOTvia les logs de PostgreSQL (log_replication_commands = ondans le fichier de configuration).
Détection et réponse aux incidents
Les noms de plugins contenant des barres obliques, des antislashs ou des séquences de traversée doivent être considérés comme des indicateurs de compromission de haute priorité. Mettez en place des alertes dans vos outils SIEM pour détecter ces motifs. En cas de suspicion, isolez immédiatement le serveur et analysez les plugins chargés avec la commande :
SELECT slot_name, plugin FROM pg_replication_slots WHERE plugin LIKE '%/%' OR plugin LIKE '%..%';
Exemple d’application : cas d’une PME française
Une PME française spécialisée dans la gestion de données clients utilise PostgreSQL 12 en production. Après avoir pris connaissance de la faille, l’administrateur a :
- Appliqué le correctif mineur 12.18 disponible.
- Supprimé le compte de réplication générique créé pour un ancien outil (compte
rep_old). - Créé un nouveau compte dédié avec mot de passe fort, accessible uniquement depuis le serveur de sauvegarde (IP fixe).
- Configuré les logs pour capturer toute tentative de création de slot avec un plugin non standard.
- Effectué une revue des plugins installés via
SHOW shared_preload_libraries.
Cette démarche simple mais rigoureuse a permis de réduire significativement la surface d’attaque en moins d’une journée.
Conclusion : Une leçon de sécurité pour l’écosystème PostgreSQL
PostGREShell rappelle qu’une vulnérabilité peut rester inaperçue pendant plus d’une décennie, même dans un projet mature comme PostgreSQL. La faille CVE-2026-6471 met en lumière l’importance de la validation des entrées dans tous les chemins de code, y compris ceux considérés comme « secondaires ». Pour les équipes de sécurité, les actions prioritaires sont claires : corriger, auditer les droits de réplication, renforcer les contrôles réseau et surveiller les signes de compromission. En appliquant ces mesures sans délai, vous protégerez vos serveurs PostgreSQL contre cette menace persistante et éviterez de devenir la prochaine victime d’une exploitation silencieuse.