หน้าแรก / บทความ / ความปลอดภัยไซเบอร์

PHP2Shell คืออะไร? ตรวจรุ่น PHP แล้วอัปเดตให้พ้นช่องโหว่ทีละขั้น

ช่องโหว่ PHP2Shell เปิดให้คนนอกรันโค้ดบนเซิร์ฟเวอร์ได้โดยไม่ต้องล็อกอิน ตรวจว่าเว็บใช้ PHP รุ่นไหน ต้องไปรุ่นอะไร แล้วอัปเดตทีละขั้นทั้งบนโฮสติ้ง cPanel, Linux, Docker และ Windows พร้อมวิธีพิสูจน์ว่าเว็บรันรุ่นใหม่จริง

วันที่ 21 ต.ค. 2026 ทีม PHP ออกแพตช์ฉุกเฉินปิดช่องโหว่ร้ายแรงสองตัวที่นักวิจัยเรียกรวมกันว่า PHP2Shell ช่องโหว่นี้เปิดทางให้คนนอกสั่งรันโค้ดบนเซิร์ฟเวอร์ได้โดยไม่ต้องล็อกอิน และกระทบเว็บ PHP ทุกแบบที่รับคำขอจากเบราว์เซอร์ ไม่ว่าจะเป็น WordPress, Drupal, Laravel หรือเว็บที่เขียน PHP เอง

ทางแก้มีทางเดียวและชัดเจน คืออัปเดต PHP เป็นรุ่นที่แก้แล้ว บทความนี้พาเช็กว่าเว็บของคุณใช้ PHP รุ่นไหน ต้องไปรุ่นอะไร แล้วอัปเดตทีละขั้นตามแบบที่ใช้อยู่ ทั้งโฮสติ้ง cPanel, เซิร์ฟเวอร์ Linux, Docker และ Windows ปิดท้ายด้วยวิธีพิสูจน์ว่าเว็บรันรุ่นใหม่จริง

จบบทความนี้คุณจะ:

  • อธิบายได้ว่า PHP2Shell คืออะไร และทำไมการปรับค่าตั้งอย่างเดียวไม่พอ
  • เช็กรุ่น PHP ที่เว็บใช้จริงได้ ไม่ใช่แค่รุ่นที่ขึ้นใน Terminal
  • รู้ว่าต้องอัปเดตไปรุ่นไหน และทำไมเลขรุ่นบน Ubuntu หรือ RHEL อาจไม่ตรงกับ php.net
  • อัปเดตได้ทั้งบนโฮสติ้ง เซิร์ฟเวอร์ Linux, Docker และ Windows
  • รีสตาร์ตบริการ ตรวจว่าสำเร็จ และแก้ปัญหาที่เจอบ่อยได้เอง

เกิดอะไรขึ้นกับ PHP

บทความนี้เน้นการป้องกันเท่านั้น เนื้อหาสรุปจากประกาศบน php.net และรายงานสาธารณะ ณ วันที่ 27 ต.ค. 2026 ไม่อธิบายวิธีโจมตี ข่าวนี้ยังเคลื่อนไหวอยู่ ก่อนลงมือให้เปิด php.net ดูว่ามีรุ่นใหม่กว่านี้หรือยัง และสำรองไฟล์เว็บกับฐานข้อมูลไว้ก่อนเสมอ

ประกาศบนหน้าแรกของ php.net วันที่ 21 ต.ค. 2026 บอกว่า PHP 8.5.12, 8.4.27, 8.3.36 และ 8.2.35 แก้ช่องโหว่ร้ายแรงสองตัว และขอให้ผู้ใช้ทุกคนอัปเดตทันที

  • CVE-2026-109618 เกิดตอน PHP รับมือกับกรณีหน่วยความจำไม่พอ (out of memory) ซึ่งอาจหยุดกลางคันขณะข้อมูลของคำขอยังเตรียมไม่เสร็จ แล้วขั้นเก็บกวาดไปใช้ข้อมูลที่ไม่สมบูรณ์นั้นต่อ
  • CVE-2026-109619 สถานะภายในของคำขอหนึ่งค้างอยู่หลังหน่วยความจำของมันถูกคืนไปแล้ว คำขอถัดไปที่ worker ตัวเดิมรับอาจหยิบสถานะที่ค้างนั้นไปใช้

ผลของทั้งสองตัวคือ RCE ที่ไม่ต้องล็อกอิน คนนอกส่งคำขอมาแล้วทำให้เซิร์ฟเวอร์รันโค้ดของเขาได้ ทีม PHP ระบุว่ากระทบทุกการติดตั้งที่รับคำขอเว็บ ทั้ง PHP-FPM, Apache กับ mod_php, php-cgi, FrankenPHP และ LiteSpeed โดยประเมินว่า mod_php เสี่ยงที่สุด เพราะมีการสาธิตแล้วว่าการโจมตีเริ่มได้ก่อนโค้ดของแอปจะได้รันเสียอีก

เรื่องข้อมูล
ชื่อ PHP2Shellชื่อที่นักวิจัยและสื่อใช้ ประกาศของ php.net อ้างด้วยเลข CVE
ใครเจอทีม Calif และ Wiz Research รายงานว่าใช้ AI ช่วยค้นหา
รุนแรงแค่ไหนรายงานส่วนใหญ่ระบุคะแนน CVSS v4 ที่ 9.2 จาก 10
รุ่นที่โดนนักวิจัยรายงานว่ามีมาตั้งแต่ PHP 5.4 ถึง 8.5
มีคนโจมตีจริงไหมAmazon, Cloudflare และ watchTowr รายงานว่าเห็นความพยายามโจมตีแล้ว
ผลกระทบที่เป็นข่าวเว็บรัฐหลายประเทศ, Wikimedia และ Internet Archive ปิดบางบริการชั่วคราว

อัปเดตคือทางเดียวที่ปลอดภัย php.net เขียนไว้ชัดว่ามีแค่การอัปเดตที่แก้ได้ครบ ค่าตั้งที่แนะนำระหว่างรอช่วยลดช่องทางบางทาง แต่ไม่ได้ทำให้เครื่องปลอดภัย ส่วนการอัปเดตปลั๊กอิน ธีม หรือโค้ดของแอปไม่ช่วยเลย เพราะช่องโหว่อยู่ในตัว PHP เอง

ศัพท์ที่ต้องรู้

คำความหมายแบบมือใหม่
ช่องโหว่ (vulnerability)จุดบกพร่องในโปรแกรมที่คนร้ายใช้ทำสิ่งที่ไม่ควรทำได้
CVEเลขประจำตัวของช่องโหว่ ใช้อ้างอิงให้ตรงกันทั่วโลก
CVSSคะแนนความรุนแรง 0 ถึง 10 ยิ่งสูงยิ่งต้องรีบ
RCERemote Code Execution คนนอกสั่งให้เซิร์ฟเวอร์ของเรารันโค้ดได้จากระยะไกล
แพตช์ (patch)รุ่นใหม่ที่แก้ช่องโหว่แล้ว
สายรุ่น (branch)กลุ่มรุ่นเดียวกัน เช่น 8.3.x อัปเดตภายในสายเดียวกันได้ง่ายและไม่ค่อยพัง
EOLEnd of Life สายรุ่นที่หมดอายุ โครงการไม่ออกแพตช์ให้แล้ว
PHP-FPMโปรแกรมที่รัน PHP อยู่เบื้องหลังเว็บเซิร์ฟเวอร์อย่าง Nginx
mod_phpPHP ที่ฝังอยู่ใน Apache โดยตรง
CLIPHP ที่รันในหน้า Terminal อาจเป็นคนละตัวกับที่เว็บใช้
Backportการนำแพตช์มาใส่รุ่นเก่าโดยไม่เปลี่ยนเลขรุ่นหลัก ผู้ทำ distro ทำบ่อย
WAFไฟร์วอลล์หน้าเว็บ กรองคำขอที่น่าสงสัยก่อนถึงเซิร์ฟเวอร์

เช็กว่าเว็บใช้ PHP รุ่นไหน

จุดที่พลาดกันบ่อยที่สุดคือพิมพ์ php -v ใน Terminal แล้วนึกว่าเว็บใช้รุ่นนั้น ทั้งที่เครื่องหนึ่งมี PHP ได้หลายตัว ตัวที่ตอบใน Terminal (CLI) กับตัวที่รันเว็บ (PHP-FPM หรือ mod_php) อาจเป็นคนละรุ่นกัน จึงต้องเช็กให้ครบทั้งสองฝั่ง

PHP ในเครื่องเดียวกันมีได้หลายตัว Terminal ใช้ PHP CLI ส่วนเว็บใช้ PHP-FPM ที่อาจเป็นคนละรุ่น
php -v บอกรุ่นของ CLI เท่านั้น ต้องเช็กตัวที่รันเว็บด้วย

วิธีที่ 1: ดูใน Terminal

ถ้าเข้าเซิร์ฟเวอร์ผ่าน SSH ได้ เริ่มจากคำสั่งนี้

Terminal (SSH เข้าเซิร์ฟเวอร์)
php -v
ผลลัพธ์ประมาณนี้
PHP 8.3.10 (cli) (built: ...)
Copyright (c) The PHP Group

คำว่า (cli) บอกว่านี่คือ PHP ตัวที่รันใน Terminal ถัดมาดูว่าเครื่องติดตั้งไว้กี่สายรุ่น บน Debian หรือ Ubuntu แต่ละโฟลเดอร์ใน /etc/php/ คือหนึ่งสาย

Terminal (Debian / Ubuntu)
ls /etc/php/
ผลลัพธ์ประมาณนี้
8.1  8.3

ถ้าเว็บใช้ Nginx ให้ดูว่าเว็บส่งงานไปให้ PHP-FPM ตัวไหน

Terminal (Nginx บน Debian / Ubuntu)
grep -R "fastcgi_pass" /etc/nginx/sites-enabled/
ผลลัพธ์ประมาณนี้
/etc/nginx/sites-enabled/default:    fastcgi_pass unix:/run/php/php8.3-fpm.sock;

php8.3-fpm แปลว่าเว็บนี้ใช้สาย 8.3 ต่อให้ php -v ขึ้นรุ่นอื่นก็ตาม

วิธีที่ 2: ให้เว็บบอกเอง

วิธีนี้ได้รุ่นที่เว็บใช้จริงแน่นอน สร้างไฟล์ชื่อ ver-check.php ในโฟลเดอร์เว็บ (เช่นโฟลเดอร์ public_html) ใส่บรรทัดเดียว

ver-check.php
<?php echo PHP_VERSION;

แล้วเปิด https://โดเมนของคุณ/ver-check.php ในเบราว์เซอร์ จะเห็นแค่เลขรุ่น เช่น 8.3.10 เห็นแล้วให้ ลบไฟล์ทิ้งทันที

อย่าทิ้งไฟล์เช็กรุ่นไว้บนเว็บ ทั้งไฟล์นี้และหน้า phpinfo() บอกข้อมูลเซิร์ฟเวอร์ให้คนนอกรู้ คนร้ายใช้ข้อมูลแบบนี้เลือกเป้าหมายที่ยังไม่อัปเดต ใช้เสร็จแล้วลบทันที

วิธีที่ 3: WordPress ไม่ต้องสร้างไฟล์

เข้าหลังบ้าน WordPress แล้วไปที่ เครื่องมือ (Tools) → สุขภาพเว็บไซต์ (Site Health) → แท็บข้อมูล (Info) → หัวข้อเซิร์ฟเวอร์ (Server) จะเห็นรุ่น PHP ที่เว็บใช้อยู่

ต้องอัปเดตไปรุ่นไหน

ดูสายรุ่นที่ใช้อยู่ แล้วอัปเดตให้ได้อย่างน้อยรุ่นในตารางนี้ (ตามหน้าแรก php.net และหน้า Supported Versions ณ 27 ต.ค. 2026)

ตอนนี้ใช้ต้องไปอย่างน้อยหมายเหตุ
8.5.x8.5.12สายล่าสุด ได้แพตช์ความปลอดภัยถึง 31 ธ.ค. 2029
8.4.x8.4.27ได้แพตช์ความปลอดภัยถึง 31 ธ.ค. 2028
8.3.x8.3.36ได้แพตช์ความปลอดภัยถึง 31 ธ.ค. 2027
8.2.x8.2.35หมดอายุ 31 ธ.ค. 2026 ควรวางแผนย้ายสายต่อ
8.1 หรือเก่ากว่าย้ายไปสายที่ยังได้แพตช์ เช่น 8.4โครงการ PHP ไม่ออกรุ่นแก้ให้แล้ว
สายรุ่น PHP 8.2 ถึง 8.5 กับรุ่นที่แก้ PHP2Shell แล้ว และวันที่แต่ละสายหมดแพตช์ความปลอดภัย
แต่ละสายได้แพตช์เต็ม 2 ปี และแพตช์ความปลอดภัยอีก 2 ปี

ตามหน้า Supported Versions แต่ละสายได้แพตช์เต็ม 2 ปี แล้วได้เฉพาะแพตช์ความปลอดภัยอีก 2 ปี สาย 8.2 จึงเหลือเวลาอีกราวสองเดือน ถ้าต้องลงแรงอยู่แล้ว การย้ายไป 8.4 รอบเดียวคุ้มกว่า

สำหรับสาย 8.1 ลงไป ทีม PHP ทำแพตช์แบบย่อของ 7.4, 8.0 และ 8.1 ไว้ใน GitHub สำหรับคนที่ build PHP เองหรือไม่มีผู้ให้บริการแบบ LTS ดูแล แต่ทางที่ยั่งยืนคือย้ายไปสายที่ยังได้แพตช์

ใช้ PHP จาก Ubuntu, Debian หรือ RHEL อ่านตรงนี้ก่อน ผู้ทำ distro มัก backport แพตช์มาใส่รุ่นเดิมโดยไม่เปลี่ยนเลขรุ่นหลัก เลขที่เห็นจึงอาจไม่ใช่ 8.3.36 แต่ปลอดภัยแล้ว ประกาศของ php.net บอกว่า distro ได้รับแพตช์ล่วงหน้า ให้ดูประกาศความปลอดภัยของ distro หรือเช็ก changelog ของแพ็กเกจว่ามีเลข CVE นี้หรือยัง (วิธีอยู่ในหัวข้อเซิร์ฟเวอร์ Linux)

อัปเดตบนโฮสติ้ง cPanel

ถ้าเช่าโฮสติ้งที่มีแผงควบคุม ไม่ต้องใช้ Terminal เลย ทำตามนี้

  1. สำรองก่อน ใช้เมนู Backup หรือตัวสำรองของโฮสติ้ง เก็บทั้งไฟล์เว็บและฐานข้อมูล
  2. เปิดหน้าเลือกรุ่น PHP ใน cPanel ชื่อเมนูมักเป็น MultiPHP Manager หรือ Select PHP Version ขึ้นกับโฮสติ้ง
  3. เลือกโดเมน แล้วเลือกรุ่นที่แก้แล้ว ถ้าในรายการบอกแค่ "8.3" ไม่บอกเลขย่อย ให้ถามโฮสติ้งว่าเป็นรุ่นที่แก้ CVE-2026-109618 และ CVE-2026-109619 แล้วหรือยัง
  4. กดบันทึกแล้วลองใช้เว็บ เปิดหน้าแรก หน้าล็อกอิน และส่งฟอร์มต่างๆ ว่ายังใช้งานได้
  5. เช็กเลขรุ่นอีกครั้ง ด้วยวิธีที่ 2 หรือ 3 จากหัวข้อก่อนหน้า ต้องเห็นเลขรุ่นใหม่

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

อัปเดตบนเซิร์ฟเวอร์ Linux

Ubuntu / Debian

ดึงรายการแพ็กเกจล่าสุด แล้วดูว่ามีแพ็กเกจ PHP ให้อัปเดตไหม

Terminal (SSH)
sudo apt update
sudo apt list --upgradable | grep php
ผลลัพธ์ประมาณนี้
php8.3-fpm/... [upgradable from: ...]

ถ้ามีรายการขึ้นมา สั่งอัปเดต ระบบจะถามยืนยัน พิมพ์ Y แล้วกด Enter

Terminal (SSH)
sudo apt upgrade

อยากรู้ว่าแพ็กเกจที่ได้มารวมแพตช์แล้วจริงไหม ค้นเลข CVE ใน changelog ของแพ็กเกจ (เปลี่ยน php8.3-fpm ให้ตรงกับของเครื่องคุณ)

Terminal (SSH)
apt changelog php8.3-fpm | grep -m1 CVE-2026-109618

ถ้ามีบรรทัดที่มีเลข CVE ขึ้นมา แปลว่าแพ็กเกจนี้มีแพตช์แล้ว ถ้าไม่มี ให้ดูประกาศความปลอดภัยของ distro อีกที เพราะบาง distro อาจออกแพตช์ช้ากว่า

ติดตั้ง PHP จากแหล่งเสริม? ถ้าติดตั้ง PHP จากแหล่งเสริม เช่น PPA ของผู้ดูแลรายอื่น แพตช์จะมาจากแหล่งนั้น ไม่ใช่จาก Ubuntu หรือ Debian ตรวจว่าแหล่งนั้นออกรุ่นแก้แล้ว แหล่งพวกนี้มักใช้เลขรุ่นตรงกับ php.net เช็กง่ายกว่า

RHEL / Rocky / AlmaLinux / Fedora

Terminal (SSH)
sudo dnf check-update "php*"
sudo dnf upgrade "php*"
ผลลัพธ์ประมาณนี้
Upgraded:
  php-cli-...  php-fpm-...
Complete!

เช็กแพตช์ใน changelog ของแพ็กเกจได้เหมือนกัน

Terminal (SSH)
rpm -q --changelog php-fpm | grep -m1 CVE-2026-109618

ยังใช้ 8.1 หรือเก่ากว่า

อัปเดตในสายเดิมไม่ได้แล้ว ต้องติดตั้งสายใหม่ (เช่น 8.4) แล้วย้ายเว็บไปใช้ ทดสอบกับสำเนาเว็บก่อนเสมอ เพราะโค้ด ปลั๊กอิน หรือ framework เก่าอาจใช้กับ PHP ใหม่ไม่ได้

ก่อนย้ายสายรุ่น อ่านหน้า Migration ในคู่มือทางการ (php.net/manual/en/appendices.php) ของทุกสายที่ข้าม เช่น จาก 8.1 ไป 8.4 ต้องอ่านของ 8.2, 8.3 และ 8.4 แล้วอัปเดตปลั๊กอินหรือ framework ให้รองรับรุ่นใหม่ก่อนสลับ

อัปเดตใน Docker

เปิด Dockerfile หาบรรทัด FROM php:... แล้วเปลี่ยนเป็นแท็กที่ระบุรุ่นที่แก้แล้วให้ชัด

Dockerfile
FROM php:8.4.27-fpm

build image ใหม่แล้วรันขึ้นมาแทนตัวเดิม

Terminal (โฟลเดอร์โปรเจกต์)
docker compose build --pull
docker compose up -d

เช็กรุ่นจากใน container

Terminal
docker compose exec app php -v
ผลลัพธ์ประมาณนี้
PHP 8.4.27 (cli) ...

แท็กกว้างต้องใช้ --pull ถ้าใช้แท็กกว้างอย่าง php:8.4-fpm ต้องใส่ --pull เพื่อดึง image ล่าสุด ไม่งั้น Docker จะใช้ตัวเก่าที่ค้างในเครื่อง ส่วน app คือชื่อ service ในตัวอย่าง ให้เปลี่ยนตามไฟล์ compose ของคุณ

อัปเดตบน Windows

ส่วนนี้สำหรับเครื่องพัฒนาที่ติดตั้ง PHP เอง

  1. ดาวน์โหลด จาก windows.php.net/download เลือกรุ่นที่แก้แล้วให้ตรงกับแบบที่ใช้อยู่ (x64 และ NTS หรือ TS)
  2. แทนที่โฟลเดอร์เดิม เก็บ php.ini เดิมไว้ แล้วคัดลอกกลับมาใส่โฟลเดอร์ใหม่
  3. เช็ก เปิด PowerShell หน้าต่างใหม่แล้วพิมพ์
PowerShell
php -v

ถ้าใช้ XAMPP, Laragon หรือ WAMP ให้อัปเดตผ่านตัวโปรแกรมนั้น หรือรอรุ่นใหม่ของมัน

ไฟล์ Windows ออกใหม่วันที่ 26 ต.ค. php.net ออกไฟล์ Windows รุ่น 8.5.12-1, 8.4.27-1, 8.3.36-1 และ 8.2.35-1 ที่ใส่ Brotli 1.2.1 เพื่อปิดช่องโหว่อีกตัว (CVE-2026-111497) ซึ่งเข้าถึงได้ผ่าน cURL เมื่อเปิดการคลายบีบอัดอัตโนมัติ ตัว PHP ยังเป็นรุ่นเดิม เลข -1 แค่บอกว่า build ใหม่ ให้ใช้ไฟล์ล่าสุดเสมอ

รีสตาร์ตแล้วตรวจว่าสำเร็จจริง

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

ใช้แบบไหนคำสั่งรีสตาร์ต
PHP-FPM บน Ubuntu / Debiansudo systemctl restart php8.3-fpm (เปลี่ยนเลขตามสายรุ่น)
PHP-FPM บน RHELsudo systemctl restart php-fpm
Apache กับ mod_phpsudo systemctl restart apache2 หรือ httpd
Dockerdocker compose up -d (ทำไปแล้วในหัวข้อ Docker)
โฮสติ้งระบบรีสตาร์ตให้เองหลังกดบันทึก

เช็กว่าบริการกลับมาทำงาน และเวลาเริ่มต้องเป็นหลังเวลาที่อัปเดต

Terminal (SSH)
systemctl status php8.3-fpm
ผลลัพธ์ประมาณนี้
● php8.3-fpm.service - The PHP 8.3 FastCGI Process Manager
     Active: active (running) since Tue 2026-10-27 10:15:02 +07; 1min ago

แล้วตรวจให้ครบทุกข้อ

ตรวจทำยังไงผ่านเมื่อ
CLIphp -vเห็นรุ่นที่แก้แล้ว
เว็บไฟล์ ver-check.php (แล้วลบ) หรือ Site Healthเห็นรุ่นเดียวกัน
บริการsystemctl statusactive (running) และเริ่มหลังอัปเดต
เว็บใช้งานได้เปิดหน้าแรก ล็อกอิน ส่งฟอร์ม อัปโหลดไฟล์ไม่มี error
ทุกเครื่องทำซ้ำกับทุกเซิร์ฟเวอร์และ stagingไม่มีเครื่องไหนค้างรุ่นเก่า

เช็กครบแล้ว จดไว้ จดเลขรุ่นและวันที่อัปเดตของแต่ละเครื่อง จะได้ตอบทีมหรือลูกค้าได้ทันทีว่าปลอดภัยแล้ว

ระหว่างรออัปเดต

ถ้าอัปเดตทันทีไม่ได้ ประกาศของ php.net มีค่าตั้งชั่วคราวที่ลดช่องทางโจมตีบางทาง แต่ย้ำว่า ไม่ได้ทำให้ปลอดภัย ทำแล้วยังต้องอัปเดตอยู่ดี

ค่าตั้งเป็นหมายเหตุ
memory_limit-1ตั้งให้แอปแก้ทับไม่ได้ และเช็กว่าไม่มีที่ไหนตั้งตัวเลขกลับมา
post_max_size8Mถ้าต้องอัปโหลดไฟล์ใช้ 32M และให้ upload_max_filesize ต่ำกว่าค่านี้
session.upload_progress.enabled0ตั้งใน php.ini หรือ pool ห้ามพึ่ง ini_set() หรือ .user.ini
fatal_error_backtraces0เฉพาะ PHP 8.5

บน PHP-FPM ใส่ค่าในไฟล์ pool ด้วย php_admin_value จะได้ไม่มีแอปไหนแก้ทับ (เปลี่ยนเลข 8.3 และชื่อไฟล์ให้ตรงกับเครื่องคุณ)

/etc/php/8.3/fpm/pool.d/www.conf (ต่อท้ายไฟล์)
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_value[upload_max_filesize] = 4M
php_admin_flag[session.upload_progress.enabled] = off

แล้วรีสตาร์ต worker ทุกตัวด้วยคำสั่งจากหัวข้อรีสตาร์ต ข้อควรรู้เพิ่มจากประกาศ:

  • memory_limit=-1 ทำให้โปรเซสใช้หน่วยความจำได้ไม่จำกัด ประกาศแนะนำให้คุมด้วยขีดจำกัดของ container หรือ cgroup แทน และ ห้าม ใช้ RLIMIT_AS หรือ RLIMIT_DATA (เช่น ulimit -v) มาแทน เพราะทำให้เกิดจุดที่เป็นช่องโหว่ได้
  • การซ่อนข้อความ error ด้วย display_errors, error_reporting หรือ @ ไม่ช่วยอะไร
  • ประกาศวันที่ 23 ต.ค. แนะนำให้ปิด session.upload_progress.enabled ต่อไป แม้อัปเดตแล้ว จนกว่าจะออกรุ่นแก้บั๊กรอบถัดไป เพื่อปิดอีกทางที่โอกาสเกิดต่ำ (CVE-2026-115560) แอปที่ไม่เคยเปลี่ยน session.serialize_handler ตอนรันเปิดไว้ได้ ถ้าไม่แน่ใจ ปิดไว้ก่อนปลอดภัยกว่า

นอกจากค่าใน php.ini ยังมีอีกสามอย่างที่ทำได้

  1. เปิด WAF ถ้ามี Cloudflare และผู้ให้บริการ CDN หลายรายออกกฎสำหรับช่องโหว่นี้แล้ว
  2. ปิดเว็บชั่วคราวถ้าจำเป็น หลายหน่วยงานเลือกทางนี้ระหว่างที่ยังอัปเดตไม่ได้
  3. กำหนดวันอัปเดตให้เร็วที่สุด ทุกข้อในหัวข้อนี้เป็นแค่การซื้อเวลา ไม่ใช่ทางแก้

แก้ปัญหาที่เจอบ่อย

อาการน่าจะเป็นเพราะทำยังไง
php -v ยังขึ้นรุ่นเก่ามีหลายรุ่นในเครื่อง หรือ PATH ชี้ตัวเก่าLinux: sudo update-alternatives --config php ส่วน Windows แก้ PATH
CLI ใหม่แต่เว็บยังเก่ายังไม่รีสตาร์ต PHP-FPM หรือ Apacheรีสตาร์ตตามหัวข้อรีสตาร์ต
apt ไม่เจอรุ่นใหม่distro ยังไม่ออก หรือแพตช์ไม่เปลี่ยนเลขรุ่นเช็ก changelog และประกาศความปลอดภัยของ distro
เว็บขาวหรือ error 500ปลั๊กอินหรือโค้ดใช้กับรุ่นใหม่ไม่ได้ดู error log แล้วอัปเดตปลั๊กอิน หรือย้อนกลับจาก backup
Docker ยังเป็นรุ่นเก่าไม่ได้ build ใหม่ หรือใช้ cachedocker compose build --pull --no-cache
โฮสติ้งไม่มีรุ่นใหม่ให้เลือกผู้ให้บริการยังไม่อัปเดตติดต่อซัพพอร์ต ระบุ CVE ทั้งสองตัว

ดู log ได้ที่นี่ (ค่าทั่วไป เครื่องคุณอาจต่างไป)

ระบบที่อยู่ log
Nginx/var/log/nginx/error.log
Apache (Ubuntu)/var/log/apache2/error.log
PHP-FPM (Ubuntu)/var/log/php8.3-fpm.log
Dockerdocker compose logs app

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

สรุป

  • PHP2Shell คือช่องโหว่ RCE สองตัวที่ไม่ต้องล็อกอิน กระทบ PHP ทุกแบบที่รับคำขอเว็บ และมีคนพยายามโจมตีจริงแล้ว
  • เช็กรุ่นทั้งฝั่ง CLI และฝั่งเว็บ เพราะอาจเป็นคนละตัวกัน
  • อัปเดตให้ถึงรุ่นที่แก้แล้วในสายของคุณ หรือใช้แพ็กเกจ distro ที่มีเลข CVE ใน changelog
  • รีสตาร์ตทุกครั้งหลังอัปเดต แล้วตรวจให้ครบทุกเครื่อง
  • ค่าตั้งระหว่างรอเป็นแค่การซื้อเวลา อัปเดตคือทางเดียวที่ปลอดภัย
อยากทำทำแบบนี้
รู้รุ่น CLIphp -v
รู้รุ่นที่เว็บใช้ไฟล์ echo PHP_VERSION (แล้วลบ) หรือ WordPress Site Health
รุ่นที่ปลอดภัย8.5.12, 8.4.27, 8.3.36, 8.2.35 ขึ้นไป หรือแพ็กเกจ distro ที่ backport แล้ว
ใช้ 8.1 ลงไปย้ายไปสายที่ยังได้แพตช์
หลังอัปเดตรีสตาร์ต PHP-FPM หรือ Apache แล้วเช็กรุ่นอีกครั้ง
ระหว่างรอค่าใน php.ini ตามประกาศ และ WAF (ไม่ใช่ทางแก้)

ข่าวนี้ยังเคลื่อนไหวอยู่ ก่อนลงมือให้เปิดแหล่งข้อมูลเหล่านี้ดูเองอีกครั้ง

พร้อมแล้วก็ไปทำ Quiz ท้ายบทด้านล่างเพื่อรับ XP ได้เลยครับ

Quiz ท้ายบท

5 ข้อ · ข้อละ 10 XP

ทดสอบความเข้าใจเรื่อง อัปเดต PHP ตอบถูกข้อละ 10 XP

  • 5 ข้อ
  • ไม่จับเวลา
  • เฉลยทันทีทุกข้อ