Ustvarjene so bile korekcijske posodobitve za vse podprte različice PostgreSQL 17.3, 16.7, 15.11, 14.16 in 13.19, ki odpravljajo več kot 70 napak in odpravljajo ranljivost (CVE-2025-1094), ki je bila konec decembra vključena v napad na podjetje BeyondTrust in ameriško ministrstvo za finance. Težava v PostgreSQL je bila odkrita pri analizi oddalne ranljivosti (CVE-2024-12356) v storitvah BeyondTrust PRA (Privileged Remote Access) in BeyondTrust RS (Remote Support), pri čemer je bila dodatno izkoriščena prej nepoznana (0-day) ranljivost v libpq.
Zaradi napada so napadalci uspeli pridobiti ključe za dostop do API-ja, ki se uporablja za oddaljeno nudenje tehnične podpore uporabnikom SaaS storitev podjetja BeyondTrust. Ta API je bil uporabljen za ponastavitev gesla in kompromitacijo infrastrukture ameriškega ministrstva za finance, ki uporablja proizvode BeyondTrust. Med napadom so napadalci uspeli prenesti zaupne dokumente in pridobili dostop do delovnih postaj zaposlenih ministrstva.
Ranljivost se pojavi v knjižnici libpq, ki zagotavlja API za interakcijo z DBMS iz programov v jeziku C (nad knjižnico so implementirane tudi ovitki za C++, Perl, PHP in Python). Težava vpliva na aplikacije, ki za escaping posebnih znakov in nevtralizacijo narekovajev uporabljajo funkcije PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() ali PQescapeStringConn().
Napadalec lahko doseže vstavljanje svojega SQL koda, če se besedilo, prej pridobljeno od zunaj, pred uporabo v SQL poizvedbi eskapira z zgoraj omenjenimi funkcijami libpq. V aplikacijah podjetja BeyondTrust so bila tako eskapirana vprašanja posredovana preko ukazne vrstice psql. Ranljivost je posledica pomanjkanja preverjanja pravilnosti uporabljenih Unicode simbolov v besedilu v funkcijah za escaping, kar omogoča obhod normalizacije narekovajev z navedbo neveljavnih večbytnih zaporedij UTF-8.
Za eksploataciju ranjivosti može se iskoristiti neispravan UTF-8 simbol koji se sastoji od bajtova 0xC0 i 0x27 («└'»). Bajt 0x27 u ASCII kodiranju odgovara jednostrukoj navodnici («‘»), koja mora biti eskapirana. U kodu eskapiranja, kombinacija bajtova 0xC0 i 0x27 se obrađuje kao jedan Unicode simbol. Takođe, bajt 0x27 u toj sekvenci ostaje ne eskapiran, dok se prilikom obrade SQL upita u alatu psql obrađuje kao navodnik.
Pri pokretanju SQL upita pomoću alata psql za organizaciju izvršavanja proizvoljnog koda može se koristiti zamena u nizu komande „\!“, koja je namenjena za pokretanje proizvoljnih programa u psql. Na primer, za pokretanje na strežnikom alat „id“ može se preneti vrednost „hax\xC0′; \! id #“. U donjem primeru za eskapiranje se poziva PHP skript dbquote, koji koristi PHP funkciju pg_escape_string, koja radi preko funkcije PQescapeString iz 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: neispravan bajt sekvenca za kodiranje „UTF8“: 0xc0 0x27 uid=1000(myexamplecompany) gid=1000(myexamplecompany)
Izvor: opennet.ru
