เมื่อวันที่ 21 ตุลาคม 2026 ทาง PHP Group และสถาบันมาตรฐานและเทคโนโลยีแห่งชาติสหรัฐฯ (NIST) ได้เปิดเผยช่องโหว่ความปลอดภัยระดับวิกฤตภายใต้รหัส CVE-2026-109618 (ซึ่งถูกรายงานควบคู่กับ CVE-2026-109619) ช่องโหว่นี้กระทบต่อ Core Runtime ของ Zend Engine โดยตรง ทำให้ผู้โจมตีจากระยะไกลสามารถยึดสิทธิ์และสั่งประมวลผลโค้ดอันตราย (Remote Code Execution – RCE) ผ่านพฤติกรรมการจัดการหน่วยความจำที่ผิดพลาด
ต้นตอของปัญหา (Vulnerability Root Cause)
ในสถาปัตยกรรมภายในของ Zend Engine ตัวประมวลผล PHP จะใช้ฟังก์ชันระดับ C Library อย่าง setjmp() และ longjmp() เพื่อรองรับกระบวนการ Exception และ Error Recovery เมื่อเกิดข้อผิดพลาดรุนแรง เช่น Out-Of-Memory (OOM) ระหว่างการทำงานของ Request
ปัญหาของ CVE-2026-109618 เกิดขึ้นจากกลไกดังต่อไปนี้
- Uninitialized Memory State
ในบางบริบทของการประมวลผลคำขอ (Request Context) โค้ดมีการจองหน่วยความจำแต่ยังไม่ได้ Initialize ข้อมูลให้เสร็จสมบูรณ์ - Abrupt Stack Unwinding
หากระบบเกิดภาวะ Out-Of-Memory ในจังหวะนั้น ระบบจะกระโดดข้ามลำดับการทำงานปกติทันทีด้วยlongjmp()เพื่อไปยังจุด Abort Handler - Flawed Cleanup Routine
เมื่อเข้าสู่ขั้นตอนการล้างทรัพยากร (Request Shutdown/Cleanup) ตัว Engine จะพยายามคืนหน่วยความจำและปิด Pointer ต่างๆ แต่เนื่องจาก Memory Block นั้นยังอยู่ในสถานะ Uninitialized ระบบจึงไปอ่านค่าหรือแตก Branch ตาม Pointer ที่เป็นขยะ (Uninitialized Pointer Access / Use-After-Free) - Predictable Exploitation
ผู้โจมตีสามารถส่ง Payload ขนาดใหญ่หรือออกแบบ Request หลายรูปแบบเพื่อบีบให้ PHP เกิด OOM ในจังหวะที่กำหนดได้อย่างแม่นยำ ส่งผลให้สามารถควบคุม Register และ Execution Flow จนกลายเป็นการรันโค้ดระดับ Binary (RCE) ในฐานะยูสเซอร์ของเว็บเซิร์ฟเวอร์ (เช่นwww-data)
ผลกระทบและเวอร์ชันที่ได้รับผลกระทบ
ช่องโหว่นี้ถูกจัดประเภทตาม CWE-ID หลัก 4 รายการ ได้แก่
- CWE-1325
Improperly Controlled Sequential Memory Allocation - CWE-416
Use After Free - CWE-755
Improper Handling of Exceptional Conditions - CWE-824
Access of Uninitialized Pointer
เวอร์ชันที่ได้รับผลกระทบ (Affected Versions)
- PHP 8.2.x
ต่ำกว่ารุ่น 8.2.35 - PHP 8.3.x
ต่ำกว่ารุ่น 8.3.36 - PHP 8.4.x
ต่ำกว่ารุ่น 8.4.27 - PHP 8.5.x
ต่ำกว่ารุ่น 8.5.12
แนวทางการแก้ไขและการป้องกัน
การอัปเกรดแพ็กเกจ (Recommended)
วิธีแก้ไขที่เบ็ดเสร็จและสมบูรณ์ที่สุดคือการอัปเดต PHP ไปยังเวอร์ชันที่มีแพตช์ทางการ (เช่น PHP 8.5.12 หรือแพ็กเกจของ OS Distribution ที่ backport คอมมิต Avoid state corruption via OOM เข้าไปแล้ว)
สำหรับระบบ Ubuntu / Debian
Bash
sudo apt update && sudo apt --only-upgrade install "php8.5*"
sudo systemctl restart php8.5-fpm
มาตรการบรรเทาความเสียหายชั่วคราว (Mitigation)
หากเซิร์ฟเวอร์ยังไม่สามารถอัปเกรดไบนารีได้ทันที สามารถลดความเสี่ยงจากการถูกทำ Exploit ได้ด้วยวิธีต่อไปนี้
- ควบคุมการรีไซเคิล Worker ของ PHP-FPM
กำหนดค่าในไฟล์คอนฟิก Pool (/etc/php/8.5/fpm/pool.d/www.conf):Ini, TOMLpm.max_requests = 200เพื่อบังคับให้ Worker คืน Memory ทั้งหมดสู่ระบบปฏิบัติการอย่างสม่ำเสมอ ลดโอกาสที่ Stale Pointer หรือ Heap State ที่เสียหายจะค้างอยู่ใน Process - จำกัดขนาด Request Body บน Reverse Proxy
ตั้งค่า Nginx หรือ Cloudflare WAF ให้จำกัดขนาดการส่งข้อมูล (client_max_body_size) เพื่อป้องกันไม่ให้ผู้โจมตียิง Request ขนาดใหญ่เข้ามา trigger สภาวะ OOM ได้ง่าย - ตั้งค่า Memory Limit อย่างรัดกุม
ตรวจสอบphp.iniโดยไม่ตั้งmemory_limit = -1และกำหนดmax_execution_timeให้สมเหตุสมผลกับการใช้งานจริง