
Exploit proof-of-concept per CVE-2026-14669, un heap buffer overflow nell'abbreviazione del fuso orario della funzione to_char() di PostgreSQL che consente RCE tramite information leak e catena ROP; include lab Docker e PoC automatizzato.
La funzione to_char() di PostgreSQL presenta una vulnerabilità di heap buffer overflow durante la formattazione del fuso orario. Impostando un'abbreviazione POSIX del fuso orario eccessivamente lunga, un attaccante può innescare una scrittura fuori dai limiti di un buffer fisso di 25 byte e, combinandola con la divulgazione di informazioni (info leak) e una catena ROP, ottenere l'esecuzione remota di codice.
to_char(timestamptz) di PostgreSQL| Serie PostgreSQL | Intervallo interessato |
|---|
| 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 |
Il percorso di elaborazione DCH_TZ / DCH_tz in formatting.c utilizza un buffer di stack fisso di 25 byte per memorizzare l'abbreviazione del fuso orario, ma non effettua alcun controllo sulla lunghezza dell'input. Quando l'abbreviazione del fuso orario supera i 24 byte, strcpy() scrive oltre i limiti nella memoria heap.
Percorso di attivazione:
SET TIME ZONE '<abbreviazione eccessivamente lunga>+00';
SELECT to_char(now()::timestamptz, 'TZ');
↓
DCH_to_char() → DCH_from_char_action()
↓
strcpy(buf, tmtcTzn(...)) ← overflow dell'heap
Il PoC di V12 Security comprende tre fasi:
Corrompe gli oggetti heap adiacenti tramite l'overflow dell'heap, facendo trapelare l'indirizzo base PIE e i puntatori heap per bypassare l'ASLR.
Utilizza i large object o i campi bytea per disporre la catena di gadget ROP nell'heap.
Il secondo overflow sovrascrive i puntatori a funzione nell'heap, saltando alla catena ROP per eseguire comandi arbitrari (con i privilegi dell'utente postgres).
poc.py - script di sfruttamento completo (210 righe, per PostgreSQL 19beta1)requirements.txt - dipendenze Python (psycopg, pwntools)docker-compose.yml - ambiente di test della vulnerabilitàdocker-compose up -d
Attendere che il container sia completamente avviato (superamento dell'health check):
docker logs pg-tzlab
pip install -r requirements.txt
python3 poc.py
Per impostazione predefinita si connette a 127.0.0.1:55432, con nome utente postgres e password postgres.
Dopo uno sfruttamento riuscito, l'output dell'esecuzione del comando è visibile nei log del container:
docker logs pg-tzlab | grep PWNED
Modificare le costanti in poc.py:
HOST, PORT - indirizzo di destinazioneDEFAULT_COMMAND - comando da eseguire⚠️ Importante: questo PoC utilizza indirizzi di offset hardcoded per una build specifica (immagine Docker postgres:19beta1 sha256:a6bdd01...). Per le altre versioni è necessario ri-localizzare i gadget.
SET TIME ZONE eccessivamente lunghe (più di 50 caratteri)⚠️ Questo PoC è destinato esclusivamente alla ricerca sulla sicurezza, alla verifica delle vulnerabilità e ai test difensivi.
L'utilizzo di questo PoC implica l'accettazione di conformarsi alle leggi e ai regolamenti locali e ai limiti di autorizzazione del sistema di destinazione.