
Reproduzierbare Docker-basierte Demonstration von CVE-2018-1058 PostgreSQL Privilegieneskalation über unkontrollierten Suchpfad, mit Vergleich zwischen verwundbarer und gepatchter Umgebung.
Dieses Repository enthält den Abschlussbericht und die Reproduzierbarkeitsartefakte für:
CVE-2018-1058: Privilege Escalation in PostgreSQL durch unkontrollierten Suchpfad
Ziel ist es, den Search-Path-Vertrauensfehler hinter CVE-2018-1058 mittels einer sicheren lokalen Docker-Umgebung zu demonstrieren.
Die Demo reproduziert nicht den exakten historischen Ausführungspfad von pg_dump. Stattdessen reproduziert sie dieselbe Grundursache, die in der PostgreSQL-Dokumentation beschrieben wird: Ein angreiferbeschreibbares Schema enthält ein ähnlich aussehendes Objekt, und eine andere Session löst einen nicht qualifizierten Namen in dieses Objekt auf.
.
├── report.pdf
├── docker-compose.yml
├── README.md
└── scripts/
├── init.sql
├── init_safe.sql
├── exploit.sql
├── victim_query.sql
├── verify_qualify.sql
└── fix.sql
Der Abschlussbericht ist report.pdf. Er enthält die schriftliche Analyse und die Screenshots, die den unten erwarteten Ausgaben entsprechen.
Es wird kein Dockerfile benötigt. Das Projekt verwendet offizielle postgres-Images.
Die Screenshots sind direkt in report.pdf eingebettet, daher werden sie nicht als separate Bilddateien bereitgestellt.
Installieren:
psql-Client (optional, aber empfohlen)Die Demo verwendet zwei PostgreSQL-Container:
Stellen Sie sicher, dass die Ports 15432 und 15433 frei sind.
Die erwartete Ausführungsreihenfolge ist:
exploit.sql als attacker aus.victim_query.sql als victim aus und beobachten Sie das Präfix CVE-2018-1058 DEMO:.verify_qualify.sql als victim aus und beobachten Sie normale Kleinbuchstaben-Ausgabe.fix.sql als postgres aus.victim_query.sql erneut aus und beobachten Sie normale Kleinbuchstaben-Ausgabe.exploit.sql auf Port 15433 erneut aus und beobachten Sie permission denied for schema public.docker compose up -d pg_vulnerable
docker compose ps
Erwartetes Ergebnis: Der Dienst pg_vulnerable sollte laufen und auf Port 15432 gemappt sein.
Überprüfen Sie die PostgreSQL-Version:
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "SELECT version();"
Erwartetes Ergebnis: PostgreSQL 10.2.
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "\du"
Erwartete Rollen:
postgresattackervictimDer Angreifer ist kein PostgreSQL-Superuser.
Führen Sie das Angreifer-Skript aus:
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
Erwartete Ausgabe:
CREATE TABLE
GRANT
GRANT
CREATE FUNCTION
Dies erstellt:
public.exploit_log;public.lower(varchar).PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
Erwartete Ausgabe:
CVE-2018-1058 DEMO: Alice Demo
CVE-2018-1058 DEMO: Bob Demo
Dies zeigt, dass die normale Abfrage des Opfers lower(...) in die vom Angreifer kontrollierte Funktion aufgelöst hat.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-c "TABLE public.exploit_log;"
Erwartetes Ergebnis: Mindestens zwei Zeilen in public.exploit_log, eine für jede Zeile, die von der Opfer-Abfrage verarbeitet wurde.
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/verify_qualify.sql
Erwartete Ausgabe:
alice demo
bob demo
Dies funktioniert, weil pg_catalog.lower(...) PostgreSQL zwingt, die eingebaute Funktion zu verwenden.
PGPASSWORD='postgres' \
psql -h 127.0.0.1 -p 15432 -U postgres -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/fix.sql
Erwartete Ausgabe kann Folgendes enthalten:
DROP FUNCTION
DROP TABLE
REVOKE
REVOKE
Führen Sie dann die Opfer-Abfrage erneut aus:
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
Erwartete Ausgabe:
alice demo
bob demo
Die vom Angreifer kontrollierte Funktion ist entfernt, und die Abfrage gibt normale Kleinbuchstaben-Strings zurück.
docker compose up -d pg_fixed
docker compose ps
Überprüfen Sie die Version:
docker exec -it cve1058_pg_fixed psql -U postgres -d demo_cve1058 -c "SELECT version();"
Erwartetes Ergebnis: PostgreSQL 10.3.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15433 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
Erwartete Ausgabe:
ERROR: permission denied for schema public
Dies bedeutet, dass der Angreifer die gefälschte Funktion in public nicht erstellen kann, sodass die Angriffskette vor der Namensauflösung stoppt.
Um die Container zu stoppen:
docker compose down
Um Volumes zu entfernen und das Projekt vollständig zurückzusetzen:
docker compose down -v
Diese Demo ist absichtlich harmlos. Sie stiehlt keine Daten, greift nicht auf Dateien zu und führt keine Betriebssystembefehle aus.
Der Exploit verwendet ein sichtbares String-Präfix und eine Log-Tabelle, um zu beweisen, dass PostgreSQL einen nicht qualifizierten Funktionsnamen in ein vom Angreifer kontrolliertes Objekt aufgelöst hat.
Das offizielle CVE betrifft pg_dump und andere Client-Anwendungen. Dieses Repository demonstriert denselben Search-Path-Vertrauensfehler in einer sicheren und reproduzierbaren Unterrichtsumgebung.
Wenn ein Port bereits belegt ist, stoppen Sie einen lokalen PostgreSQL-Dienst oder ändern Sie die Host-Ports in docker-compose.yml.
Wenn die Ausgabe nicht mit den erwarteten Ergebnissen übereinstimmt, setzen Sie die Umgebung zurück mit:
docker compose down -v
docker compose up -d pg_vulnerable
Wenn psql nicht lokal installiert ist, können die Befehle zur Versions- und Rollenüberprüfung dennoch mit docker exec innerhalb der Container ausgeführt werden.
Wenn der Exploit auf pg_vulnerable fehlschlägt, stellen Sie sicher, dass die Datenbank zurückgesetzt wurde und dass scripts/exploit.sql vor scripts/fix.sql ausgeführt wird.
| Dienst | Version | Containername | Host-Port | Zweck |
|---|
pg_vulnerable | PostgreSQL 10.2 | cve1058_pg_vulnerable | 15432 | Angreifbare Demonstration |
pg_fixed | PostgreSQL 10.3 | cve1058_pg_fixed | 15433 | Gepatchte/gehärtete Vergleichsumgebung |