Ir izstrādāti labojumu atjauninājumi visām atbalstītajām PostgreSQL versijām 17.3, 16.7, 15.11, 14.16 un 13.19, kuros ir novērstas vairāk nekā 70 kļūdas un iz labota ievainojamība (CVE-2025-1094), kas tika izmantota uzbrukumā pret uzņēmumu BeyondTrust un ASV Finanšu ministriju beigās decembra. Problēma PostgreSQL tika identificēta, analizējot attālinātu ievainojamību (CVE-2024-12356) pakalpojumos BeyondTrust PRA (Privileged Remote Access) un BeyondTrust RS (Remote Support), kuru ekspluatācijā papildus tika izmantota iepriekš nezināma (0-day) ievainojamība libpq.
Uzbrukuma rezultātā ļaundariem izdevās iegūt atslēgu piekļuvei API, ko izmanto, lai attālināti nodrošinātu tehnisko atbalstu BeyondTrust SaaS pakalpojumu klientiem. Šis API tika izmantots, lai atiestatītu paroli un apdraudētu ASV Finanšu ministrijas infrastruktūru, kas izmanto BeyondTrust produktus. Uzbrukuma laikā ļaundariem izdevās augšupielādēt konfidenciālus dokumentus un iegūt piekļuvi ministrijas darbinieku darba stacijām.
Ievainojamība izpaužas libpq bibliotēkā, kas nodrošina API datubāzu saskarnei no C valodā rakstītiem programmatūras risinājumiem (virs šīs bibliotēkas ir izstrādātas arī C++, Perl, PHP un Python valodām pielāgotas bibliotēkas). Problēma skar lietojumprogrammas, kas izmanto funkcijas PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() vai PQescapeStringConn() speciālo simbolu un pēdiņu izbēgšanai.
Uzbrucējs var panākt sava SQL koda ievietošanu, ja ārēji iegūtais teksts tiek izbēgts pirms tā izmantošanas SQL vaicājumā ar iepriekš minētajām libpq funkcijām. BeyondTrust lietojumprogrammās tādā veidā izbēgtie vaicājumi tika nodoti caur komandu rindu utilītu psql. Ievainojamība ir radusies, jo funkciju izbēgšanai trūkst pārbaudes par izmantotajos tekstā esošajiem Unicode simboliem, kas ļauj apiet pēdiņu normalizāciju, izmantojot nepareizas UTF-8 daudzbitu secības.
Lai izmantotu šo ievainojamību, var izmantot nepareizu UTF-8 simbolu, kas sastāv no baitiem 0xC0 un 0x27 («└'»). Baits 0x27 ASCII kodējumā atbilst vienkāršajai pēdiņai («‘»), kas ir jāizpilda. Kodu izvairīšanās secībā baitu kombinācija 0xC0 un 0x27 tiek apstrādāta kā viens Unicode simbols. Attiecīgi, baits 0x27 šādā secībā paliek neizpildīts, kamēr psql utilītē tas tiek apstrādāts kā pēdiņa, apstrādājot SQL pieprasījumu.
Veicot SQL pieprasījumu izpilde izmantojot psql utilītu, lai organizētu patvaļīga kodu izpildi, var izmantot komandas virknes aizvietojumu «\!», kas psql paredzēta patvaļīgu programmu izpildei. Piemēram, lai izpildītu serveri utilītu «id», var nodot vērtību «hax\xC0′; \! id #». Zemāk redzamajā piemērā, lai izvairītos no koda izsaukšanas, tiek izsaukts PHP skripts dbquote, kas izmanto PHP funkciju pg_escape_string, kas darbojas virs libpq funkcijas PQescapeString: $ 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)
Avots: opennet.lv
