Exploit de preuve de concept pour CVE-2026-14669, un débordement de tampon sur le tas dans l'abréviation de fuseau horaire de la fonction to_char() de PostgreSQL permettant une exécution de code à distance (RCE) via une fuite d'informations et une chaîne ROP ; inclut un laboratoire Docker et un PoC automatisé.
La fonction to_char() de PostgreSQL présente une vulnérabilité de débordement de tampon sur le tas lors du traitement du formatage des fuseaux horaires. En définissant une abréviation de fuseau horaire POSIX surdimensionnée, un attaquant peut déclencher une écriture hors limites dans un tampon fixe de 25 octets, et combiner une fuite d'informations avec une chaîne ROP pour obtenir une exécution de code à distance.
to_char(timestamptz) de PostgreSQL| Série PostgreSQL | Plage concernée |
|---|
| 18.x | 18.0 – 18.5 |
| 17.x | 17.0 – 17.10 |
| 16.x | 16.0 – 16.14 |
| 15.x | 15.0 – 15.18 |
| 14.x | 14.0 – 14.23 |
Le chemin de traitement DCH_TZ / DCH_tz dans formatting.c utilise un tampon fixe de 25 octets sur la pile pour stocker l'abréviation du fuseau horaire, sans aucune vérification de la longueur de l'entrée. Lorsque l'abréviation du fuseau horaire dépasse 24 octets, strcpy() écrit hors limites dans la mémoire du tas.
Chemin de déclenchement :
SET TIME ZONE '<abréviation surdimensionnée>+00';
SELECT to_char(now()::timestamptz, 'TZ');
↓
DCH_to_char() → DCH_from_char_action()
↓
strcpy(buf, tmtcTzn(...)) ← Débordement du tas
Le PoC de V12 Security comprend trois phases :
Corruption des objets adjacents sur le tas via le débordement afin de divulguer l'adresse de base PIE et un pointeur de tas pour contourner l'ASLR.
Utilisation de champs de type grand objet ou bytea pour disposer une chaîne de gadgets ROP sur le tas.
Un second débordement écrase le pointeur de fonction sur le tas et redirige l'exécution vers la chaîne ROP pour exécuter des commandes arbitraires (avec les privilèges de l'utilisateur postgres).
poc.py - Script d'exploitation complet (210 lignes, ciblant PostgreSQL 19beta1)requirements.txt - Dépendances Python (psycopg, pwntools)docker-compose.yml - Environnement de test de la vulnérabilitédocker-compose up -d
Attendre que le conteneur soit complètement démarré (contrôle de santé réussi) :
docker logs pg-tzlab
pip install -r requirements.txt
python3 poc.py
Connexion par défaut à 127.0.0.1:55432, utilisateur postgres, mot de passe postgres.
Après une exploitation réussie, la sortie de l'exécution de la commande est visible dans les journaux du conteneur :
docker logs pg-tzlab | grep PWNED
Modifier les constantes dans poc.py :
HOST, PORT - Adresse cibleDEFAULT_COMMAND - Commande à exécuter⚠️ Important : ce PoC contient des adresses décalées codées en dur pour une construction spécifique (image Docker postgres:19beta1 sha256:a6bdd01...). Pour d'autres versions, il est nécessaire de relocaliser les gadgets.
SET TIME ZONE surdimensionnées (> 50 caractères)⚠️ Ce PoC est destiné exclusivement à la recherche en sécurité, à la validation de vulnérabilités et aux tests défensifs.
L'utilisation de ce PoC implique votre accord pour respecter les lois et réglementations locales ainsi que les limites d'autorisation sur les systèmes cibles.