Correctieve updates zijn opgesteld voor alle ondersteunde versies van PostgreSQL 17.3, 16.7, 15.11, 14.16 en 13.19, waarin meer dan 70 fouten zijn verholpen en een kwetsbaarheid (CVE-2025-1094) is geëlimineerd, die eind december werd ingezet in een aanval op het bedrijf BeyondTrust en het Amerikaanse ministerie van Financiën. Het probleem in PostgreSQL werd vastgesteld tijdens de analyse van een externe kwetsbaarheid (CVE-2024-12356) in de diensten van BeyondTrust PRA (Privileged Remote Access) en BeyondTrust RS (Remote Support), waarbij een eerder onbekende (0-day) kwetsbaarheid in libpq werd benut.
Als gevolg van de aanval wisten de aanvallers een sleutel te verkrijgen voor toegang tot de API die wordt gebruikt voor het op afstand bieden van technische ondersteuning aan klanten van SaaS-diensten van BeyondTrust. Deze API werd gebruikt voor het resetten van wachtwoorden en het compromitteren van de infrastructuur van het Amerikaanse ministerie van Financiën, dat gebruik maakt van producten van BeyondTrust. Tijdens de aanval wisten de aanvallers vertrouwelijke documenten te downloaden en toegang te krijgen tot de werkstations van de medewerkers van het ministerie.
De kwetsbaarheid manifesteert zich in de bibliotheek libpq, die een API biedt voor interactie met de DBMS vanuit programma's in de programmeertaal C (bovenop de bibliotheek zijn ook bindende bibliotheken voor C++, Perl, PHP en Python gerealiseerd). Het probleem betreft applicaties die de functies PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() of PQescapeStringConn() gebruikt voor het ontsnappen van speciale tekens en het neutraliseren van aanhalingstekens.
Een aanvaller kan zijn SQL-code injecteren als de van externe bronnen ontvangende tekst voor gebruik binnen de SQL-query wordt ontsnapt met behulp van de eerder genoemde libpq-functies. In de applicaties van BeyondTrust werden op deze manier ontsnapte queries doorgestuurd via de opdrachtregelutility psql. De kwetsbaarheid wordt veroorzaakt door het ontbreken van een validatie van de gebruikte Unicode-tekens in de ontsnapfuncties, waardoor de normalisatie van aanhalingstekens kan worden omzeild door incorrecte meerbyte-sequenties van UTF-8 op te geven.
Voor exploitatie kan een onjuiste UTF-8-teken worden gebruikt, bestaande uit de bytes 0xC0 en 0x27 (‘└'’). De byte 0x27 in ASCII-codering komt overeen met een enkele aanhalingstekens (‘‘’), die moet worden geëscaped. In de escape-code wordt de combinatie van bytes 0xC0 en 0x27 behandeld als één Unicode-teken. Dienovereenkomstig blijft de byte 0x27 in zo'n reeks ongeëscaped, terwijl deze bij de verwerking van de SQL-query in de psql-tool wordt behandeld als een aanhalingstekens.
Bij uitvoeren van SQL-queries met behulp van de psql-tool voor het uitvoeren van willekeurige code kan de substitutie in de opdrachtregel ‘\!’ worden gebruikt, die in psql is bedoeld om willekeurige programma's uit te voeren. Bijvoorbeeld, om uit te voeren op de server de tool ‘id’ kan de waarde ‘hax\xC0′; \! id #’ worden doorgegeven. In het onderstaande voorbeeld wordt een PHP-script dbquote aangeroepen om te escapen, dat de PHP-functie pg_escape_string gebruikt, die bovenop de functie PQescapeString uit libpq werkt: $ 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└’; ERROR: invalid byte sequence for encoding ‘UTF8’: 0xc0 0x27 uid=1000(myexamplecompany) gid=1000(myexamplecompany)
Bron: opennet.ru
