Es wurden Korrekturupdates für alle unterstützten PostgreSQL-Versionen 17.3, 16.7, 15.11, 14.16 und 13.19 erstellt, in denen über 70 Fehler behoben und eine Schwachstelle (CVE-2025-1094) behoben wurde, die Ende Dezember während eines Angriffs auf das Unternehmen BeyondTrust und das US-Finanzministerium aktiv war. Das Problem in PostgreSQL wurde bei der Analyse einer entfernten Schwachstelle (CVE-2024-12356) in den Diensten BeyondTrust PRA (Privileged Remote Access) und BeyondTrust RS (Remote Support) festgestellt, wobei zusätzlich eine zuvor unbekannte (0-Day) Schwachstelle in libpq ausgenutzt wurde.
Als Ergebnis des Angriffs gelang es den Angreifern, einen Schlüssel für den Zugriff auf die API zu erhalten, die zur Erbringung von Remote-Supportdiensten für Kunden von BeyondTrust SaaS-Diensten verwendet wird. Diese API wurde verwendet, um Passwörter zurückzusetzen und die Infrastruktur des US-Finanzministeriums, das Produkte von BeyondTrust nutzt, zu kompromittieren. Im Verlauf des Angriffs konnten die Angreifer vertrauliche Dokumente herunterladen und Zugriff auf die Arbeitsstationen der Mitarbeitern des Ministeriums erlangen.
Die Schwachstelle zeigt sich in der Bibliothek libpq, die eine API für die Interaktion mit der Datenbankverwaltungssystem (DBMS) aus C-Programmen bereitstellt (auf der Bibliothek basieren auch Wrapper-Bibliotheken für C++, Perl, PHP und Python). Das Problem betrifft Anwendungen, die zur Escape von Sonderzeichen und zur Neutralisierung von Anführungszeichen die Funktionen PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() oder PQescapeStringConn() verwenden.
Ein Angreifer kann erreichen, dass sein SQL-Code substituiert wird, wenn der von außen eingehende Text vor der Verwendung in einer SQL-Abfrage mit den oben genannten libpq-Funktionen escaped wird. In den Anwendungen von BeyondTrust wurden derart escaped Abfragen über das Kommandozeilenwerkzeug psql übergeben. Die Schwachstelle wird durch das Fehlen einer Überprüfung der Gültigkeit der verwendeten Unicode-Zeichen in den Escape-Funktionen hervorgerufen, was es ermöglicht, die Normalisierung von Anführungszeichen über die Angabe ungültiger mehrbyteiger UTF-8-Sequenzen zu umgehen.
Für die Ausnutzung der Verwundbarkeit kann ein ungültiges UTF-8-Zeichen verwendet werden, das aus den Bytes 0xC0 und 0x27 besteht (»└'«). Das Byte 0x27 entspricht in der ASCII-Codierung einem einfachen Anführungszeichen (»‘«), das escaped werden muss. In der Escape-Sequenz werden die Byte-Kombinationen 0xC0 und 0x27 als ein Unicode-Zeichen behandelt. Daher bleibt das Byte 0x27 in dieser Sequenz unbehandelt, während es bei der Verarbeitung der SQL-Abfrage im Tool psql als Anführungszeichen interpretiert wird.
Bei der Ausführung von SQL-Abfragen mit Hilfe des Tools psql zur Organisation der Ausführung beliebigen Codes kann die Ersetzung in der Befehlszeile „\!“, die in psql zum Starten beliebiger Programme bestimmt ist, verwendet werden. Zum Beispiel kann für die Ausführung des Server Tools „id“ der Wert „hax\xC0′; \! id #“ übergeben werden. Im folgenden Beispiel wird zur Escape-Behandlung ein PHP-Skript dbquote aufgerufen, das die PHP-Funktion pg_escape_string verwendet, die auf der Funktion PQescapeString aus libpq basiert: $ echo -e „hello \xC0’world'“ | . /dbquote ‚hello └’world«’ $ quoted=$(echo -e „hax\xC0′; \! id # » | . /dbquote) $ echo „SELECT COUNT(1) FROM gw_sessions WHERE session_key = $quoted AND session_type = ‘sdcust’ AND (expiration IS NULL OR expiration > NOW())“ | psql -e SELECT COUNT(1) FROM gw_sessions WHERE session_key = ‘hax└’; FEHLER: ungültige Byte-Sequenz für die Kodierung „UTF8“: 0xc0 0x27 uid=1000(myexamplecompany) gid=1000(myexamplecompany)
Quelle: opennet.ru
