
วันที่ 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 ยิ่งสูงยิ่งต้องรีบ |
| RCE | Remote Code Execution คนนอกสั่งให้เซิร์ฟเวอร์ของเรารันโค้ดได้จากระยะไกล |
| แพตช์ (patch) | รุ่นใหม่ที่แก้ช่องโหว่แล้ว |
| สายรุ่น (branch) | กลุ่มรุ่นเดียวกัน เช่น 8.3.x อัปเดตภายในสายเดียวกันได้ง่ายและไม่ค่อยพัง |
| EOL | End of Life สายรุ่นที่หมดอายุ โครงการไม่ออกแพตช์ให้แล้ว |
| PHP-FPM | โปรแกรมที่รัน PHP อยู่เบื้องหลังเว็บเซิร์ฟเวอร์อย่าง Nginx |
| mod_php | PHP ที่ฝังอยู่ใน Apache โดยตรง |
| CLI | PHP ที่รันในหน้า Terminal อาจเป็นคนละตัวกับที่เว็บใช้ |
| Backport | การนำแพตช์มาใส่รุ่นเก่าโดยไม่เปลี่ยนเลขรุ่นหลัก ผู้ทำ distro ทำบ่อย |
| WAF | ไฟร์วอลล์หน้าเว็บ กรองคำขอที่น่าสงสัยก่อนถึงเซิร์ฟเวอร์ |
เช็กว่าเว็บใช้ PHP รุ่นไหน
จุดที่พลาดกันบ่อยที่สุดคือพิมพ์ php -v ใน Terminal แล้วนึกว่าเว็บใช้รุ่นนั้น ทั้งที่เครื่องหนึ่งมี PHP ได้หลายตัว ตัวที่ตอบใน Terminal (CLI) กับตัวที่รันเว็บ (PHP-FPM หรือ mod_php) อาจเป็นคนละรุ่นกัน จึงต้องเช็กให้ครบทั้งสองฝั่ง

วิธีที่ 1: ดูใน Terminal
ถ้าเข้าเซิร์ฟเวอร์ผ่าน SSH ได้ เริ่มจากคำสั่งนี้
php -vPHP 8.3.10 (cli) (built: ...)
Copyright (c) The PHP Groupคำว่า (cli) บอกว่านี่คือ PHP ตัวที่รันใน Terminal ถัดมาดูว่าเครื่องติดตั้งไว้กี่สายรุ่น บน Debian หรือ Ubuntu แต่ละโฟลเดอร์ใน /etc/php/ คือหนึ่งสาย
ls /etc/php/8.1 8.3ถ้าเว็บใช้ Nginx ให้ดูว่าเว็บส่งงานไปให้ PHP-FPM ตัวไหน
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) ใส่บรรทัดเดียว
<?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.x | 8.5.12 | สายล่าสุด ได้แพตช์ความปลอดภัยถึง 31 ธ.ค. 2029 |
| 8.4.x | 8.4.27 | ได้แพตช์ความปลอดภัยถึง 31 ธ.ค. 2028 |
| 8.3.x | 8.3.36 | ได้แพตช์ความปลอดภัยถึง 31 ธ.ค. 2027 |
| 8.2.x | 8.2.35 | หมดอายุ 31 ธ.ค. 2026 ควรวางแผนย้ายสายต่อ |
| 8.1 หรือเก่ากว่า | ย้ายไปสายที่ยังได้แพตช์ เช่น 8.4 | โครงการ PHP ไม่ออกรุ่นแก้ให้แล้ว |

ตามหน้า 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 เลย ทำตามนี้
- สำรองก่อน ใช้เมนู Backup หรือตัวสำรองของโฮสติ้ง เก็บทั้งไฟล์เว็บและฐานข้อมูล
- เปิดหน้าเลือกรุ่น PHP ใน cPanel ชื่อเมนูมักเป็น MultiPHP Manager หรือ Select PHP Version ขึ้นกับโฮสติ้ง
- เลือกโดเมน แล้วเลือกรุ่นที่แก้แล้ว ถ้าในรายการบอกแค่ "8.3" ไม่บอกเลขย่อย ให้ถามโฮสติ้งว่าเป็นรุ่นที่แก้ CVE-2026-109618 และ CVE-2026-109619 แล้วหรือยัง
- กดบันทึกแล้วลองใช้เว็บ เปิดหน้าแรก หน้าล็อกอิน และส่งฟอร์มต่างๆ ว่ายังใช้งานได้
- เช็กเลขรุ่นอีกครั้ง ด้วยวิธีที่ 2 หรือ 3 จากหัวข้อก่อนหน้า ต้องเห็นเลขรุ่นใหม่
โฮสติ้งส่วนใหญ่อัปเดตให้เอง แต่อย่าเดา ข่าวนี้ใหญ่มาก ผู้ให้บริการหลายรายประกาศมาตรการแล้ว แต่ต้องเช็กเลขรุ่นด้วยตัวเองเสมอ ถ้ายังไม่มีรุ่นใหม่ให้เลือก ส่งข้อความหาฝ่ายซัพพอร์ต ระบุเลข CVE ทั้งสองตัว และถามว่าจะอัปเดตเมื่อไร ระหว่างนั้นดูหัวข้อระหว่างรออัปเดต
อัปเดตบนเซิร์ฟเวอร์ Linux
Ubuntu / Debian
ดึงรายการแพ็กเกจล่าสุด แล้วดูว่ามีแพ็กเกจ PHP ให้อัปเดตไหม
sudo apt update
sudo apt list --upgradable | grep phpphp8.3-fpm/... [upgradable from: ...]ถ้ามีรายการขึ้นมา สั่งอัปเดต ระบบจะถามยืนยัน พิมพ์ Y แล้วกด Enter
sudo apt upgradeอยากรู้ว่าแพ็กเกจที่ได้มารวมแพตช์แล้วจริงไหม ค้นเลข CVE ใน changelog ของแพ็กเกจ (เปลี่ยน php8.3-fpm ให้ตรงกับของเครื่องคุณ)
apt changelog php8.3-fpm | grep -m1 CVE-2026-109618ถ้ามีบรรทัดที่มีเลข CVE ขึ้นมา แปลว่าแพ็กเกจนี้มีแพตช์แล้ว ถ้าไม่มี ให้ดูประกาศความปลอดภัยของ distro อีกที เพราะบาง distro อาจออกแพตช์ช้ากว่า
ติดตั้ง PHP จากแหล่งเสริม? ถ้าติดตั้ง PHP จากแหล่งเสริม เช่น PPA ของผู้ดูแลรายอื่น แพตช์จะมาจากแหล่งนั้น ไม่ใช่จาก Ubuntu หรือ Debian ตรวจว่าแหล่งนั้นออกรุ่นแก้แล้ว แหล่งพวกนี้มักใช้เลขรุ่นตรงกับ php.net เช็กง่ายกว่า
RHEL / Rocky / AlmaLinux / Fedora
sudo dnf check-update "php*"
sudo dnf upgrade "php*"Upgraded:
php-cli-... php-fpm-...
Complete!เช็กแพตช์ใน changelog ของแพ็กเกจได้เหมือนกัน
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:... แล้วเปลี่ยนเป็นแท็กที่ระบุรุ่นที่แก้แล้วให้ชัด
FROM php:8.4.27-fpmbuild image ใหม่แล้วรันขึ้นมาแทนตัวเดิม
docker compose build --pull
docker compose up -dเช็กรุ่นจากใน container
docker compose exec app php -vPHP 8.4.27 (cli) ...แท็กกว้างต้องใช้ --pull ถ้าใช้แท็กกว้างอย่าง
php:8.4-fpmต้องใส่--pullเพื่อดึง image ล่าสุด ไม่งั้น Docker จะใช้ตัวเก่าที่ค้างในเครื่อง ส่วนappคือชื่อ service ในตัวอย่าง ให้เปลี่ยนตามไฟล์ compose ของคุณ
อัปเดตบน Windows
ส่วนนี้สำหรับเครื่องพัฒนาที่ติดตั้ง PHP เอง
- ดาวน์โหลด จาก windows.php.net/download เลือกรุ่นที่แก้แล้วให้ตรงกับแบบที่ใช้อยู่ (x64 และ NTS หรือ TS)
- แทนที่โฟลเดอร์เดิม เก็บ
php.iniเดิมไว้ แล้วคัดลอกกลับมาใส่โฟลเดอร์ใหม่ - เช็ก เปิด 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 / Debian | sudo systemctl restart php8.3-fpm (เปลี่ยนเลขตามสายรุ่น) |
| PHP-FPM บน RHEL | sudo systemctl restart php-fpm |
| Apache กับ mod_php | sudo systemctl restart apache2 หรือ httpd |
| Docker | docker compose up -d (ทำไปแล้วในหัวข้อ Docker) |
| โฮสติ้ง | ระบบรีสตาร์ตให้เองหลังกดบันทึก |
เช็กว่าบริการกลับมาทำงาน และเวลาเริ่มต้องเป็นหลังเวลาที่อัปเดต
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แล้วตรวจให้ครบทุกข้อ
| ตรวจ | ทำยังไง | ผ่านเมื่อ |
|---|---|---|
| CLI | php -v | เห็นรุ่นที่แก้แล้ว |
| เว็บ | ไฟล์ ver-check.php (แล้วลบ) หรือ Site Health | เห็นรุ่นเดียวกัน |
| บริการ | systemctl status | active (running) และเริ่มหลังอัปเดต |
| เว็บใช้งานได้ | เปิดหน้าแรก ล็อกอิน ส่งฟอร์ม อัปโหลดไฟล์ | ไม่มี error |
| ทุกเครื่อง | ทำซ้ำกับทุกเซิร์ฟเวอร์และ staging | ไม่มีเครื่องไหนค้างรุ่นเก่า |
เช็กครบแล้ว จดไว้ จดเลขรุ่นและวันที่อัปเดตของแต่ละเครื่อง จะได้ตอบทีมหรือลูกค้าได้ทันทีว่าปลอดภัยแล้ว
ระหว่างรออัปเดต
ถ้าอัปเดตทันทีไม่ได้ ประกาศของ php.net มีค่าตั้งชั่วคราวที่ลดช่องทางโจมตีบางทาง แต่ย้ำว่า ไม่ได้ทำให้ปลอดภัย ทำแล้วยังต้องอัปเดตอยู่ดี
| ค่า | ตั้งเป็น | หมายเหตุ |
|---|---|---|
memory_limit | -1 | ตั้งให้แอปแก้ทับไม่ได้ และเช็กว่าไม่มีที่ไหนตั้งตัวเลขกลับมา |
post_max_size | 8M | ถ้าต้องอัปโหลดไฟล์ใช้ 32M และให้ upload_max_filesize ต่ำกว่าค่านี้ |
session.upload_progress.enabled | 0 | ตั้งใน php.ini หรือ pool ห้ามพึ่ง ini_set() หรือ .user.ini |
fatal_error_backtraces | 0 | เฉพาะ PHP 8.5 |
บน PHP-FPM ใส่ค่าในไฟล์ pool ด้วย php_admin_value จะได้ไม่มีแอปไหนแก้ทับ (เปลี่ยนเลข 8.3 และชื่อไฟล์ให้ตรงกับเครื่องคุณ)
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 ยังมีอีกสามอย่างที่ทำได้
- เปิด WAF ถ้ามี Cloudflare และผู้ให้บริการ CDN หลายรายออกกฎสำหรับช่องโหว่นี้แล้ว
- ปิดเว็บชั่วคราวถ้าจำเป็น หลายหน่วยงานเลือกทางนี้ระหว่างที่ยังอัปเดตไม่ได้
- กำหนดวันอัปเดตให้เร็วที่สุด ทุกข้อในหัวข้อนี้เป็นแค่การซื้อเวลา ไม่ใช่ทางแก้
แก้ปัญหาที่เจอบ่อย
| อาการ | น่าจะเป็นเพราะ | ทำยังไง |
|---|---|---|
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 ใหม่ หรือใช้ cache | docker 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 |
| Docker | docker compose logs app |
ย้อนกลับได้เสมอ นี่คือเหตุผลที่ต้องสำรองก่อนเริ่ม ถ้าเว็บพังหลังอัปเดต ย้อนกลับจาก backup ให้เว็บกลับมาก่อน แล้วค่อยแก้ปลั๊กอินบนสำเนาเว็บ จากนั้นอัปเดตใหม่ให้เร็วที่สุด เพราะรุ่นเก่ายังมีช่องโหว่อยู่
สรุป
- PHP2Shell คือช่องโหว่ RCE สองตัวที่ไม่ต้องล็อกอิน กระทบ PHP ทุกแบบที่รับคำขอเว็บ และมีคนพยายามโจมตีจริงแล้ว
- เช็กรุ่นทั้งฝั่ง CLI และฝั่งเว็บ เพราะอาจเป็นคนละตัวกัน
- อัปเดตให้ถึงรุ่นที่แก้แล้วในสายของคุณ หรือใช้แพ็กเกจ distro ที่มีเลข CVE ใน changelog
- รีสตาร์ตทุกครั้งหลังอัปเดต แล้วตรวจให้ครบทุกเครื่อง
- ค่าตั้งระหว่างรอเป็นแค่การซื้อเวลา อัปเดตคือทางเดียวที่ปลอดภัย
| อยากทำ | ทำแบบนี้ |
|---|---|
| รู้รุ่น CLI | php -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 (ไม่ใช่ทางแก้) |
ข่าวนี้ยังเคลื่อนไหวอยู่ ก่อนลงมือให้เปิดแหล่งข้อมูลเหล่านี้ดูเองอีกครั้ง
- ประกาศและรุ่นล่าสุด: php.net
- สายรุ่นที่ยังได้แพตช์: php.net/supported-versions.php
- ไฟล์สำหรับ Windows: windows.php.net/download
- Docker image ทางการ: hub.docker.com/_/php
พร้อมแล้วก็ไปทำ Quiz ท้ายบทด้านล่างเพื่อรับ XP ได้เลยครับ