PostgreSQL วิเคราะห์ช่องโหว่ทางเทคนิค CVE-2024–10979
CVE-2024–10979 เป็นช่องโหว่ความรุนแรงสูง (คะแนน CVSS = 8.8) ใน PostgreSQL PL/Perl extension ที่อนุญาตให้ผู้ใช้ฐานข้อมูลที่ไม่มีสิทธิ์พิเศษสามารถแก้ไข environment variables ที่สำคัญได้ และสามารถนำไปสู่การรันโค้ดที่อันตราย (malicious code) ในระดับสิทธิ์ของ database server
รายละเอียดทางเทคนิค
CVE-2024–10979 เป็นประเภท Environment Variable Manipulation โดยชิ้นส่วนที่มีช่องโหว่คือ PL/Perl Extension ในลักษณะที่มีผลกระทบคืออนุญาตให้รันโค้ดใด ๆ ก็ได้ (Arbitrary Code Execution) ทำให้จัดอยู่ในความรุนแรงระดับสูง คะแนน 8.8
กลไกการโจมตี
ผู้โจมตีสามารถใช้ PL/Perl function เพื่อแก้ไขตัวแปร PATH และนำไปสู่การรันโค้ดที่อันตราย โดยไม่จำเป็นต้องมีสิทธิ์สำหรับเข้าถึงระบบปฎิบัติการ
ขั้นตอนการโจมตี (Proof of Concept)
- สร้างไฟล์ executable ที่มีโค้ดที่อันตราย และตั้งชื่อว่า psql
- อัพโหลดไฟล์ psql (ปลอม)ไปยัง directory ที่ PostgreSQL server เข้าถึงได้ สมมติว่าเป็น /opt/malicious
- สร้าง PL/Perl function
- เรียกใช้ function เพื่อแก้ไข PATH
CREATE OR REPLACE FUNCTION set_malicious_path()
RETURNS void AS $$
$ENV{'PATH'} = '/opt/malicious:' . $ENV{'PATH'};
$$ LANGUAGE plperl;
ผลลัพธ์ ในครั้งถัด ๆ ไป คำสั่งที่เรียกใช้ psql จะถูกเปลี่ยนเส้นทางจากไฟล์ psql เดิมไปใช้ไฟล์ที่ไม่พึงประสงค์แทน ทำให้โค้ดที่อันตราย (ในไฟล์ psql ใหม่) ทำงานภายใต้สิทธิ์ของ database server เป็นต้น
ตัวอย่างการโจมตีนี้เป็นเพียงตัวอย่างรูปแบบเดียวเท่านั้น ซึ่งจริง ๆ แล้วรูปแบบการโจมตีด้วยการเปลี่ยนแปลงค่า Environment Variable สามารถทำได้ในลักษณะที่ซับซ้อนกว่านี้
มาตรการแก้ไขและป้องกัน
- อัพเดท PostgreSQL เป็นเวอร์ชันที่ปลอดภัยดังต่อไปนี้
- 17.1
- 16.5
- 15.9
- 14.14
- 13.17
- 12.21
2. จำกัดการใช้งาน PL/Perl Extension
- ปิดการใช้งานหากไม่จำเป็น
- จำกัดสิทธิ์การใช้งานเฉพาะผู้ใช้ที่ไว้ใจได้
3. เพิ่มการตรวจสอบ
- มอนิเตอร์การสร้างและแก้ไข database functions
- ตรวจสอบ logs อย่างสม่ำเสมอ
- ติดตามการเปลี่ยนแปลงของ environment variables
ตัวอย่างการตรวจสอบด้วย Grype
ผมทดลองเตรียม Container Image สำหรับใช้รัน PostgreSQL 16.4 ที่มีช่องโหว่และ Scan ด้วย Grype ก็จะพบ CVE-2024–10979 อย่างที่เห็นในภาพ
คราวนี้ก็ใช้เทคนิคเฉพาะสำหรับเตรียม Container Image แบบปลอด CVE แล้ว update ตัว PostgreSQL ให้เป็น 16.5 ก็จะพบว่าปลอดภัยจากช่องโหว่ตัวนี้แล้ว (No vulnerabilities found)
สำหรับบริษัทที่ต้องการความช่วยเหลือด้าน security ที่เกี่ยวข้องกับ Cloud Native เช่นการเตรียม container image และ update อย่างต่อเนื่องอย่างไรให้ปลอดภัยจาก CVE สามารถลองคุยกันได้ทาง DM ของ LinkedIn ผมครับ