
Lab de Docker autocontenido para practicar la explotación de CVE-2026-2005, un desbordamiento de búfer en el heap de la extensión pgcrypto de PostgreSQL, que permite la escalada de privilegios y la ejecución de código en el contenedor.
Un laboratorio Docker autónomo para practicar la explotación de CVE-2026-2005, un desbordamiento de búfer en el montón en la extensión pgcrypto de PostgreSQL que permite la ejecución remota de código sin privilegios de superusuario.
Versiones afectadas: PostgreSQL ≤ 17.7 / 16.11 / 15.15 / 14.20 / 18.1
Corregido en: 18.2, 17.8, 16.12, 15.16, 14.21 (publicado el 2026-02-12)
Requisitos: Docker, Docker Compose
git clone <this-repo>
cd CVE-2026-2005
docker compose up -d
PostgreSQL estará escuchando en 127.0.0.1:5433.
Has obtenido credenciales de base de datos desde un archivo de configuración de una aplicación:
| Parámetro | Valor |
|---|
| Host | 127.0.0.1 |
| Puerto | 5433 |
| Base de datos | targetdb |
| Usuario | pentester |
| Contraseña | pentester123 |
Conéctate para confirmar el acceso:
psql -h 127.0.0.1 -p 5433 -U pentester -d targetdb
La cuenta tiene privilegio CREATE en el esquema public. No es un superusuario.
Captura ambas banderas para completar el laboratorio.
Banderas 1 — Escalada de privilegios en la base de datos
SELECT * FROM flag_db;
-- Solo legible después de escalar a superusuario dentro de la sesión de la base de datos
Bandera 2 — Ejecución de código en el contenedor
/var/lib/postgresql/flag.txt
-- Solo legible después de ejecutar comandos como el usuario del sistema operativo postgres dentro del contenedor
Nota de alcance:
COPY TO PROGRAMse ejecuta dentro del contenedor Docker, no en el host. El impacto principal en el mundo real es el acceso completo de lectura a la base de datos (todas las tablas, todas las bases de datos). Alcanzar el host Docker requiere una técnica separada de escape de contenedor.
La falla está en pgp_parse_pubenc_sesskey() dentro de pgcrypto/pgp-pubenc.c.
Al descifrar un paquete de clave de sesión cifrado con clave pública, la función
deriva la longitud de la clave de sesión como msglen - 3 de una carga útil RSA/ElGamal
controlada por el atacante y la copia en un búfer fijo de 32 bytes (PGP_MAX_KEY) sin
validación de límites. Un atacante puede escribir cientos de bytes más allá del límite
del búfer.
La explotación procede en tres etapas:
dst para sobrescribir CurrentUserId en .data con 10 (BOOTSTRAP_SUPERUSERID)COPY (SELECT '') TO PROGRAM '<cmd>' ejecuta comandos del sistema operativo como el usuario postgres dentro del contenedor. En una implementación real sin Docker, esto significa acceso a nivel de sistema operativo en el host de la base de datos.Debido a que el diseño de ASLR es idéntico en todas las conexiones al mismo proceso postmaster, las direcciones filtradas en una conexión siguen siendo válidas en la siguiente.
pgcrypto/pgp-pubenc.cobjdump -t $(which postgres) | grep CurrentUserIddocker compose down -v
Este laboratorio es solo para investigación de seguridad autorizada y fines educativos. Ejecútalo únicamente en sistemas que poseas o para los que tengas permiso explícito de prueba.