มือช่างกำลังล็อกกุญแจเหล็กที่ประตูตู้เซิร์ฟเวอร์ยามค่ำ แสงไฟ LED สีม่วงครามสะท้อนตู้ และนาฬิกาบนผนังชี้เวลาสามทุ่ม

PHP ออกแพตช์ฉุกเฉินแล้ว: อัปเป็น 8.5.12, 8.4.27, 8.3.36 หรือ 8.2.35 ด่วน

น้องกายEngineering

แพตช์ที่ PHP นัดไว้ ออกแล้วคืนนี้ 21 ตุลาคม 2026 ตามเวลาที่ประกาศ ถ้าเว็บของคุณรัน PHP อยู่ ให้อัปเป็นรุ่นต่อไปนี้ตามสายที่ใช้: 8.5.12, 8.4.27, 8.3.36 หรือ 8.2.35 ทีม PHP ติดป้ายทั้งสี่รุ่นว่าเป็น security release และขอให้ผู้ใช้ทุกคนในสายนั้นอัปเกรด (PHP) บทความนี้ต่อจากข่าวเตือนเมื่อเช้า PHP เตรียมแพตช์ฉุกเฉินคืนนี้ 3 ทุ่ม ซึ่งตอนนั้นยังไม่รู้เลขรุ่น ตอนนี้รู้แล้วครับ

สรุป 30 วินาที

  • ช่องโหว่ระดับ critical สองจุด คือ CVE-2026-109618 (GHSA-w8hw-w9fx-j79w) และ CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp) ทั้งคู่ทำให้คนนอก สั่งรันโค้ดบนเซิร์ฟเวอร์ได้โดยไม่ต้องล็อกอิน (GitHub)
  • รุ่นที่โดนคือทุกรุ่นที่ต่ำกว่า 8.2.35, 8.3.36, 8.4.27 และ 8.5.12 ของสายที่ยังซัพพอร์ตอยู่ (GitHub)
  • ทีม PHP บอกชัดว่า การอัปเดตคือทางแก้ที่เชื่อได้ทางเดียว ไม่มีการตั้งค่าใดปิดได้ครบ (GitHub)

ทำไมเรื่องนี้เกี่ยวกับคุณ

ถ้าคุณมีเว็บขายของ เว็บบริษัท เว็บโรงเรียน หรือหน้าจองคิวที่ทำด้วย WordPress หรือระบบที่เขียนด้วย PHP เรื่องนี้เกี่ยวกับคุณโดยตรง แม้จะไม่เคยพิมพ์คำว่า PHP เลยสักครั้ง เพราะช่องโหว่อยู่ที่ตัวภาษาที่รันอยู่บนเซิร์ฟเวอร์ ไม่ใช่ปลั๊กอินตัวใดตัวหนึ่ง การอัปเดตธีมหรือปลั๊กอินในหน้าแอดมินจึงไม่ได้แก้ปัญหานี้ ต้องอัปตัว PHP บนเครื่องเท่านั้น (PHP ChangeLog)

สิ่งที่คนนอกได้ถ้ายิงสำเร็จคือสิทธิ์เท่ากับโปรแกรมที่รันเว็บ ภาษาง่ายๆ คือเข้าไปเปิดไฟล์ของเว็บได้ อ่านรหัสผ่านฐานข้อมูลที่เก็บในไฟล์ตั้งค่าได้ และแก้หน้าเว็บให้แอบเก็บข้อมูลบัตรหรือข้อมูลลูกค้าได้ (GitHub) สำหรับร้านค้าออนไลน์ นี่คือความเสี่ยงต่อทั้งเงินและความเชื่อใจของลูกค้า ส่วนคนที่ใช้โฮสต์แบบแชร์ ภาระอัปเดตตกอยู่ที่ผู้ให้บริการ แต่ภาระการตามถามว่าทำแล้วหรือยังยังเป็นของเราครับ

รุ่นที่ต้องอัป

สาย PHPรุ่นที่แก้แล้ว
8.58.5.12
8.48.4.27
8.38.3.36
8.28.2.35

ข้อมูลจากหน้า releases และ ChangeLog ของ php.net ซึ่งระบุการแก้ทั้งสอง GHSA ไว้ในหมวด Core (PHP ChangeLog) ถ้าคุณยังใช้ PHP 8.1 หรือเก่ากว่า สายนั้นหมดซัพพอร์ตแล้ว ไม่มีรุ่นแก้ให้ ทางออกคือย้ายขึ้นสายที่ยังได้แพตช์ (PHP)

ทำงานยังไง (พร้อมอุปมาไทย)

ลองนึกถึงร้านข้าวแกงที่มีพนักงานล้างจานคนเดียวรับจานจากทุกโต๊ะ ช่องแรกเหมือนลูกค้าแกล้งสั่งอาหารจนถาดล้น พนักงานเลยวางมือกลางคัน ทิ้งจานที่ยังล้างไม่เสร็จไว้บนเคาน์เตอร์ แล้วคนเก็บร้านก็หยิบจานสกปรกนั้นไปใช้ต่อ ช่องที่สองเหมือนพนักงานลืมเก็บกระดาษจดออเดอร์ของโต๊ะก่อน พอโต๊ะถัดไปมาถึง ก็ทำงานตามโน้ตเก่าที่คนร้ายเขียนทิ้งไว้ ทั้งสองแบบทำให้คนนอกแทรกคำสั่งของตัวเองเข้าไปในครัวได้

CVE-2026-109618: RCE ผ่านหน่วยความจำพังตอนเมมเต็ม เวลา PHP ใช้หน่วยความจำจนชนเพดาน มันกระโดดออกจากงานกลางคัน บางจังหวะทิ้งสถานะในหน่วยความจำแบบยังตั้งค่าไม่เสร็จ แล้วขั้นตอนปิดคำขอไปอ่านของพังนั้นต่อ คนร้ายบังคับให้เมมเต็มได้ด้วยคำขออัปโหลดแบบ multipart ที่จัดมาเป็นพิเศษ ทีมยืนยันว่ายิง RCE สำเร็จบน Apache mod_php ด้วยค่าเริ่มต้น ก่อนโค้ดเว็บของคุณจะได้ทำงานเลยด้วยซ้ำ (GitHub)

CVE-2026-109619: RCE ผ่านสถานะค้างข้ามคำขอ worker ของ PHP เก็บสถานะบางอย่างไว้ เช่น error หรือ session แล้วลืมล้างก่อนคืนหน่วยความจำ คำขอถัดไปที่ตกมาที่ worker เดิมจึงไปใช้ของที่ถูกคืนไปแล้ว (use-after-free) ทีมยืนยัน RCE ได้ทั้ง mod_php และ PHP-FPM (GitHub)

จุดสังเกตคือ ผลกระทบที่ยืนยันแล้วคือรันโค้ดได้ด้วยสิทธิ์ของบัญชีที่รันเว็บ ไม่ใช่ root โดยตรง แต่แค่นั้นก็พอให้อ่านไฟล์ตั้งค่า รหัสฐานข้อมูล หรือฝังโค้ดในเว็บได้แล้ว

ใครโดนบ้าง

  • Apache mod_php เสี่ยงสุด เพราะยืนยัน RCE แล้วทั้งสองช่องโหว่ (GitHub)
  • PHP-FPM (Nginx ส่วนใหญ่) ยืนยัน RCE แล้วสำหรับ CVE-2026-109619 ส่วนอีกตัวทีมวิเคราะห์ว่าเสี่ยงแต่ยังไม่ได้สาธิตครบ (GitHub)
  • FrankenPHP และ LiteSpeed (LSAPI) ทีมประเมินจากโค้ดว่ามีแนวโน้มโดนเช่นกัน (GitHub)
  • เว็บ WordPress, ร้านค้าออนไลน์ หรือเว็บที่เขียนเองบน PHP ก็โดนในระดับตัวภาษา ไม่ขึ้นกับปลั๊กอิน

ข้อมูลที่ยังไม่ชัด และจุดที่แหล่งข่าวพูดไม่ตรงกัน

  • ข่าวเตือนเมื่อวานจาก BleepingComputer อ้าง watchTowr ว่ายังไม่พบการโจมตีจริง ประกาศของ GitHub ตอนนี้ก็ไม่ได้บอกว่ามีการโจมตีจริงแล้ว แต่ทั้งหมดเป็นสถานะ ณ เวลาที่เขียน ไม่ใช่คำรับรองว่าปลอดภัย (BleepingComputer)
  • สำหรับ CVE-2026-109618 บน PHP-FPM ทีม PHP ยังใช้คำว่าวิเคราะห์จากโค้ดแล้วเสี่ยง แต่ยังไม่มีการสาธิตโจมตีครบ ส่วน FrankenPHP และ LiteSpeed ก็เป็นการประเมินจากโค้ดเช่นกัน ไม่ควรตีความว่าปลอดภัย (GitHub)
  • ChangeLog บน php.net ลงวันที่ 22 ต.ค. ขณะที่หน้า releases ระบุ 21 ต.ค. แต่เป็นเลขรุ่นเดียวกัน ไม่ต้องรอรุ่นอื่น (PHP ChangeLog)
  • แพ็กเกจของ Ubuntu, Debian และ Docker image ทางการอาจตามมาช้ากว่าซอร์สโค้ดหลายชั่วโมงถึงหลายวัน บทความนี้ยังไม่ยืนยันเลขแพ็กเกจของ distro ใด ต้องดูจากประกาศของ distro เอง

แล้วเราควรทำอะไร

  1. เช็กรุ่น รัน php -v บนเซิร์ฟเวอร์ (หรือดู phpinfo() แล้วลบไฟล์ทิ้งหลังดู) ถ้าเลขต่ำกว่าตารางด้านบน ต้องอัป อย่าลืมว่า CLI กับ FPM อาจคนละรุ่นกัน ให้เช็ก php-fpm -v ด้วย
  2. ใช้โฮสติ้ง ทักโฮสต์ถามตรงๆ ว่าอัปเป็นรุ่นในตารางแล้วหรือยัง และเมื่อไร ถ้าเลือกรุ่น PHP เองได้ในแผงควบคุม ให้เลือกรุ่นที่แก้แล้ว
  3. Ubuntu/Debian อัปผ่าน apt update && apt upgrade แล้วดูประกาศ USN/DSA ของ distro ว่าแพ็กเกจออกแล้วหรือยัง distro มักแพตช์ย้อน (backport) โดยไม่เปลี่ยนเลขรุ่นหลัก จึงต้องดูเลขแพ็กเกจในประกาศของ distro แทน php -v อย่างเดียว
  4. Docker ดึง image ใหม่ (docker pull php:8.x-...) แล้ว build/deploy ใหม่ การรีสตาร์ตคอนเทนเนอร์เดิมไม่ได้อัปอะไร
  5. รีสตาร์ต Apache หรือ PHP-FPM หลังอัป เพราะ worker ที่ค้างอยู่ยังรันโค้ดเก่า
  6. ใครยังอัปไม่ได้ ให้พิจารณาปิดหรือแยกเว็บที่เปิดสู่อินเทอร์เน็ตชั่วคราว เพราะทีม PHP ยืนยันว่าไม่มีการตั้งค่าใดกันได้ครบ (GitHub)

ผมมองว่า…

ข่าวนี้หนักกว่าแพตช์รายเดือนทั่วไป เพราะช่องแรกยิงได้ก่อนโค้ดเว็บเริ่มทำงาน แปลว่าเว็บที่เขียนดีแค่ไหนก็ช่วยไม่ได้ ตอนนี้รายละเอียดเทคนิคเปิดเผยแล้ว ช่วงเวลาระหว่างแพตช์ออกกับคนเริ่มยิงจริงมักสั้นมาก ผมจึงมองว่าไม่ควรรอถึงพรุ่งนี้เช้าครับ

Recap

  • อัปเป็น 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 ตามสายที่ใช้ (PHP)
  • เช็ก php -v และ php-fpm -v หลังอัป
  • ทักโฮสต์ หรือดูประกาศ Ubuntu/Debian และดึง Docker image ใหม่
  • รีสตาร์ต Apache / PHP-FPM
  • PHP 8.1 ลงไปไม่มีแพตช์ ต้องย้ายสาย (PHP)