
Selbstständiges Docker-Labor zum Üben der Ausnutzung von CVE-2026-2005, einem Heap-Pufferüberlauf in der pgcrypto-Erweiterung von PostgreSQL, der Privilegieneskalation und Container-Codeausführung ermöglicht.
Ein eigenständiges Docker-Labor zum Üben der Ausnutzung von CVE-2026-2005, einem Heap-Pufferüberlauf in der PostgreSQL-Erweiterung pgcrypto, der Remote-Codeausführung ohne Superuser-Rechte ermöglicht.
Betroffene Versionen: PostgreSQL ≤ 17.7 / 16.11 / 15.15 / 14.20 / 18.1
Behoben in: 18.2, 17.8, 16.12, 15.16, 14.21 (veröffentlicht am 12.02.2026)
Voraussetzungen: Docker, Docker Compose
git clone <this-repo>
cd CVE-2026-2005
docker compose up -d
PostgreSQL lauscht auf 127.0.0.1:5433.
Sie haben Datenbank-Anmeldedaten aus einer Anwendungskonfigurationsdatei erhalten:
| Parameter | Wert |
|---|
| Host | 127.0.0.1 |
| Port | 5433 |
| Datenbank | targetdb |
| Benutzername | pentester |
| Passwort | pentester123 |
Stellen Sie eine Verbindung her, um den Zugriff zu bestätigen:
psql -h 127.0.0.1 -p 5433 -U pentester -d targetdb
Das Konto besitzt CREATE-Rechte auf dem Schema public. Es ist kein Superuser.
Erbeuten Sie beide Flags, um das Labor abzuschließen.
Flag 1 — Datenbank-Privilegieneskalation
SELECT * FROM flag_db;
-- Nur lesbar, nachdem innerhalb der DB-Sitzung zum Superuser eskaliert wurde
Flag 2 — Codeausführung im Container
/var/lib/postgresql/flag.txt
-- Nur lesbar, nachdem Befehle als postgres-OS-Benutzer im Container ausgeführt wurden
Hinweis zum Umfang:
COPY TO PROGRAMwird im Docker-Container ausgeführt, nicht auf dem Host. Die primäre Auswirkung in der Praxis ist vollständiger Datenbank-Lesezugriff (alle Tabellen, alle Datenbanken). Das Erreichen des Docker-Hosts erfordert eine separate Container-Escape-Technik.
Der Fehler liegt in pgp_parse_pubenc_sesskey() in pgcrypto/pgp-pubenc.c.
Beim Entschlüsseln eines mit öffentlichem Schlüssel verschlüsselten Sitzungsschlüssel-Pakets leitet die Funktion
die Sitzungsschlüssellänge als msglen - 3 aus einer angreiferkontrollierten RSA/ElGamal-Nutzlast ab
und kopiert sie ohne Grenzprüfung in einen festen 32-Byte-Puffer (PGP_MAX_KEY). Ein Angreifer kann Hunderte von Bytes über die Puffergrenze hinaus schreiben.
Der Exploit läuft in drei Phasen ab:
dst-Struktur, um CurrentUserId in .data mit 10 (BOOTSTRAP_SUPERUSERID) zu überschreibenCOPY (SELECT '') TO PROGRAM '<cmd>' OS-Befehle als Benutzer postgres im Container aus. In einer realen Bereitstellung ohne Docker bedeutet dies OS-Zugriff auf dem Datenbank-Host.Da das ASLR-Layout über alle Verbindungen zum selben postmaster-Prozess identisch ist, bleiben auf einer Verbindung geleakte Adressen auch auf der nächsten gültig.
pgcrypto/pgp-pubenc.cobjdump -t $(which postgres) | grep CurrentUserIddocker compose down -v
Dieses Labor dient ausschließlich autorisierter Sicherheitsforschung und Bildung. Führen Sie es nur auf Systemen aus, die Ihnen gehören oder für die Sie ausdrückliche Testberechtigung haben.