
Laboratoire Docker autonome pour s'entraîner à l'exploitation de CVE-2026-2005, un débordement de tampon de tas dans l'extension pgcrypto de PostgreSQL, permettant l'élévation de privilèges et l'exécution de code dans le conteneur.
Un laboratoire Docker autonome pour s'entraîner à l'exploitation de CVE-2026-2005, un dépassement de tampon de tas dans l'extension pgcrypto de PostgreSQL qui permet l'exécution de code à distance sans privilèges de superutilisateur.
Versions concernées : PostgreSQL ≤ 17.7 / 16.11 / 15.15 / 14.20 / 18.1
Corrigé dans : 18.2, 17.8, 16.12, 15.16, 14.21 (publié le 2026-02-12)
Prérequis : Docker, Docker Compose
git clone <ce-dépôt>
cd CVE-2026-2005
docker compose up -d
PostgreSQL écoutera sur 127.0.0.1:5433.
Vous avez obtenu des identifiants de base de données à partir d'un fichier de configuration d'application :
| Paramètre | Valeur |
|---|---|
| Hôte | 127.0.0.1 |
| Port | 5433 |
| Base de données | targetdb |
| Utilisateur | pentester |
| Mot de passe | pentester123 |
Connectez-vous pour confirmer l'accès :
psql -h 127.0.0.1 -p 5433 -U pentester -d targetdb
Le compte dispose du privilège CREATE sur le schéma public. Il n'est pas un superutilisateur.
Capturez les deux drapeaux pour terminer le laboratoire.
Drapeau 1 — Élévation de privilèges dans la base de données
SELECT * FROM flag_db;
-- Lisible uniquement après élévation au rang de superutilisateur dans la session de base de données
Drapeau 2 — Exécution de code dans le conteneur
/var/lib/postgresql/flag.txt
-- Lisible uniquement après exécution de commandes en tant qu'utilisateur OS postgres dans le conteneur
Note de portée :
COPY TO PROGRAMs'exécute dans le conteneur Docker, pas sur l'hôte. L'impact principal dans le monde réel est l'accès complet en lecture à la base de données (toutes les tables, toutes les bases de données). Atteindre l'hôte Docker nécessite une technique distincte d'évasion de conteneur.
La faille se trouve dans pgp_parse_pubenc_sesskey() dans pgcrypto/pgp-pubenc.c.
Lors du déchiffrement d'un paquet de clé de session chiffré par clé publique, la fonction dérive
la longueur de la clé de session comme msglen - 3 à partir d'une charge utile RSA/ElGamal
contrôlée par l'attaquant et la copie dans un tampon fixe de 32 octets (PGP_MAX_KEY) sans
validation des limites. Un attaquant peut écrire des centaines d'octets au-delà de la limite
du tampon.
L'exploitation se déroule en trois étapes :
dst pour écraser CurrentUserId dans .data avec 10 (BOOTSTRAP_SUPERUSERID)COPY (SELECT '') TO PROGRAM '<cmd>' exécute des commandes OS en tant qu'utilisateur postgres dans le conteneur. Dans un déploiement réel sans Docker, cela signifie un accès au niveau OS sur l'hôte de la base de données.Comme la disposition ASLR est identique pour toutes les connexions au même processus postmaster, les adresses divulguées sur une connexion restent valides sur la suivante.
pgcrypto/pgp-pubenc.cobjdump -t $(which postgres) | grep CurrentUserIddocker compose down -v
Ce laboratoire est destiné uniquement à la recherche en sécurité et à l'éducation autorisées. Exécutez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation explicite de test.