Π‘ΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ ΡΠ° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΡΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° PostgreSQL 17.3, 16.7, 15.11, 14.16 ΠΈ 13.19, Π² ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΎΡΡΡΡΠ°Π½Π΅Π½ΠΈ Π½Π°Π΄ 70 Π³ΡΠ΅ΡΠΊΠΈ ΠΈ Π΅ ΡΠ΅ΡΠ΅Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ (CVE-2025-1094), ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π² ΠΊΡΠ°Ρ Π½Π° Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ Π² Π°ΡΠ°ΠΊΠ° ΡΡΠ΅ΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° BeyondTrust ΠΈ ΠΠΈΠ½ΠΈΡΡΠ΅ΡΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠΈΠ½Π°Π½ΡΠΈΡΠ΅ Π½Π° Π‘ΠΠ©. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π² PostgreSQL Π΅ ΠΎΡΠΊΡΠΈΡ ΠΏΡΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ (CVE-2024-12356) Π² ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π½Π° BeyondTrust PRA (Privileged Remote Access) ΠΈ BeyondTrust RS (Remote Support), ΠΏΡΠΈ Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΡΡΠΎ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΠΈ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° (0-day) ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π² libpq.
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° Π°ΡΠ°ΠΊΠ°ΡΠ°, Π·Π»ΠΎΠ½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡΠ΅ Π»ΠΈΡΠ° ΡΡΠΏΠ΅Π»ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΊΠ»ΡΡ Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ API, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ Π½Π° SaaS ΡΡΠ»ΡΠ³ΠΈ Π½Π° BeyondTrust. Π’ΠΎΠ·ΠΈ API Π΅ Π±ΠΈΠ» ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° Π½ΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° ΠΈ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΠΈΠ½ΠΈΡΡΠ΅ΡΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠΈΠ½Π°Π½ΡΠΈΡΠ΅ Π½Π° Π‘ΠΠ©, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ»Π·Π²Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ΅ Π½Π° BeyondTrust. ΠΡΠΈ Π°ΡΠ°ΠΊΠ°ΡΠ° Π·Π»ΠΎΠ½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡΠ΅ Π»ΠΈΡΠ° ΡΡΠΏΠ΅Π»ΠΈ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΡ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»Π½ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡ Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠ΅ ΡΡΠ°Π½ΡΠΈΠΈ Π½Π° ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΌΠΈΠ½ΠΈΡΡΠ΅ΡΡΡΠ²ΠΎΡΠΎ.
Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ° ΡΠ΅ ΠΏΡΠΎΡΠ²ΡΠ²Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libpq, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ API Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° C (Π²ΡΡΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈ ΠΎΠ±Π²ΠΈΠ²Π°ΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° C++, Perl, PHP ΠΈ Python). ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π·Π°ΡΡΠ³Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() ΠΈΠ»ΠΈ PQescapeStringConn() Π·Π° Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ ΠΈ Π½Π΅ΡΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ°Π²ΠΈΡΠΊΠΈΡΠ΅.
ΠΡΠ°ΠΊΡΠ²Π°ΡΠΈΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ Π·Π°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ²ΠΎΡ SQL ΠΊΠΎΠ΄, Π°ΠΊΠΎ ΡΠ΅ΠΊΡΡΡΡ, ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ ΠΎΡΠ²ΡΠ½, ΡΠ΅ Π΅ΠΊΡΠ°Π½ΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° libpq, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² SQL Π·Π°ΡΠ²ΠΊΠ°. Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π½Π° BeyondTrust, Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΠΎ ΡΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ° Π±ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈ ΡΡΠ΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡ psql. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ° Π΅ ΠΏΡΠΈΡΠΈΠ½Π΅Π½Π° ΠΎΡ Π»ΠΈΠΏΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΠ΅ Unicode ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ Π² ΡΠ΅ΠΊΡΡΠ° Π² ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ Π½Π° Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΊΠ°Π²ΠΈΡΠΊΠΈΡΠ΅ ΡΡΠ΅Π· ΡΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π½Π΅ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡΠΎΠ²ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΠΈ UTF-8.
ΠΠ° Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π΅ΠΊΠΎΡΠ΅ΠΊΡΠ΅Π½ UTF-8 ΡΠΈΠΌΠ²ΠΎΠ», ΡΡΡΡΠΎΡΡ ΡΠ΅ ΠΎΡ Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ 0xC0 ΠΈ 0x27 (Β«β'Β»). ΠΠ°ΠΉΡΠ° 0x27 Π² ASCII-ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ°ΡΠ° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΠ½Π° ΠΊΠ°Π²ΠΈΡΠΊΠ° (Β«βΒ»), ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈ Π½Π° Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅. Π ΠΊΠΎΠ΄Π° Π·Π° Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡΠ° ΠΎΡ Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ 0xC0 ΠΈ 0x27 ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΠΊΠ°ΡΠΎ Π΅Π΄ΠΈΠ½ Unicode ΡΠΈΠΌΠ²ΠΎΠ». Π‘ΡΠΎΡΠ²Π΅ΡΠ½ΠΎ, Π±Π°ΠΉΡΠ° 0x27 Π² ΡΠ°Π·ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡΡΠ°Π²Π° Π½Π΅Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½, ΠΊΠ°ΡΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° SQL Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π² ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° psql ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΠΊΠ°ΡΠΎ ΠΊΠ°Π²ΠΈΡΠΊΠ°.
ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° SQL Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π· ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° psql Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΠΊΠΎΠ΄, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΠ΄ΠΌΡΠ½Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄ Β«\!Β», ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π² psql Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡ ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° Β«idΒ» ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Β«hax\xC0β²; \! id #Β». Π ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π·Π° Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° PHP ΡΠΊΡΠΈΠΏΡ dbquote, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ PHP ΡΡΠ½ΠΊΡΠΈΡΡΠ° pg_escape_string, ΡΠ°Π±ΠΎΡΠ΅ΡΠ° Π²ΡΡΡ
Ρ ΡΡΠ½ΠΊΡΠΈΡΡΠ° PQescapeString ΠΎΡ 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)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
