Der er blevet udarbejdet korrigerende opdateringer til alle understøttede versioner af PostgreSQL 17.3, 16.7, 15.11, 14.16 og 13.19, som løser mere end 70 fejl og fjerner en sårbarhed (CVE-2025-1094), der blev udnyttet i slutningen af december i et angreb mod BeyondTrust og USA's Finansministerium. Problemet i PostgreSQL blev identificeret under analysen af en ekstern sårbarhed (CVE-2024-12356) i BeyondTrusts tjenester PRA (Privileged Remote Access) og RS (Remote Support), hvorved en tidligere ukendt (0-day) sårbarhed i libpq også blev udbetalt.
Som et resultat af angrebet lykkedes det angriberne at få nøglen til API'et, der anvendes til fjernbetjening af teknisk support til BeyondTrusts SaaS-klienter. Dette API blev brugt til at nulstille adgangskoden og kompromittere infrastrukturen i USA's Finansministerium, som benytter BeyondTrusts produkter. Under angrebet lykkedes det angriberne at downloade fortrolige dokumenter og få adgang til medarbejdernes arbejdsstationer i ministeriet.
Sårbarheden viser sig i biblioteket libpq, der leverer API til interaktion med databaser fra programmer skrevet i C (der er også implementeret bindingsbiblioteker til C++, Perl, PHP og Python oven på biblioteket). Problemet påvirker applikationer, der bruger funktioner som PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() eller PQescapeStringConn() til at undslippe specialtegn og neutralisere citationstegn.
Angriberen kan opnå indsættelse af sin SQL-kode, hvis tekst modtaget udefra undslippes ved hjælp af de ovennævnte libpq-funktioner, inden det bruges i SQL-forespørgsler. I BeyondTrust-applikationer blev forespørgsler, der blev undsluppet på denne måde, sendt via kommandolinjeværktøjet psql. Sårbarheden skyldes en mangel på validering af de anvendte Unicode-tegn i undslippningsfunktionerne, hvilket gør det muligt at omgå normaliseringen af citationstegn ved at angive ugyldige multi-byte UTF-8 sekvenser.
For exploitation, the vulnerability can be triggered by an incorrect UTF-8 character consisting of bytes 0xC0 and 0x27 («└'»). The byte 0x27 in ASCII encoding corresponds to a single quote («‘»), which needs to be escaped. In the escape code, the byte sequence 0xC0 and 0x27 is processed as a single Unicode character. Accordingly, the byte 0x27 in this sequence remains unescaped, while being processed as a quote during an SQL query in the psql utility.
Ved executing SQL queries using the psql utility to execute arbitrary code, a substitution in the command line "\!" can be employed, which is intended in psql for executing arbitrary programs. For example, to run on serveren the 'id' utility, you can pass the value "hax\xC0′; \! id #". In the example below, the PHP script dbquote is called for escaping, using the PHP function pg_escape_string, which operates on top of the PQescapeString function from libpq: $ 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)
Kilde: opennet.ru
