PHP2Shell là gì?
PHP2Shell là tên gọi của hai lỗ hổng thực thi mã từ xa (RCE) trong lõi PHP, được công bố cùng bản phát hành khẩn cấp ngày 21/10/2026. Cả hai đều có điểm CVSS v4.0 9.2. Vì lỗi nằm trong engine PHP, mọi framework và CMS chạy trên nó — WordPress, Laravel, EC-CUBE, Drupal, code tự viết — đều bị ảnh hưởng.
- CVE-2026-109618 — tình trạng hết bộ nhớ (OOM) khi PHP đang khởi tạo request (phân tích multipart) để lại dữ liệu nội bộ dở dang; bước dọn dẹp sau đó lại tin vào dữ liệu này. PHP xác nhận RCE không cần xác thực trên Apache
mod_php, xảy ra trước khi code của ứng dụng kịp chạy. - CVE-2026-109619 — trạng thái nội bộ của request tồn tại lâu hơn vùng nhớ nó trỏ tới, nên request kế tiếp trên cùng worker xử lý dữ liệu cũ. Các đường khai thác đã xác nhận gồm session upload progress sau lỗi fatal và backtrace lỗi fatal của PHP 8.5.
Chi tiết kỹ thuật bị lộ một ngày trước khi phát hành bản vá và việc khai thác đã được ghi nhận chỉ vài giờ sau đó. Cơ quan An ninh mạng Quốc gia Nhật Bản đã kêu gọi các đơn vị vận hành cập nhật ngay lập tức.
Phiên bản bị ảnh hưởng
| Nhánh | Bị ảnh hưởng | Đã vá ở |
|---|---|---|
8.5 | < 8.5.12 | 8.5.12 |
8.4 | < 8.4.27 | 8.4.27 |
8.3 | < 8.3.36 | 8.3.36 |
8.2 | < 8.2.35 | 8.2.35 |
8.1 · 8.0 · 7.4 | Mọi phiên bản | Không có bản chính thức (chỉ có backport của nhà cung cấp) |
7.3 · 5.x | Mọi phiên bản | — |
Mọi SAPI phục vụ web đều nằm trong phạm vi: PHP-FPM, Apache mod_php (rủi ro cao nhất), php-cgi, LiteSpeed và FrankenPHP.
Công cụ kiểm tra hoạt động thế nào
Watchpost gửi vài request GET thông thường — trang bạn nhập (mặc định là trang chủ), các bước chuyển hướng và index.php — rồi đọc phiên bản PHP mà máy chủ vốn đã công bố trong header X-Powered-By hoặc Server, sau đó so với bản vá của nhánh tương ứng. Không gửi bất kỳ payload khai thác nào.
- Ẩn phiên bản ≠ an toàn. Phần lớn máy chủ đặt
expose_php = Offhoặc đứng sau CDN xoá header. Khi đó chúng tôi tìm thêm: trangphpinfo()bị bỏ quên (/info.php,/phpinfo.php…) cho biết chính xác phiên bản, và bannerServernhưApache/2.4.41 (Ubuntu)cho biết hệ điều hành cùng bản PHP đi kèm. Nếu có PHP mà không xác nhận được đã vá, chúng tôi cảnh báo bạn coi website là có lỗ hổng cho tới khi kiểm tra trên máy chủ. - Bản đóng gói của distro (ví dụ
8.3.6-0ubuntu0.24.04.13) có bản vá mà không đổi số phiên bản gốc. Chúng tôi nhận diện được các bản vá Ubuntu đã biết; với distro khác, hãy xem thông báo của nhà cung cấp. - Kết quả được lưu đệm 10 phút cho mỗi tên miền, nên sau khi vá bạn có thể kiểm tra lại sau ít phút.
Tự kiểm tra
# 1. What the site announces to the world
curl -sI https://your-site.example | grep -iE '^(x-powered-by|server):'
# 2. On the server (CLI and the web SAPI can differ!)
php -v
php-fpm8.3 -v # or: php-fpm -v / httpd -M | grep php
# 3. Distribution package (Ubuntu / Debian / RHEL)
dpkg -l | grep -E '^ii +php[0-9.]*-(common|fpm|cli)'
rpm -q php php-fpmPhiên bản cần quan tâm là phiên bản mà web server đang chạy (FPM hoặc mod_php), không nhất thiết trùng với php -v trên dòng lệnh.
Cách khắc phục
- Cập nhật PHP lên 8.5.12, 8.4.27, 8.3.36 hoặc 8.2.35 — hoặc gói đã vá của distro (Ubuntu 24.04:
8.3.6-0ubuntu0.24.04.13, Ubuntu 22.04:8.1.2-1ubuntu2.28, Debian 13:8.4.27-1~deb13u1). - Khởi động lại mọi worker PHP. Worker FPM cũ vẫn chạy binary có lỗ hổng cho tới khi được khởi động lại:
sudo systemctl restart php8.3-fpm # every FPM pool / version you run sudo systemctl restart apache2 # mod_php: restart Apache itself (httpd on RHEL) - Shared hosting: hỏi nhà cung cấp xem PHP của họ (cPanel EA-PHP, CloudLinux alt-php…) đã có backport chưa, hoặc chuyển site sang phiên bản đã vá trong control panel.
- Đang ở 8.1 trở xuống: lên kế hoạch nâng lên 8.2+; backport của nhà cung cấp chỉ giúp câu thêm thời gian.
- Sau khi vá, đặt
expose_php = Offđể ngừng công bố phiên bản.
Nếu chưa thể vá ngay tối nay
PHP khẳng định không có thay đổi cấu hình nào giảm thiểu hoàn toàn các lỗ hổng này. Trong lúc chờ cập nhật:
- Giới hạn truy cập Internet vào máy chủ (VPN, danh sách IP cho phép, trang bảo trì ở CDN). Ưu tiên máy chủ dùng Apache
mod_php. - Đặt
session.upload_progress.enabled = 0, và với PHP 8.5 đặtfatal_error_backtraces = 0. Các thiết lập này chỉ chặn một số đường khai thác đã biết. - Theo dõi file PHP mới xuất hiện, tiến trình lạ do user web sinh ra và kết nối ra ngoài từ máy chủ.
Nguồn tham khảo
Công cụ này chỉ trả lời một câu hỏi. Lượt quét miễn phí kiểm tra thêm hơn 50 vấn đề ai cũng nhìn thấy được — file lộ, khoá bị lộ, TLS, header, DNS — và khi xác minh tên miền, bạn mở thêm hơn 200 bước kiểm tra sâu.
Quét toàn bộ