
PostgreSQL เวอร์ชันที่ปล่อยมาตั้งแต่ปี 2014 มีช่องโหว่ที่ทำให้ผู้โจมตีซึ่งมีสิทธิ์ระดับต่ำ สามารถเข้าควบคุมฐานข้อมูล และเซิร์ฟเวอร์ได้ ตามรายงานจากบริษัทด้านความปลอดภัยไซเบอร์ Cyera
PostgreSQL เป็นระบบจัดการฐานข้อมูลแบบโอเพ่นซอร์สที่รองรับทั้งข้อมูลแบบ SQL และ non-SQL (JSON) ซึ่งถือเป็นหนึ่งในฐานข้อมูลที่ได้รับความนิยมมากที่สุด ถูกใช้งานโดยบริษัทหลายหมื่นแห่ง รวมถึงองค์กรขนาดใหญ่
ช่องโหว่นี้มีหมายเลข CVE-2026-6471 (คะแนน CVSS 7.2) และถูกเรียกว่า ** PostGREShell สามารถถูกใช้โจมตีเพื่อรันโค้ดที่เป็นอันตรายจากระยะไกล (Remote Code Execution) และการยกระดับสิทธิ์ (Privilege Escalation)
ช่องโหว่นี้ถูกอธิบายว่าเป็นช่องโหว่การขาดการตรวจสอบสิทธิ์ (Missing Authorization) ในส่วน Logical Decoding ของฐานข้อมูล และสามารถถูกใช้โจมตีโดยผู้โจมตีที่มีสิทธิ์ 'Replication' เพื่อโหลดไฟล์ใดก็ได้ที่มองเห็นโดยบัญชี OS ของเซิร์ฟเวอร์ ผ่านปลั๊กอิน Logical Decoding
Cyera อธิบายว่า PostgreSQL ใช้โปรโตคอล Replication เพื่อซิงค์ข้อมูลระหว่างฐานข้อมูลหลักกับเครื่อง Replicas หลายเครื่อง สำหรับการสำรอง และกู้คืนข้อมูล การทำงานนี้ต้องใช้บัญชี Replication ซึ่งจะถูกมอบให้กับ backup tool, server, pipeline และ monitoring utility ที่เชื่อมต่ออยู่
การเปลี่ยนแปลงจะถูกบันทึกโดย Local Replication เป็น Table Events เพื่อให้เครื่องมือภายนอกอ่านได้ โดยสร้าง Logical Replication Slot และระบุชื่อ Output Plugin ที่ถูกโหลดโดย PostgreSQL เพื่อจัดรูปแบบสตรีมข้อมูล
เมื่อปลั๊กอินถูกโหลด PostgreSQL จะรันฟังก์ชัน init ของปลั๊กอินด้วยสิทธิ์ของ Server Process เพื่อป้องกันการใช้งานในทางที่ผิด ผู้ใช้ที่ไม่ใช่ Superuser จะสามารถโหลดได้เฉพาะปลั๊กอินที่อยู่ในไดเรกทอรีที่ผู้ดูแลระบบกำหนดไว้เท่านั้น
Cyera พบว่า ชื่อของปลั๊กอินถูกส่งไปยังตัวโหลดโดยตรงโดยไม่มีการตรวจสอบ หรือ Sanitization ข้อมูล ทำให้ผู้โจมตีสามารถส่ง Path ระบบไฟล์แบบเต็มไปยังตัวโหลดเพื่อส่งต่อไปยัง dlopen() ซึ่งเป็นฟังก์ชัน C/C++ ที่ใช้โหลด Dynamic Shared Libraries
โดย parser ของโปรโตคอล replication จะยอมรับตัวอักษรเกือบทุกรูปแบบที่อยู่ภายในชื่อปลั๊กอินแบบ Double-quoted: ทั้ง Slashes, Backslashes, Dots, ../ traversal หรือแม้กระทั่ง Windows UNC Paths
ทำให้ผู้โจมตีสามารถโหลด และรันไฟล์ใดก็ได้ผ่าน dlopen() โดยไฟล์ดังกล่าวจะถูกรันด้วยสิทธิ์ของผู้ใช้ระบบ postgres
โค้ดที่ถูกโหลดผ่าน dlopen() จะทำงานใน Address Space เดียวกันกับ PostgreSQL โดยไม่มี Sandbox และไม่มีการตรวจสอบการเรียกใช้ API ภายใน เซิร์ฟเวอร์จะเชื่อถือโค้ดใด ๆ ที่ถูกโหลดขึ้นมาทันที
ดังนั้น ปลั๊กอินจะเรียกใช้ฟังก์ชันภายในเพื่อกลายเป็น Bootstrap Superuser สำหรับเซสชันนั้น จากนั้นเขียนลง Table catalog pg_authid ซึ่งเป็น Table ที่กำหนดว่าใครเป็น Superuser โดยตรง และปรับสิทธิ์ทุกอย่างเป็น True
ถึงจุดนี้ ผู้โจมตีจะได้รับสิทธิ์ Superuser ถาวร โดยสามารถเข้าถึงทุก Table ในทุกฐานข้อมูล รันคำสั่ง OS อ่าน Private Keys และเขียนไฟล์ไปยังตำแหน่งใดก็ได้ที่ Process ของ postgres เข้าถึงได้
ตามข้อมูลจาก Cyera ปลั๊กอินยังสามารถฝังกลไก Backdoor ได้อีกด้วย เช่น เปิดให้เชื่อมต่อได้โดยไม่ต้องใช้รหัสผ่าน คัดลอกตัวเองไปยังตำแหน่งที่ stable และลงทะเบียนตัวเองให้ถูกโหลดใหม่เข้าสู่ Backend ใหม่ทุกตัว รวมถึงสามารถปรับใช้การเปลี่ยนแปลง Superuser อีกครั้งแม้ว่าจะถูกยกเลิกสิทธิ์ไปแล้วก็ตาม
PostGREShell เปลี่ยนข้อมูล Replication credential ให้กลายเป็นช่องทางในการเรียกใช้โค้ด เข้าถึงสิทธิ์ผู้ใช้ระดับ Superuser และเป็น Backdoor ถาวรบนฐานข้อมูลที่อยู่เบื้องหลังเว็บไซต์ส่วนใหญ่บนอินเทอร์เน็ตจำนวนมาก ทุกเวอร์ชันตั้งแต่ 9.4 ถึง 18 ได้รับผลกระทบ (ยืนยันแล้วบนเวอร์ชัน 18.2) และเนื่องจาก Logical Replication กลายเป็นโครงสร้างพื้นฐานมาตรฐานในระบบ Production เส้นทางที่มีช่องโหว่นี้จึงมีอยู่เกือบทุกที่ที่ PostgreSQL ทำงาน
CVE-2026-6471 ได้รับการแก้ไขแล้วใน PostgreSQL เวอร์ชัน 18.6, 17.11, 16.15, 15.19 และ 14.24 โดยแนะนำให้องค์กรต่าง ๆ อัปเดต Instance ของตนโดยเร็วที่สุด ตรวจสอบ Replication account และนำ Replication ออกจาก account ที่ไม่จำเป็น
ที่มา : Securityweek

You must be logged in to post a comment.