Π‘ΡΠΎΡΠΌΠΈΡΠ°Π½ΠΈ ΡΠ° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΡΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π½Π° 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 ΠΊΠΎΠ΄, Π°ΠΊΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΈΡΡ ΠΈΠ·Π²ΡΠ½ ΡΠ΅ΠΊΡΡ ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΌΡ Π² SQL Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΡΠ΅ Π΅ΡΠΊΠ΅ΠΉΠΏΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ libpq. Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π½Π° 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: Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Π° Π±Π°ΠΉΡΠΎΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ Π·Π° ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ° Β«UTF8Β»: 0xc0 0x27 uid=1000(myexamplecompany) gid=1000(myexamplecompany)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
