ไฟล์ภาพ PNG ไม่ปลอดภัย! พบช่องโหว่ใหม่เสี่ยงข้อมูลรั่ว แค่เปิดรูปก็โดนแล้ว
นักวิจัยด้านความปลอดภัยเปิดเผยช่องโหว่ระดับร้ายแรง 2 รายการใน libpng ซึ่งเป็นไลบรารีมาตรฐานที่ถูกใช้อย่างแพร่หลายสำหรับประมวลผลไฟล์ภาพ PNG
ช่องโหว่เหล่านี้เปิดทางให้แฮกเกอร์สามารถโจมตีจากระยะไกลได้ เพียงหลอกให้แอปพลิเคชันเปิดไฟล์ PNG ที่ถูกออกแบบมาเป็นพิเศษ โดยยังคงเป็นไฟล์ที่ “ถูกต้องตามมาตรฐาน” แต่แฝง payload อันตรายอยู่ภายใน
ผลกระทบมีตั้งแต่ทำให้โปรแกรมล่ม (crash) ไปจนถึงการรั่วไหลของข้อมูลในหน่วยความจำ และในบางกรณีอาจนำไปสู่การรันโค้ดอันตราย (Remote Code Execution) ได้
ช่องโหว่แรก: Use-After-Free เปิดทางเขียนทับหน่วยความจำ
ช่องโหว่แรกถูกระบุเป็น CVE-2026-33416 มีคะแนนความรุนแรงระดับสูง (CVSS 8.1) โดยมีสาเหตุจากปัญหา use-after-free ภายในโค้ดที่จัดการ transparency และ palette ของภาพ
ปัญหาเกิดจากการที่ฟังก์ชันอย่าง png_set_tRNS และ png_set_PLTE ใช้ buffer เดียวกันร่วมกันระหว่างโครงสร้าง png_struct และ png_info ทั้งที่ทั้งสองมี lifecycle แยกจากกัน
เมื่อโปรแกรมมีการ free หน่วยความจำผ่านโครงสร้างหนึ่ง จะทำให้อีกโครงสร้างยังคงมี pointer ที่ชี้ไปยังหน่วยความจำเดิม (dangling pointer)
ในขั้นตอนถัดไปของการประมวลผลภาพ เช่น row-transform ระบบจะนำ pointer นี้มาใช้งานอีกครั้ง ทำให้เกิดการเข้าถึงหน่วยความจำที่ถูกลบไปแล้ว
จุดอันตรายคือ แฮกเกอร์สามารถควบคุมค่า transparency ภายในไฟล์ PNG ได้ทั้งหมด ทำให้สามารถกำหนดข้อมูลที่จะถูกเขียนกลับเข้าไปในหน่วยความจำที่ถูก free ไปแล้วได้
ผลลัพธ์คือ
การอ่านข้อมูลหลัง free (read-after-free) → เสี่ยงข้อมูลรั่ว
การเขียนข้อมูลหลัง free (write-after-free) → ทำให้ heap เสียหาย
ในบางสภาพแวดล้อม โดยเฉพาะระบบ embedded หรือเซิร์ฟเวอร์เก่าที่ไม่มีระบบป้องกันหน่วยความจำอย่าง ASLR/PIE ช่องโหว่นี้สามารถถูกใช้เพื่อรันโค้ดอันตรายได้จริง
ช่องโหว่นี้กระทบ libpng เวอร์ชัน 1.2.1 ถึง 1.6.55
ช่องโหว่ที่สอง: Out-of-Bounds บน ARM ทำให้ระบบล่ม
ช่องโหว่ที่สองคือ CVE-2026-33636 (CVSS 7.1) เป็นปัญหา out-of-bounds read/write ในโค้ดที่ optimize สำหรับ ARM/AArch64 ด้วย Neon
ปัญหาเกิดขึ้นในขั้นตอนแปลงภาพแบบ palette (8-bit) ไปเป็นฟอร์แมตสีปกติ โดย loop ที่ถูก optimize จะประมวลผลข้อมูลช่วงท้ายของภาพโดยไม่ตรวจสอบว่ามี pixel เพียงพอหรือไม่
ผลคือ iteration สุดท้ายของ loop จะไปอ่าน pointer ก่อนจุดเริ่มต้นของ buffer และเขียนข้อมูล palette ไปยังตำแหน่งหน่วยความจำที่ “ติดลบ” จาก buffer จริง
สิ่งที่เกิดขึ้นคือ heap corruption ซึ่งนำไปสู่การ crash ของโปรแกรมได้อย่างสม่ำเสมอ (denial of service)
แม้ยังไม่มีการยืนยันการรันโค้ดจากช่องโหว่นี้ แต่ก็สามารถทำให้เกิดการอ่านข้อมูลนอกขอบเขต (out-of-bounds read) ซึ่งอาจเผยข้อมูลในหน่วยความจำออกมาได้ผ่านผลลัพธ์ของภาพที่ decode
ช่องโหว่นี้กระทบเฉพาะระบบ ARM/AArch64 ที่เปิดใช้ Neon และอยู่ใน libpng เวอร์ชัน 1.6.36 ถึง 1.6.55
ช่องโหว่ทั้งสองรายการนี้ตอกย้ำว่า “ไฟล์ภาพธรรมดา” ก็สามารถกลายเป็นเครื่องมือโจมตีได้ หากมีการฝังโค้ดในระดับโครงสร้างของไฟล์
นักพัฒนาและองค์กรควรอัปเดต libpng เป็นเวอร์ชัน 1.6.56 หรือใหม่กว่าโดยด่วน ซึ่งได้แก้ไขปัญหาเรื่อง lifecycle ของหน่วยความจำ และเพิ่มการตรวจสอบขอบเขตของข้อมูลอย่างเข้มงวด
ป้องกันตัวสำหรับผู้ใช้ทั่วไป
แม้ช่องโหว่นี้จะเกิดในระดับไลบรารีที่อยู่เบื้องหลังแอปจำนวนมาก ซึ่งเป็นหน้าที่ของนักพัฒนาในการปรับแก้ไข แต่ผู้ใช้ทั่วไปก็สามารถลดความเสี่ยงได้ด้วยพฤติกรรมการใช้งานที่ระมัดระวังมากขึ้น
สิ่งสำคัญที่สุดคือการอัปเดตระบบปฏิบัติการและแอปพลิเคชันให้เป็นเวอร์ชันล่าสุดอยู่เสมอ เพราะแพตช์ความปลอดภัยมักถูกปล่อยออกมาเพื่อปิดช่องโหว่ลักษณะนี้โดยตรง
ในขณะเดียวกัน ควรหลีกเลี่ยงการดาวน์โหลดหรือเปิดไฟล์ภาพจากแหล่งที่ไม่น่าเชื่อถือ แม้จะเป็นเพียงไฟล์ .PNG ก็ตาม เพราะไฟล์สามารถถูกดัดแปลงให้แฝงโค้ดอันตรายได้โดยที่ผู้ใช้ไม่สังเกตเห็น
อีกหนึ่งแนวทางที่ช่วยลดความเสี่ยงคือการใช้ซอฟต์แวร์หรือแอปที่มีระบบ sandbox หรือกลไกป้องกันหน่วยความจำ ซึ่งจะช่วยจำกัดผลกระทบหากมีการโจมตีเกิดขึ้น

