
Самодостаточная Docker-лаборатория для отработки эксплуатации CVE-2026-2005 — переполнения буфера в куче в расширении pgcrypto PostgreSQL, позволяющего повышение привилегий и выполнение кода в контейнере.
Автономная Docker-лаборатория для отработки эксплуатации CVE-2026-2005 — переполнения буфера в куче в расширении pgcrypto PostgreSQL, которое позволяет выполнять удалённый код без привилегий суперпользователя.
Затронутые версии: PostgreSQL ≤ 17.7 / 16.11 / 15.15 / 14.20 / 18.1
Исправлено в: 18.2, 17.8, 16.12, 15.16, 14.21 (выпущено 2026-02-12)
Требования: Docker, Docker Compose
git clone <this-repo>
cd CVE-2026-2005
docker compose up -d
PostgreSQL будет прослушивать порт 127.0.0.1:5433.
Вы получили учётные данные базы данных из файла конфигурации приложения:
| Параметр | Значение |
|---|
| Хост | 127.0.0.1 |
| Порт | 5433 |
| База данных | targetdb |
| Пользователь | pentester |
| Пароль | pentester123 |
Подключитесь, чтобы подтвердить доступ:
psql -h 127.0.0.1 -p 5433 -U pentester -d targetdb
Учётная запись имеет привилегию CREATE в схеме public. Она не является суперпользователем.
Получите оба флага, чтобы завершить лабораторную работу.
Флаг 1 — Повышение привилегий в базе данных
SELECT * FROM flag_db;
-- Доступно только после повышения до суперпользователя в рамках сессии БД
Флаг 2 — Выполнение кода в контейнере
/var/lib/postgresql/flag.txt
-- Доступно только после выполнения команд от имени OS-пользователя postgres внутри контейнера
Примечание о границах:
COPY TO PROGRAMвыполняется внутри Docker-контейнера, а не на хосте. Основное реальное воздействие — полный доступ на чтение к базе данных (все таблицы, все базы данных). Для достижения Docker-хоста требуется отдельная техника побега из контейнера.
Ошибка находится в pgp_parse_pubenc_sesskey() внутри pgcrypto/pgp-pubenc.c.
При расшифровке пакета ключа сессии, зашифрованного открытым ключом, функция
вычисляет длину ключа сессии как msglen - 3 из управляемой атакующим нагрузки RSA/ElGamal
и копирует её в фиксированный 32-байтовый буфер (PGP_MAX_KEY) без
проверки границ. Атакующий может записать сотни байтов за пределы
границы буфера.
Эксплойт выполняется в три этапа:
dst для перезаписи CurrentUserId в .data значением 10 (BOOTSTRAP_SUPERUSERID)COPY (SELECT '') TO PROGRAM '<cmd>' выполняет OS-команды от имени пользователя postgres внутри контейнера. В реальном развёртывании без Docker это означает доступ на уровне ОС к хосту базы данных.Поскольку раскладка ASLR идентична для всех подключений к одному процессу postmaster, адреса, утёкшие при одном подключении, остаются действительными при следующем.
pgcrypto/pgp-pubenc.cobjdump -t $(which postgres) | grep CurrentUserIddocker compose down -v
Эта лабораторная работа предназначена только для авторизованных исследований в области безопасности и обучения. Запускайте её только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.