PlusMagi's Blog By Pitt Phunsanit Uncategorized เจาะลึก CVE-2026-109618: ช่องโหว่ OOM Handling สู่ Remote Code Execution บน PHP Engine

เจาะลึก CVE-2026-109618: ช่องโหว่ OOM Handling สู่ Remote Code Execution บน PHP Engine

เมื่อวันที่ 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 เกิดขึ้นจากกลไกดังต่อไปนี้

  1. Uninitialized Memory State
    ในบางบริบทของการประมวลผลคำขอ (Request Context) โค้ดมีการจองหน่วยความจำแต่ยังไม่ได้ Initialize ข้อมูลให้เสร็จสมบูรณ์
  2. Abrupt Stack Unwinding
    หากระบบเกิดภาวะ Out-Of-Memory ในจังหวะนั้น ระบบจะกระโดดข้ามลำดับการทำงานปกติทันทีด้วย longjmp() เพื่อไปยังจุด Abort Handler
  3. Flawed Cleanup Routine
    เมื่อเข้าสู่ขั้นตอนการล้างทรัพยากร (Request Shutdown/Cleanup) ตัว Engine จะพยายามคืนหน่วยความจำและปิด Pointer ต่างๆ แต่เนื่องจาก Memory Block นั้นยังอยู่ในสถานะ Uninitialized ระบบจึงไปอ่านค่าหรือแตก Branch ตาม Pointer ที่เป็นขยะ (Uninitialized Pointer Access / Use-After-Free)
  4. 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 ให้สมเหตุสมผลกับการใช้งานจริง