มีการเผยแพร่เวอร์ชันแก้ไขของ PHP 8.5.12, 8.4.27, 8.3.36 และ 8.2.35 พร้อมด้วยแพตช์สำหรับ PHP 7.4, PHP 8.0 และ PHP 8.1 ที่ไม่ได้รับการสนับสนุนอีกต่อไป (เวอร์ชัน 5.4 ถึง 7.3 ที่มีช่องโหว่ยังคงไม่มีแพตช์) ซึ่งแก้ไขช่องโหว่ที่สำคัญสองรายการ:
- CVE-2026-109618 — การเรียกใช้โค้ดจากระยะไกลเป็นช่องโหว่ที่เกิดจากตัวจัดการหน่วยความจำไม่เพียงพอเรียกใช้ฟังก์ชัน longjmp() เมื่อกระบวนการทำงานหน่วยความจำหมด ช่องโหว่นี้อาจทำให้ตัวแปลภาษา PHP หยุดทำงานเมื่อมีการเริ่มต้นโครงสร้างภายในบางส่วนที่เกี่ยวข้องกับการประมวลผลคำขอเท่านั้น จากนั้นฟังก์ชันการเสร็จสิ้นคำขอจะเข้าถึงโครงสร้างเหล่านี้ราวกับว่าได้รับการเริ่มต้นแล้ว แม้ว่าจะไม่มีการจัดสรรหน่วยความจำให้กับโครงสร้างเหล่านั้นก็ตาม
ช่องทางการโจมตีหลักคือการจัดการคำขอแบบ multipart เพื่อทำให้หน่วยความจำของกระบวนการหมดลง เพื่อหลีกเลี่ยงข้อจำกัด post_max_size สามารถละเว้นส่วนหัว Content-Length และส่งส่วนหัว HTTP จำนวนมากได้ นอกจากนี้ยังสามารถโจมตีเป้าหมายเฉพาะการทำงานในแอปพลิเคชัน PHP ที่ใช้หน่วยความจำมากเกินไปได้ มีการยืนยันแล้วว่าช่องโหว่นี้ใช้ได้กับ mod_php เนื่องจากมันเรียกฟังก์ชัน shutdown() แม้ว่าจะเกิดความล้มเหลวก็ตาม PHP-FPM จะยุติกระบวนการลูกเมื่อเกิดความล้มเหลว ทำให้การโจมตีทำได้ยากขึ้น แต่ในทางทฤษฎีก็ไม่ใช่เรื่องที่เป็นไปไม่ได้
- CVE-2026-109619 – ช่องโหว่การเรียกใช้โค้ดจากระยะไกลเนื่องจากการใช้หน่วยความจำหลังจากถูกปล่อย (use-after-free) อันเนื่องมาจากการล้างสถานะส่วนกลางที่เกี่ยวข้องกับคำขอเฉพาะอย่างไม่ถูกต้อง หากคำขอถูกขัดจังหวะเนื่องจากข้อผิดพลาดร้ายแรง หมดเวลา หรือหน่วยความจำไม่เพียงพอ สถานะส่วนกลางอาจไม่ถูกรีเซ็ต และตัวชี้อาจยังคงทำงานอยู่แม้ว่าหน่วยความจำที่อ้างอิงจะถูกปล่อยไปแล้วก็ตาม เมื่อประมวลผลคำขอถัดไปในกระบวนการเดียวกัน ตัวชี้ที่เหลืออยู่อาจเข้าถึงสถานะส่วนกลางเก่าได้
การโจมตีสามารถทำได้โดยการสร้างสภาวะหน่วยความจำหมดระหว่างการประมวลผลคำขอแบบหลายส่วนในโค้ดแสดงความคืบหน้าการอัปโหลด (session.upload_progress) ช่องทางการโจมตีหลักและที่ได้รับการยืนยันแล้วคือตัวจัดการ fatal_error_backtraces ใน PHP 8.5 ซึ่งไม่รีเซ็ตสถานะการติดตามเมื่อเสร็จสิ้น ในกรณีแรก การโจมตีสามารถทำได้บน mod_php และ PHP-FPM ในขณะที่ในกรณีหลัง สามารถทำได้เฉพาะบน mod_php เท่านั้น นอกจากนี้ยังมีการกล่าวถึงการโจมตีที่ไม่ได้รับการยืนยันในไฟล์การกำหนดค่าที่มีคำสั่งที่ทำให้เกิดคำเตือนในช่วงต้นของการประมวลผลคำขอ (ตัวอย่างเช่น คำเตือนเกี่ยวกับการใช้พารามิเตอร์ที่ล้าสมัย)
มีการระบุว่าการปิดกั้นช่องโหว่ทั้งหมดอย่างสมบูรณ์นั้นทำได้โดยการติดตั้งการอัปเดตเท่านั้น มาตรการต่อไปนี้จะช่วยลดโอกาสการโจมตีที่ประสบความสำเร็จ แต่ไม่ได้ทำให้ระบบปลอดภัยอย่างสมบูรณ์:
- การตั้งค่าพารามิเตอร์ "memory_limit=-1" ในไฟล์ php.ini จะทำให้ผู้โจมตีควบคุมการใช้หน่วยความจำได้ยากขึ้น
- ตั้งค่าพารามิเตอร์ "post_max_size = 8M" หากคุณไม่จำเป็นต้องอัปโหลดไฟล์ขนาดใหญ่ ส่วนพารามิเตอร์ "upload_max_filesize" ควรมีค่าน้อยกว่าพารามิเตอร์ "post_max_size"
- การกำหนดขีดจำกัดการใช้หน่วยความจำที่ยอมรับได้ในระดับระบบ ผ่านพารามิเตอร์ memory.max ของ cgroup หรือพารามิเตอร์การใช้หน่วยความจำของคอนเทนเนอร์ แต่ไม่ใช่ผ่านขีดจำกัดของระบบ RLIMIT_AS และ RLIMIT_DATA ซึ่งจะทำให้เกิดการเรียกใช้ longjmp() ที่มีปัญหา
- หากประสิทธิภาพไม่ใช่สิ่งสำคัญ คุณสามารถจำกัดจำนวนคำขอที่ประมวลผลโดยกระบวนการทำงานหนึ่งๆ โดยใช้ pm.max_requests=1 ใน PHP-FPM และ MaxRequestsPerChild ใน Apache httpd
- ตั้งค่าได้ที่ไฟล์ php.ini หรือระดับการกำหนดค่า เซิร์ฟเวอร์ (ไม่ใช่ผ่าน ini_set() หรือ FPM .user.ini เนื่องจากพารามิเตอร์ต้องมีผลก่อนการประมวลผลคำขอ) พารามิเตอร์ "session.upload_progress.enabled=0.
- เมื่อใช้ PHP เวอร์ชัน 8.5 จะต้องตั้งค่าพารามิเตอร์ "fatal_error_backtraces=0"
- ลบการตั้งค่าที่ล้าสมัยหรือผิดพลาดต่อคำขอ (เช่น assert.* และเส้นทางที่ไม่ถูกต้องใน open_basedir) ซึ่งเป็นสาเหตุให้มีการแสดงข้อความวินิจฉัยก่อนการเริ่มต้นระบบ
- แก้ไขปัญหาโค้ด PHP ที่อาจนำไปสู่การหมดเวลาและข้อผิดพลาดร้ายแรง เช่น ปัญหาที่เกี่ยวข้องกับตัวจัดการการเรียกกลับและการประมวลผลการดาวน์โหลดที่ล้มเหลว
- เพื่ออุดช่องโหว่แรกในโค้ดของ PHP เวอร์ชันเก่า คุณสามารถแทนที่การเรียกใช้ longjmp() ในตัวจัดการหน่วยความจำไม่เพียงพอด้วย _exit()
- นอกจากนี้ คุณสามารถลดค่าของพารามิเตอร์ max_input_nesting_level ในไฟล์ php.ini และบล็อกคำขอแบบ multipart ได้ ตามที่แสดงในประกาศเบื้องต้น
คุณสามารถตรวจสอบสถานะการแก้ไขช่องโหว่ในระบบปฏิบัติการต่างๆ ได้ที่หน้าเว็บเหล่านี้: Debian, UbuntuSUSE, RHEL, Gentoo, Arch,
เฟโดรา, ฟรีบีเอสดี
ภาคผนวก 1: ช่องโหว่เหล่านี้ถูกระบุโดยใช้โมเดล AI GPT-5.6 และ Gemini 4 Argon OpenAI ได้เผยแพร่ยูทิลิตี้ php2shell-checker สำหรับทดสอบเว็บไซต์และไฟล์ปฏิบัติการในเครื่องเพื่อหาช่องโหว่ แต่ยูทิลิตี้นี้ตรวจสอบเฉพาะหมายเลขเวอร์ชัน PHP ที่ส่งคืนโดยเซิร์ฟเวอร์ HTTP หรือคำสั่ง "php -v" เท่านั้น โดยไม่ได้ให้การวิเคราะห์โดยละเอียด
อัปเดต 2: ผู้เขียนโค้ดโจมตีต้นแบบที่ใช้ประโยชน์จากช่องโหว่ double-free รายงานว่าปัญหานี้ยังไม่ได้รับการแก้ไขใน PHP 8.5.12 และโค้ดโจมตียังคงใช้งานได้ ตัวแทนของ PHP เคยกล่าวไว้ก่อนหน้านี้ว่าช่องโหว่นี้ไม่เกี่ยวข้องกับแพทช์ที่จะออกมาในอนาคตและไม่ใช่ปัญหาที่แท้จริง อย่างไรก็ตาม ผู้เขียนโค้ดโจมตีอ้างว่าเป็นช่องโหว่ที่แตกต่างออกไปโดยสิ้นเชิง
ที่มา: opennet.ru
