สรุปสั้น
Pillow ไลบรารีจัดการภาพที่ใช้แพร่หลายที่สุดของ Python ออกเวอร์ชัน 13.0.0 เมื่อวันที่ 16 ตุลาคม 2569 เป็นรุ่นความปลอดภัยขนาดใหญ่ที่แก้ช่องโหว่ตั้งแต่ระดับต่ำถึงวิกฤต ช่องโหว่ที่ถูกพูดถึงมากที่สุดคือ CVE-2026-112900 ในการเปิดไฟล์ EPS ซึ่ง Pillow ส่งชื่อไฟล์ให้ Ghostscript โดยไม่ตรวจก่อน ทำให้ชื่อไฟล์ที่ผู้โจมตีกำหนดถูกตีความเป็นคำสั่งและรันคำสั่งระบบปฏิบัติการบนเซิร์ฟเวอร์ได้ ช่องโหว่นี้กระทบ Pillow ตั้งแต่ 2.6.0 ถึง 12.3.0 บนเครื่องที่ติดตั้งโปรแกรม gs ไว้
ช่องโหว่ระดับวิกฤตตามการจัดของผู้ดูแลมีสองกลุ่ม คือบั๊กหน่วยความจำที่นำข้อมูลภาพเก่ามาใช้ซ้ำหลังเปลี่ยนโหมด และช่องโหว่ overflow สองตัวในการถอดรหัส JPEG ซึ่งตัวหนึ่งในรูปแบบ FlashPix ถูกสาธิตว่ารันคำสั่งได้เพียงเรียก Image.open() กับไฟล์ที่สร้างขึ้น อีกตัวคือ CVE-2026-112403 ที่ Anthropic ค้นพบด้วย Claude ส่วน CVE-2026-112393 ใน TIFF ซ่อนอยู่ในโค้ดมาตั้งแต่ปี 2556 OX Security ประเมินว่า Pillow ถูกดาวน์โหลดราว 436 ล้านครั้งต่อเดือน ยังไม่มีรายงานการโจมตีจริง และทางแก้คืออัปเกรดเป็น 13.0.0
รายละเอียดข่าว
เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 23 ตุลาคม 2569 ว่า Pillow ถูกทำให้รันคำสั่งระบบปฏิบัติการบนเซิร์ฟเวอร์ได้ ด้วยการกำหนดชื่อไฟล์ที่สั่งให้เปิด Pillow ใช้ในแทบทุกที่ที่ Python จัดการภาพ ทั้งฟอร์มอัปโหลดบนเว็บไซต์ เครื่องมือทำอวาตาร์และภาพย่อ ไปป์ไลน์เอกสารและ PDF และโปรเจกต์ machine learning ส่วนใหญ่ บริษัท OX Security ผู้เผยแพร่รายงานที่ทำให้ช่องโหว่ชุดนี้ได้รับความสนใจ ประเมินว่ามีการดาวน์โหลดราว 436 ล้านครั้งต่อเดือน
ผู้ดูแลจัดระดับ CVE-2026-112900 ไว้ที่ระดับปานกลาง เพราะผู้โจมตีต้องควบคุมชื่อไฟล์ได้ ขณะที่ระเบียน CVE ที่ GitHub ออกให้คะแนน 9.2 จาก 10 พร้อมระบุเงื่อนไขเดียวกัน ระเบียน CVE ของช่องโหว่ EPS, TIFF และ JPEG thumbnail ได้คะแนน 9.2 ทั้งหมด แต่แต่ละตัวมีเงื่อนไขที่คะแนนไม่ได้สะท้อน และระดับที่ผู้ดูแลจัดเองไล่ตั้งแต่ปานกลางถึงวิกฤต นักวิเคราะห์ของ CISA ระบุในระเบียน CVE ว่ายังไม่พบการโจมตีจริงสำหรับช่องโหว่ EPS และมี proof of concept สาธารณะสำหรับช่องโหว่ TIFF
ช่องโหว่ CVE-2026-112403 ได้รับการระบุใน advisory ว่า “ค้นพบโดย Anthropic ซึ่งใช้ Claude ศึกษาความปลอดภัยของซอฟต์แวร์โอเพนซอร์ส และตรวจยืนยันด้วยมือโดย Ada Logics” ซึ่งเป็นส่วนหนึ่งของโครงการที่พบช่องโหว่หลายร้อยรายการในไลบรารีโอเพนซอร์ส

รายละเอียดช่องโหว่
CVE-2026-112900 (EPS ผ่าน Ghostscript) Pillow เปิดไฟล์ EPS โดยส่งชื่อไฟล์ให้ Ghostscript โปรแกรมแยกที่ใช้แปลงภาพเป็นพิกเซล โดยไม่ตรวจชื่อไฟล์ก่อน Ghostscript อ่านชื่อที่ผู้โจมตีเลือกเป็นคำสั่งแทนชื่อไฟล์ได้ และชี้ไปยังไฟล์ที่สองที่บรรจุคำสั่งให้รัน advisory ระบุชัดว่า “ช่องโหว่ถูกกระตุ้นด้วยชื่อไฟล์ ไม่ใช่สิ่งใดในเอกสาร PostScript” แปลว่าไฟล์ EPS ที่ไม่มีพิษก็สร้างความเสียหายได้ถ้าผู้โจมตีกำหนดชื่อ เป้าหมายที่เป็นไปได้จริงจึงเป็น endpoint อัปโหลดที่เก็บหรือสร้างชื่อไฟล์จากข้อมูลของผู้ใช้
JPEG ในรูปแบบ FlashPix (FPX) ถูกสาธิตว่ารันคำสั่งของผู้โจมตีได้จากการเรียก Image.open() เพียงครั้งเดียวกับไฟล์ที่สร้างขึ้น ตราบใดที่ติดตั้งแพ็กเกจเสริม olefile ไว้ Pillow ระบุชนิดไฟล์จากเนื้อหา ไม่ใช่จากนามสกุล เซิร์ฟเวอร์ที่เปิดไฟล์อัปโหลดที่ไม่น่าเชื่อถือจึงถูกโจมตีได้โดยไม่ต้องมีการกระทำของผู้ใช้
CVE-2026-112403 (JPEG thumbnail) ทำให้บัฟเฟอร์หน่วยความจำล้นเมื่อโปรแกรมสร้างภาพย่อจากไฟล์ lossless JPEG ที่สร้างขึ้น advisory รายงานเพียงการทำให้โปรแกรมล่ม ไม่ใช่การรันโค้ด
CVE-2026-112393 (TIFF) อยู่ใน Pillow มาตั้งแต่ปี 2556 ทำให้บัฟเฟอร์ล้นเมื่อโปรแกรมบันทึกภาพ TIFF แบบบีบอัดลงหน่วยความจำ (เช่น io.BytesIO) แทนไฟล์บนดิสก์ ซึ่งเป็นรูปแบบปกติของบริการที่เข้ารหัสภาพอัปโหลดใหม่แล้วส่งกลับ ผู้รายงานทำให้โปรเซสล่มได้ และยกระดับเป็นการรันโค้ดได้ก็ต่อเมื่อใช้ร่วมกับช่องโหว่อีกตัวที่รั่วที่อยู่หน่วยความจำ การบันทึกลงไฟล์จริงบนดิสก์ไม่ได้รับผลกระทบ
ผลกระทบ
Pillow เป็น dependency ทางอ้อมของแอปพลิเคชัน Python จำนวนมาก องค์กรอาจใช้อยู่โดยไม่รู้ตัวผ่านเฟรมเวิร์กเว็บ ระบบจัดการเอกสาร หรือไลบรารี machine learning บริการที่รับภาพจากผู้ใช้ภายนอก เช่น ระบบอัปโหลดอวาตาร์ ระบบสร้างภาพย่อ หรือไปป์ไลน์ประมวลผลเอกสาร คือจุดเสี่ยงหลัก โดยเฉพาะช่องโหว่ FPX ที่ไม่ต้องอาศัยการควบคุมชื่อไฟล์ และช่องโหว่ TIFF ที่มี PoC สาธารณะแล้ว
อีกประเด็นคือคอนเทนเนอร์และอิมเมจที่ฝัง Pillow เวอร์ชันเก่าไว้ การอัปเดตแพ็กเกจในเครื่องพัฒนาไม่พอ ต้องบิลด์อิมเมจใหม่ทั้งหมด และ Pillow 13 เลิกรองรับ Python 3.10 ระบบที่ยังใช้ Python 3.10 จึงต้องอัปเกรดตัวภาษาก่อน ซึ่งอาจทำให้การแพตช์ล่าช้า
คำแนะนำ
- อัปเกรดเป็น Pillow 13.0.0 ขึ้นไป (
pip install -U "Pillow>=13.0.0") และบิลด์คอนเทนเนอร์ wheel และ base image ที่ฝัง Pillow เวอร์ชันเก่าใหม่ทั้งหมด - ระบบที่ยังใช้ Python 3.10 ต้องอัปเกรดเป็น Python 3.11 ขึ้นไปด้วย เพราะ Pillow 13 เลิกรองรับ 3.10
- สแกน dependency ทางอ้อม (เช่น ด้วย
pip-auditหรือ SBOM) เพื่อหาแอปที่ดึง Pillow มาใช้โดยไม่ได้ประกาศตรง ๆ - ระหว่างยังอัปเกรดไม่ได้: ไม่ติดตั้งโปรแกรม
gsบนเครื่องที่ประมวลผลไฟล์อัปโหลดที่ไม่น่าเชื่อถือ และห้ามส่งชื่อไฟล์ที่ผู้โจมตีควบคุมได้ให้Image.open() - สำหรับ JPEG ที่ไม่น่าเชื่อถือ หลีกเลี่ยง
draft()และthumbnail()หรือเรียกload()ก่อน หรือส่งreducing_gap=None - ถือว่าการบันทึก TIFF ลงบัฟเฟอร์ในหน่วยความจำจากภาพของผู้ใช้เป็นเส้นทางอ่อนไหว และพิจารณาถอด
olefileออกถ้าไม่จำเป็นต้องเปิดไฟล์ FPX - จำกัดรูปแบบไฟล์ที่ยอมรับด้วย
Image.open(fp, formats=[...])ให้เหลือเฉพาะที่ระบบต้องใช้จริง และรันงานประมวลผลภาพใน sandbox ที่มีสิทธิ์ต่ำ
