01PHP2Shell คืออะไร
PHP2Shell ไม่ใช่ช่องโหว่ของ WordPress หรือปลั๊กอินตัวใดตัวหนึ่ง แต่เป็นช่องโหว่ใน ตัว PHP เอง ซึ่งเป็นภาษาที่เว็บไซต์ราว 69% ของโลกใช้อยู่ ผู้โจมตีส่งคำขอ (HTTP request) ที่สร้างขึ้นมาเป็นพิเศษไปยังเว็บ แล้วสั่งรันโค้ดบนเซิร์ฟเวอร์ได้ด้วยสิทธิ์ของโปรเซสที่รันเว็บ โดยไม่ต้องมีบัญชีหรือรหัสผ่าน
ทั้งสองช่องโหว่มีต้นเหตุคล้ายกัน คือ PHP ปล่อยให้หน่วยความจำอยู่ในสภาพเสียหายเมื่อคำขอจบลงผิดปกติ แล้วคำขอถัดไปที่รันบน worker ตัวเดียวกันนำข้อมูลเสียนั้นไปใช้ต่อ
หน่วยความจำเสียหายหลัง out-of-memory
เมื่อการจัดการกรณีหน่วยความจำเต็ม (out-of-memory) ถูกขัดจังหวะ ข้อมูลของคำขอจะค้างอยู่ครึ่ง ๆ กลาง ๆ และขั้นตอนเก็บกวาดของ PHP กลับเชื่อว่าข้อมูลนั้นถูกต้อง นำไปสู่การรันโค้ดด้วยสิทธิ์ของ web worker
CVSS v4.0 9.2สถานะภายในค้างข้ามคำขอ (stale global state)
สถานะภายในที่ผูกกับคำขอหนึ่งยังค้างอยู่หลังหน่วยความจำถูกคืนไปแล้ว คำขอถัดไปบน worker เดียวกันใช้มันก่อนถูกรีเซ็ต ทำให้เกิด use-after-free อ่านข้อมูลในหน่วยความจำได้ และรันโค้ดได้
CVSS v4.0 9.202ไทม์ไลน์
Calif และ Wiz พบช่องโหว่แยกกัน และแจ้งทีม PHP
Amazon Threat Intelligence พบความพยายามโจมตีใน honeypot (MadPot) ก่อนประกาศ 4 วัน
ทีม PHP แจ้งล่วงหน้าให้ผู้ดูแลระบบเตรียมอัปเดตฉุกเฉิน และมีรายละเอียดบางส่วนรั่วออกมาก่อนกำหนด
ทีม PHP ออก 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 พร้อมแพตช์ระดับซอร์สสำหรับ 7.4, 8.0 และ 8.1 · CISA ออกประกาศให้อัปเดตทันที · Cloudflare เปิด WAF rules ชั่วคราวให้ทุกแพ็กเกจ · watchTowr รายงานว่าพบการโจมตีใน honeypot
ผู้ผลิตอุปกรณ์ที่ฝัง PHP ไว้ภายในเริ่มประกาศผลกระทบ เช่น Palo Alto Networks ยืนยันว่า PAN-OS ได้รับผลกระทบ
03ใครได้รับผลกระทบ
ทีม PHP ระบุว่า ทุกการติดตั้ง PHP ที่ให้บริการหน้าเว็บ ได้รับผลกระทบ ไม่ว่าจะใช้วิธีรันแบบใด แต่ระดับความเสี่ยงต่างกัน
| วิธีรัน PHP (SAPI) | สถานะ | หมายเหตุ |
|---|---|---|
Apache + mod_php | เสี่ยงสูงสุด | มีวิธีโจมตีที่ยืนยันแล้ว คำขอเดียวที่ไม่ต้องล็อกอินก็โจมตีได้ก่อนโค้ดของเว็บเริ่มทำงาน |
| PHP-FPM (Nginx / Apache) | ได้รับผลกระทบ | ใช้กันมากที่สุดบน VPS และคลาวด์ ประกาศของ PHP ระบุว่าวิเคราะห์ซอร์สแล้วเข้าข่าย แม้ยังไม่มีการสาธิตการโจมตีเต็มรูปแบบบน FPM สำหรับ CVE-2026-109618 |
| php-cgi, FrankenPHP, LiteSpeed | ได้รับผลกระทบ | รวมถึงโฮสติ้งแบบแชร์ที่ใช้ LiteSpeed |
| PHP ที่ฝังในซอฟต์แวร์อื่น | ตรวจกับผู้ผลิต | cPanel, Plesk, อุปกรณ์เครือข่าย และ Docker image ที่มี PHP อยู่ข้างใน |
เส้นทางโจมตีหลักที่ JFrog วิเคราะห์ไว้ต้องอาศัยการตั้งค่า session.upload_progress.enabled=On ซึ่งเป็น ค่าเริ่มต้นของ PHP เว็บส่วนใหญ่จึงเข้าข่ายโดยไม่รู้ตัว
04รุ่นที่แก้แล้ว
| สายรุ่น | ได้รับผลกระทบ | รุ่นที่แก้แล้ว | หมายเหตุ |
|---|---|---|---|
| PHP 8.5 | ก่อน 8.5.12 | 8.5.12 | ปิด fatal_error_backtraces ได้เป็นมาตรการเสริม |
| PHP 8.4 | ก่อน 8.4.27 | 8.4.27 | |
| PHP 8.3 | ก่อน 8.3.36 | 8.3.36 | |
| PHP 8.2 | ก่อน 8.2.35 | 8.2.35 | |
| PHP 7.4 / 8.0 / 8.1 | ได้รับผลกระทบ | ไม่มีรุ่นสำเร็จรูป | มีแพตช์ระดับซอร์สแบบลดความเสี่ยงขั้นต่ำ ในสาขา PHP-7.4-CVE-2026-109618-109619 (และ 8.0, 8.1) บน GitHub ต้องคอมไพล์เอง หรือใช้แพ็กเกจจาก distro / ผู้ให้บริการ LTS |
| PHP 5.x (รวม 5.6) | ให้ถือว่าได้รับผลกระทบ | ไม่มี | ประกาศทางการไม่ได้ระบุว่า 5.x ได้รับผลกระทบหรือไม่ และ 5.6 หมดการดูแลตั้งแต่สิ้นปี 2018 มีช่องโหว่สะสมที่ไม่ได้แก้อยู่แล้ว ต้องย้ายรุ่น |
php -v แสดงอาจ ไม่เปลี่ยน แม้ได้รับแพตช์แล้ว เพราะ distro นำการแก้ไขไปใส่ในรุ่นเดิม (backport) ให้เช็คเลขรุ่นของแพ็กเกจแทน ตามขั้นตอนในหัวข้อถัดไป05วิธีเช็คว่าเซิร์ฟเวอร์เสี่ยงไหม
1. ดูรุ่น PHP
php -v
คำสั่งนี้แสดงรุ่นของ PHP แบบ CLI ซึ่งอาจต่างจากรุ่นที่เว็บใช้จริง ถ้าเซิร์ฟเวอร์มีหลายรุ่น ให้ดูจากหน้า phpinfo ของเว็บ หรือใน WordPress ไปที่ เครื่องมือ → สุขภาพเว็บไซต์ → ข้อมูล → เซิร์ฟเวอร์
2. เช็คเลขแพ็กเกจ (ถ้าใช้ PHP จาก distro)
dpkg -l | grep -E '^ii\s+php[0-9.]*-(common|fpm|cli)'
rpm -q php-common
dnf module list php # สายรุ่นที่เปิดใช้อยู่จะมีเครื่องหมาย [e]นำเลขที่ได้ไปเทียบกับประกาศความปลอดภัยของ distro นั้น เช่น Ubuntu Security Notices, Debian Security Tracker หรือบล็อกของ AlmaLinux
3. ดูว่าใช้ mod_php หรือไม่
apache2ctl -M 2>/dev/null | grep -E 'mpm_|php'
httpd -M 2>/dev/null | grep -E 'mpm_|php'
ถ้าผลลัพธ์มี php_module หรือ php7_module แปลว่าใช้ mod_php ซึ่งเสี่ยงที่สุด ควรอัปเดตเป็นลำดับแรก
4. ดูค่า session.upload_progress
php -i | grep session.upload_progress.enabled
ค่าจาก CLI อาจต่างจาก PHP-FPM ให้ดูไฟล์ตั้งค่าของ FPM ด้วย (เช่น /etc/php/8.3/fpm/php.ini หรือไฟล์ pool)
06วิธีอัปเดตแต่ละระบบ
Ubuntu / Debian
sudo apt update
sudo apt upgrade
# รีสตาร์ตตามที่ใช้ (เปลี่ยน 8.3 เป็นรุ่นของคุณ)
sudo systemctl restart php8.3-fpm
sudo systemctl restart apache2ถ้าติดตั้ง PHP จาก repository ภายนอก เช่น PPA ของผู้ดูแลอิสระ ให้เช็คว่า repository นั้นออกแพตช์แล้วหรือยัง ถ้ายังไม่มี ให้พิจารณาเปลี่ยนไปใช้แพ็กเกจของ distro
AlmaLinux / Rocky / RHEL
sudo dnf clean metadata && sudo dnf upgrade 'php*' sudo systemctl restart php-fpm # ถ้าใช้ mod_php (AlmaLinux 8) ให้รีสตาร์ต Apache แทน sudo systemctl restart httpd rpm -q php-common # ยืนยันเลขแพ็กเกจที่แก้แล้ว
AlmaLinux ออกแพ็กเกจแก้ไขให้ทุกสายรุ่นที่เคยออก รวมถึงสายที่หมดอายุแล้ว เช่น php:7.4 และ php:8.1 แต่ไม่รับประกันการแก้ไขครั้งต่อไปของสายที่หมดอายุ
cPanel, Plesk, aaPanel และแผงควบคุมอื่น
PHP ที่ติดตั้งผ่านแผงควบคุม (เช่น EasyApache ของ cPanel) ได้รับแพตช์จากผู้ผลิตแผงควบคุม ไม่ใช่จาก distro ให้อัปเดตผ่านแผงควบคุม แล้วเช็ครุ่นของทุก PHP ที่เปิดใช้งาน ถ้าเป็นโฮสติ้งแบบแชร์ ให้สอบถามผู้ให้บริการว่าอัปเดตแพตช์ PHP2Shell แล้วหรือยัง
Docker และ Kubernetes
# สร้าง image ใหม่โดยดึง base image ล่าสุด แล้วยืนยันรุ่น
docker build --pull -t my-app:patched .
docker run --rm my-app:patched php -vการรีสตาร์ต container เดิมไม่ได้อัปเดต PHP ต้องสร้าง image ใหม่จาก base image ที่แก้แล้ว และ deploy ใหม่ทุกตัว
PHP รุ่นเก่า (8.1 ลงไป)
| รุ่น | สถานะ |
|---|---|
| 7.4 / 8.0 / 8.1 | ทีม PHP แยกแพตช์ระดับซอร์สไว้ในสาขา PHP-7.4-CVE-2026-109618-109619 และสาขาเดียวกันของ 8.0, 8.1 บน GitHub ของ php-src (ข้อความ commit ระบุว่าเป็น "minimal mitigation for EOL version") แปลว่ากลุ่มนี้ ได้รับผลกระทบ ต้องคอมไพล์ PHP เองจากซอร์สที่ใส่แพตช์แล้ว หรือใช้แพ็กเกจจาก distro หรือผู้ให้บริการ LTS ซึ่งบางรายเสียเงิน |
| 5.6 และ 5.x | ไม่มีแพตช์ใด ๆ ประกาศทางการไม่ได้บอกว่า 5.x ได้รับผลกระทบหรือไม่ แต่ควร ถือว่าได้รับผลกระทบไว้ก่อน อีกทั้ง 5.6 หมดการดูแลตั้งแต่สิ้นปี 2018 และมีช่องโหว่สะสมที่ไม่ได้แก้อยู่แล้ว |
ถ้ายังย้ายรุ่นไม่ได้ทันที ควรทำครบชุดนี้
- 7.4–8.1: ใช้แพตช์จากสาขาด้านบน หรือแพ็กเกจที่ distro / ผู้ให้บริการ LTS แก้ให้ ข้อนี้สำคัญที่สุด
- 5.x: ไม่มีแพตช์ให้ใช้ ข้ามไปข้อ 3–5 และเร่งแผนย้ายรุ่น
- ตั้งมาตรการชั่วคราวทุกข้อ ในหัวข้อถัดไป ได้แก่
session.upload_progress.enabled=0,memory_limit=-1แบบบังคับ,post_max_sizeต่ำ และบล็อกคำขอ multipart ที่ frontend ถ้าเว็บไม่มีฟอร์มอัปโหลด แล้วรีสตาร์ตทุก worker - เปิด WAF เช่น Cloudflare ซึ่งมี rules สำหรับ PHP2Shell ทุกแพ็กเกจ
- จำกัดการเข้าถึง ถ้าเป็นระบบภายใน ให้เปิดเฉพาะ IP หรือ VPN ขององค์กร ถ้าทำไม่ได้ CISA และ NCSC ของอังกฤษแนะนำให้ ปิดระบบไว้ก่อน
- วางแผนย้ายไป PHP 8.3 ขึ้นไป ซึ่งมักต้องแก้โค้ดที่ใช้ฟังก์ชันที่ถูกตัดออก เช่น
mysql_*,each()และcreate_function()
07มาตรการชั่วคราว ระหว่างรออัปเดต
ทีม PHP ยืนยันว่า ไม่มีมาตรการใดกันได้ครบ การอัปเดตคือทางเดียวที่ถาวร มาตรการด้านล่างใช้เพื่อลดความเสี่ยงในช่วงสั้น ๆ เท่านั้น
| มาตรการ | ช่วยได้แค่ไหน | ข้อควรรู้ |
|---|---|---|
| Cloudflare WAF rules | บางส่วน | เปิดให้ทุกแพ็กเกจรวมแพ็กเกจฟรี กันวิธีโจมตีที่รู้จักแล้ว Cloudflare ระบุว่าเป็นการป้องกันชั่วคราว |
session.upload_progress.enabled=0 | บางส่วน | ปิดเส้นทางหลักของ CVE-2026-109619 แต่ไม่ครอบคลุมส่วนของ OPcache และ backtrace ต้องรีสตาร์ตทุก worker |
fatal_error_backtraces=0 (PHP 8.5) | บางส่วน | ปิดเฉพาะเส้นทาง fatal backtrace ที่ยืนยันแล้ว |
memory_limit=-1 + post_max_size ต่ำ | บางส่วน | สำหรับ CVE-2026-109618 ตั้งผ่าน php_admin_value ให้แอปแก้ทับไม่ได้ ใช้ post_max_size 8M ถ้าไม่รับอัปโหลด หรือ 32M ถ้ารับ และจำกัดหน่วยความจำด้วย container หรือ cgroup แทน |
| บล็อกคำขอ multipart ที่ frontend | บางส่วน | ประกาศของ PHP แนะนำสำหรับเว็บที่ไม่ใช้ฟอร์มอัปโหลด และให้จำกัดขนาดคำขอ จำนวน input จำนวน part และ header ต่อ part ที่ frontend ด้วย |
pm.max_requests=1 (PHP-FPM) | บางส่วน | ทำให้แต่ละ worker รับแค่คำขอเดียว ตัดเงื่อนไขการโจมตีที่ต้องใช้ worker ซ้ำ แต่เว็บจะช้าลงชัดเจน |
ซ่อน error (display_errors, error_reporting, @) | ไม่ช่วย | การซ่อนข้อความ error ไม่ได้ปิดเส้นทางโจมตี |
| ปิดระบบไว้ก่อน | ได้ผล | CISA และ NCSC แนะนำสำหรับระบบที่อัปเดตไม่ได้ทันที หรือยังใช้ PHP 8.1 และเก่ากว่า |
08เช็คว่าถูกเจาะไปแล้วหรือยัง
มีรายงานความพยายามโจมตีตั้งแต่ก่อนแพตช์ออก การอัปเดตจึงไม่พอ ต้องเช็คด้วยว่ามีใครเข้ามาก่อนแล้วหรือไม่ เพราะ แพตช์ไม่ได้ลบ backdoor ที่ถูกฝังไว้แล้ว สิ่งที่ควรดู:
- โปรเซสของ PHP เปิด shell หรือดาวน์โหลดเครื่องมือ เช่น php-fpm หรือ apache เป็นตัวเริ่ม
sh,bash,curl,wget(CISA ระบุสัญญาณนี้ไว้) - ไฟล์ PHP ใหม่ที่ไม่ได้สร้างเอง โดยเฉพาะในโฟลเดอร์อัปโหลด หรือไฟล์ที่ชื่อดูไม่เกี่ยวกับเว็บ
- cron job ของผู้ใช้ที่รันเว็บ (เช่น
www-data,apache,nginx) ที่ไม่ได้ตั้งไว้ - การเชื่อมต่อออกไปภายนอกที่ผิดปกติ หรือ CPU สูงผิดปกติ
# ไฟล์ .php ที่ถูกแก้ไขใน 7 วันที่ผ่านมา (เปลี่ยน /var/www เป็นโฟลเดอร์เว็บของคุณ) find /var/www -name '*.php' -mtime -7 -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort # cron ของผู้ใช้ที่รันเว็บ sudo crontab -u www-data -l # โปรเซสลูกของ php-fpm / apache ps -eo pid,ppid,user,cmd --forest | grep -E -A3 'php-fpm|apache2|httpd' | grep -E 'sh |bash|curl|wget'
.env หรือ wp-config.php) แล้วกู้จากไฟล์สำรองที่สะอาด หรือติดต่อผู้เชี่ยวชาญ09คำถามที่พบบ่อย
10แหล่งอ้างอิง
- CISA: Critical Vulnerabilities in PHP Require Immediate Patching (21 ต.ค. 2569)
- PHP Security Advisory GHSA-w8hw-w9fx-j79w (CVE-2026-109618): RCE via OOM corruption
- PHP Security Advisory GHSA-6wmf-4rv5-p3rp (CVE-2026-109619): RCE via stale global state
- php-src: สาขาแพตช์ชั่วคราวสำหรับรุ่นหมดอายุ PHP-7.4 / 8.0 / 8.1-CVE-2026-109618-109619
- PHP: เว็บไซต์ทางการและประกาศรุ่นใหม่
- JFrog Security Research: PHP2Shell — All You Need to Know
- BleepingComputer: PHP ships emergency patches for critical PHP2Shell flaws
- Help Net Security: PHP2Shell — Critical PHP vulnerabilities patched
- AlmaLinux: Patched PHP packages released
- Wikipedia: PHP2Shell
ข้อมูลในคู่มือนี้รวบรวมจากประกาศของ PHP, CISA, ผู้ผลิต distro และบริษัทความปลอดภัย ณ 22 ต.ค. 2569 เวลา 18:45 น. สถานการณ์อาจเปลี่ยนแปลง โปรดตรวจประกาศล่าสุดของผู้ผลิตซอฟต์แวร์ที่คุณใช้ก่อนดำเนินการ คู่มือนี้ไม่มีรายละเอียดวิธีโจมตี