มีการสร้างการอัปเดตเพื่อแก้ไขสำหรับสาขา 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 วัน) ใน libpq อีกด้วย
จากผลของการโจมตี ผู้โจมตีสามารถรับคีย์เพื่อเข้าถึง API ที่ใช้ในการให้บริการสนับสนุนทางเทคนิคแก่ลูกค้า BeyondTrust SaaS จากระยะไกลได้ API นี้ใช้ในการรีเซ็ตรหัสผ่านและบุกรุกโครงสร้างพื้นฐานของกระทรวงการคลังสหรัฐฯ ซึ่งใช้ผลิตภัณฑ์ BeyondTrust ระหว่างการโจมตี ผู้โจมตีสามารถดาวน์โหลดเอกสารลับและเข้าถึงสถานีงานของพนักงานกระทรวงได้
ช่องโหว่นี้ปรากฏในไลบรารี libpq ซึ่งให้ API สำหรับการโต้ตอบกับ DBMS จากโปรแกรม C (ไลบรารีการเชื่อมโยงสำหรับ C++, Perl, PHP และ Python ยังถูกนำมาใช้บนไลบรารีด้วย) ปัญหาดังกล่าวส่งผลต่อแอปพลิเคชันที่ใช้ฟังก์ชัน PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() หรือ PQescapeStringConn() เพื่อหลีกเลี่ยงอักขระพิเศษและทำให้เครื่องหมายคำพูดเป็นกลาง
ผู้โจมตีสามารถทำการแทนที่ SQL ได้หากข้อความที่ได้รับจากภายนอกถูกหลบหนีโดยใช้ฟังก์ชัน libpq ข้างต้นก่อนที่จะนำไปใช้ภายในแบบสอบถาม SQL ในแอปพลิเคชัน BeyondTrust แบบสอบถามที่หลุดออกมาในลักษณะนี้จะถูกส่งผ่านยูทิลิตี้บรรทัดคำสั่ง psql ช่องโหว่นี้เกิดจากการขาดการตรวจสอบในฟังก์ชัน escape สำหรับความถูกต้องของอักขระ Unicode ที่ใช้ในข้อความ ซึ่งทำให้สามารถหลีกเลี่ยงการทำให้เครื่องหมายคำพูดเป็นมาตรฐานโดยการระบุลำดับ UTF-8 หลายไบต์ที่ไม่ถูกต้อง
เพื่อใช้ประโยชน์จากช่องโหว่นี้ สามารถใช้ตัวอักษร UTF-8 ที่ไม่ถูกต้องซึ่งประกอบด้วยไบต์ 0xC0 และ 0x27 (“└'”) ได้ ไบต์ 0x27 ในการเข้ารหัส ASCII สอดคล้องกับเครื่องหมายคำพูดเดี่ยว ("'") ที่ต้องได้รับการหลีกเลี่ยง ในรหัส escape การรวมกันของไบต์ 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
