Эксплойт proof-of-concept для CVE-2026-14669 — переполнение буфера в куче в функции to_char() PostgreSQL при обработке сокращений часовых поясов, позволяющее выполнить произвольный код (RCE) через утечку информации и ROP-цепочку; включает Docker-лабораторию и автоматизированный PoC.
Функция to_char() в PostgreSQL содержит уязвимость переполнения буфера в куче при обработке форматирования часового пояса. Злоумышленник, задав чрезмерно длинную аббревиатуру часового пояса POSIX, может вызвать запись за пределы фиксированного 25-байтового буфера, что в сочетании с утечкой информации и ROP-цепочкой позволяет выполнить произвольный код удалённо.
to_char(timestamptz)| Серия PostgreSQL | Затронутые версии |
|---|---|
| 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 |
Путь обработки DCH_TZ / DCH_tz в formatting.c использует фиксированный 25-байтовый стековый буфер для хранения аббревиатуры часового пояса, однако не проверяет длину входных данных. Когда аббревиатура часового пояса превышает 24 байта, strcpy() выполняет запись за пределы буфера в кучу.
Путь срабатывания:
SET TIME ZONE '<超长缩写>+00';
SELECT to_char(now()::timestamptz, 'TZ');
↓
DCH_to_char() → DCH_from_char_action()
↓
strcpy(buf, tmtcTzn(...)) ← 堆溢出
PoC от V12 Security включает три этапа:
Повреждая соседние объекты кучи через переполнение, утекают базовый адрес PIE и указатели кучи для обхода ASLR.
ROP-гаджеты размещаются в куче с использованием больших объектов или полей bytea.
Второе переполнение перезаписывает указатель на функцию в куче и переходит на ROP-цепочку для выполнения произвольной команды (с правами пользователя postgres).
poc.py — полный эксплойт-скрипт (210 строк, для PostgreSQL 19beta1)requirements.txt — зависимости Python (psycopg, pwntools)docker-compose.yml — среда тестирования уязвимостиdocker-compose up -d
Дождитесь завершения запуска контейнера (успешная проверка здоровья):
docker logs pg-tzlab
pip install -r requirements.txt
python3 poc.py
По умолчанию подключение к 127.0.0.1:55432, пользователь postgres, пароль postgres.
После успешной эксплуатации в логах контейнера можно увидеть вывод выполнения команды:
docker logs pg-tzlab | grep PWNED
Измените константы в poc.py:
HOST, PORT — адрес целиDEFAULT_COMMAND — команда для выполнения⚠️ Важно: данный PoC содержит жёстко заданные адреса смещений для конкретной сборки (Docker-образ postgres:19beta1 sha256:a6bdd01...). Для других версий потребуется заново определить адреса гаджетов.
SET TIME ZONE (более 50 символов)⚠️ Данный PoC предназначен только для исследований в области безопасности, проверки уязвимостей и защитного тестирования.
Использование данного PoC означает ваше согласие соблюдать местные законы и нормативные акты, а также границы авторизации целевой системы.