A megfelelő frissítések elkészültek a PostgreSQL 17.3, 16.7, 15.11, 14.16 és 13.19 összes támogatott ágváltozatához, amelyek több mint 70 hibát javítottak és egy sebezhetőséget (CVE-2025-1094) orvosoltak, amely december végén volt aktív a BeyondTrust és az Egyesült Államok Pénzügyminisztériuma elleni támadás során. A PostgreSQL problémáját a BeyondTrust PRA (Privileged Remote Access) és BeyondTrust RS (Remote Support) szolgáltatásain belüli távoli sebezhetőség (CVE-2024-12356) elemzése során fedezték fel, amely során egy korábban ismeretlen (0-napos) sebezhetőséget is kihasználtak a libpq-ban.
A támadás következtében a támadóknak sikerült hozzáférési kulcsot szerezniük az API-hoz, amelyet a BeyondTrust SaaS-szolgáltatások ügyfeleinek távoli technikai támogatása során alkalmaztak. Ezt az API-t a jelszó visszaállítására használták, amelynek következtében megsértették az Egyesült Államok Pénzügyminisztériumának infrastruktúráját, amely a BeyondTrust termékeit használja. A támadás során a támadók bizalmas dokumentumokat tudtak letölteni, és hozzáfértek a tárcsázók munkaállomásaihoz.
A sebezhetőség a libpq könyvtárban jelentkezik, amely API-t biztosít az adatbázisok C nyelven történő eléréséhez (a könyvtárhoz C++, Perl, PHP és Python nyelveken egyaránt készültek kötőkönyvtárak). A probléma érinti azokat az alkalmazásokat, amelyek a speciális karakterek szökésének és a idézőjelek semlegesítésének érdekében a PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() vagy PQescapeStringConn() funkciókat használják.
A támadó elérheti saját SQL-kódjának behelyettesítését, ha a külső forrásból érkező szöveget a fenti libpq funkciókkal szökellve használják SQL-lekérdezésben. A BeyondTrust alkalmazásaiban az így szökellő lekérdezéseket a psql parancssori segédprogramon keresztül továbbították. A sebezhetőség a szökési funkciókban a Unicode karakterek érvényességi ellenőrzésének hiányából adódik, amely lehetővé teszi a normálási idézőjelek megkerülését hibás többbájtos UTF-8 szekvenciák megadásával.
A sebezhetőséget egy hibás UTF-8 karakter használatával lehet kihasználni, amely a 0xC0 és 0x27 bájtokból áll ("└'"). A 0x27 bájt az ASCII-kódolásban egyetlen idézőjelnek felel meg ("‘"), amelyet el kell szökni. Az escape kód esetében a 0xC0 és 0x27 bájtok kombinációja egy Unicode karakterként kerül feldolgozásra. Ennek megfelelően a 0x27 bájt ebben a sorrendben kifejezés nélkül marad, míg a SQL lekérdezés feldolgozása során a psql segédprogramban idézőjelként kezelik.
Mikor SQL lekérdezések futtatásakor a psql segédprogram segítségével a tetszőleges kód végrehajtásának szervezésére a "\!" parancssori helyettesítés használható, amely a psql-ben tetszőleges programok futtatására szolgál. Például, a futtatáshoz szerveren az "id" segédprogramhoz átadható a "hax\xC0′; \! id #" érték. Az alábbi példában az escape hívásához a PHP dbquote szkript használható, amely a PHP pg_escape_string funkcióját használja, ami a libpq PQescapeString funkciója fölött működik: $ 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: érvénytelen bájtsorozat UTF8 kódolásra: 0xc0 0x27 uid=1000(myexamplecompany) gid=1000(myexamplecompany)
Forrás: opennet.ru
