Đã công bố các lỗ hổng CVE-2026-109618 và CVE-2026-109619, cho phép thực thi mã từ xa (RCE) mà không cần xác thực trong quá trình xử lý trạng thái yêu cầu và chấm dứt bất thường của engine lõi PHP. Vấn đề bắt nguồn từ lỗi hỏng bộ nhớ và sử dụng sau khi giải phóng (Use-After-Free) trong chính engine thực thi PHP, không phải từ các ứng dụng web như WordPress hay GnuBoard. Để khắc phục, cần ngay lập tức nâng cấp lên các phiên bản đã áp dụng bản vá bảo mật như PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 và khởi động lại các tiến trình worker.
Lỗ hổng engine PHP không thể ngăn chặn chỉ bằng cách cập nhật ứng dụng web
Vào ngày 21 tháng 10 năm 2026 (UTC), nhóm phát triển PHP đã công bố hai lỗ hổng bảo mật được đánh giá ở mức 9.2 theo CVSS v4.0. Kẻ tấn công có thể thực thi mã tùy ý trên máy chủ chỉ bằng cách gửi một HTTP request được chế tạo đặc biệt mà không cần đăng nhập.
Lỗi này hoạt động ở tầng lõi PHP, nơi phân tích cú pháp web request và dọn dẹp bộ nhớ. Vì vậy, ngay cả khi CMS hoặc plugin của website luôn được cập nhật, hệ thống vẫn có thể bị tấn công nếu chính runtime PHP là phiên bản cũ. Đặc biệt, trong môi trường Apache sử dụng cấu hình mặc định mod_php, đã xác nhận rằng chỉ một request cũng có thể dẫn đến thực thi mã trước khi mã ứng dụng web được chạy.
Nếu cuộc tấn công thành công, kẻ xâm nhập sẽ có được quyền của tài khoản hệ thống đang chạy tiến trình PHP. Điều này chưa lập tức đồng nghĩa với việc chiếm quyền root, nhưng kẻ tấn công có thể tạo webshell trong thư mục web root hoặc đọc thông tin kết nối cơ sở dữ liệu được ghi trong tệp cấu hình để làm rò rỉ hoặc sửa đổi dữ liệu nội bộ. Nếu nhiều website trên cùng một máy chủ dùng chung tài khoản chạy PHP-FPM, sự xâm phạm một website cũng có nguy cơ lan sang các website khác trên máy chủ.
Nguyên lý hỏng bộ nhớ và sử dụng sau khi giải phóng khi xảy ra chấm dứt bất thường
Cả hai lỗ hổng đều xảy ra do bộ nhớ không được dọn dẹp an toàn khi phát sinh tình huống bất thường trong quá trình xử lý request. Điều kiện phát sinh và nguyên lý hoạt động bên trong của mỗi lỗ hổng là khác nhau.
CVE-2026-109618 (hỏng bộ nhớ xảy ra trong quá trình xử lý vượt giới hạn bộ nhớ): Khi vượt quá giới hạn bộ nhớ cho phép (Out-Of-Memory) trong quá trình xử lý request, PHP gọi longjmp() để dừng thực thi ngay lập tức. Nếu quá trình bị dừng khi cấu trúc dữ liệu request bên trong chưa được khởi tạo hoàn chỉnh, trạng thái chưa hoàn thiện có thể còn tồn tại mà không được rollback. Sau đó, routine dọn dẹp request (cleanup) coi vùng bộ nhớ chưa được khởi tạo này là dữ liệu hợp lệ và truy cập vào đó, dẫn đến hỏng bộ nhớ và thực thi mã từ xa.
CVE-2026-109619 (Use-After-Free tham chiếu đến bộ nhớ đã được giải phóng của request trước): Một số trạng thái toàn cục hoặc trạng thái xử lý lỗi bên trong PHP tạm thời trỏ đến vùng bộ nhớ do một request duy nhất sở hữu. Khi request kết thúc bất thường do lỗi nghiêm trọng (fatal error) hoặc thiếu bộ nhớ, bộ nhớ thực tế có thể đã được giải phóng nhưng tham chiếu con trỏ nội bộ trỏ đến vùng đó vẫn còn do chưa được khởi tạo lại. Trong môi trường tái sử dụng worker như PHP-FPM hoặc mod_php, khi cùng worker tiếp nhận và xử lý HTTP request tiếp theo, worker sẽ đọc lại vùng bộ nhớ đã được giải phóng (Use-After-Free), từ đó tạo ra đường dẫn thực thi mã.
Thông báo bảo mật chính thức nêu các đường dẫn đã được xác nhận của CVE-2026-109619 gồm tính năng tiến trình tải lên phiên (session.upload_progress), cảnh báo cấu hình được xuất trước khi khởi tạo request và backtrace lỗi nghiêm trọng của PHP 8.5 (fatal_error_backtraces). Tuy nhiên, thông báo cũng cho biết vẫn còn các đường dẫn biến thể khác ngay cả khi chặn những đường dẫn này.
Tình trạng bản vá theo phiên bản PHP và phạm vi ảnh hưởng theo môi trường thực thi
PHP 8.2–8.5 thấp hơn phiên bản đã sửa đều bị ảnh hưởng; các phiên bản 8.1 trở xuống đã hết hỗ trợ không nằm trong phạm vi cập nhật chính thức của dự án PHP. Về phương thức thực thi, mọi cài đặt xử lý web request như PHP-FPM, mod_php, php-cgi, FrankenPHP và LiteSpeed đều thuộc phạm vi, trong đó thông báo chính thức đánh giá mod_php có rủi ro cao nhất. Red Hat phân loại PHP-FPM là có thể bị ảnh hưởng có điều kiện thông qua đường dẫn ở cấp ứng dụng.
| Dòng phiên bản PHP | Phạm vi phiên bản dễ bị tấn công | Phiên bản bản vá | Trạng thái hỗ trợ và ghi chú |
|---|---|---|---|
| PHP 8.5 | 8.5.0 ~ 8.5.11 | 8.5.12 | Đã phát hành bản cập nhật bảo mật chính thức |
| PHP 8.4 | 8.4.0 ~ 8.4.26 | 8.4.27 | Đã phát hành bản cập nhật bảo mật chính thức |
| PHP 8.3 | 8.3.0 ~ 8.3.35 | 8.3.36 | Đã phát hành bản cập nhật bảo mật chính thức |
| PHP 8.2 | 8.2.0 ~ 8.2.34 | 8.2.35 | Đã phát hành bản cập nhật bảo mật chính thức |
| PHP 8.1 trở xuống | Không thuộc phạm vi cập nhật chính thức | Không có bản phát hành chính thức | Đã hết hỗ trợ (EOL). 7.4, 8.0 và 8.1 chỉ được cung cấp bản backport tối thiểu để build từ mã nguồn; cần kiểm tra gói của nhà phân phối hoặc nhà cung cấp LTS |
Môi trường kiểm tra: Tính đến ngày 22 tháng 10 năm 2026, đã nâng cấp PHP 8.4.26 lên 8.4.27, khởi động lại worker PHP-FPM và xác minh việc áp dụng qua web request trong môi trường máy chủ Linux sử dụng kho Remi.
Quy trình cập nhật gói và áp dụng cấu hình giảm thiểu trên PHP-FPM
Nhóm phát triển PHP cho biết chỉ thay đổi cấu hình không thể chặn mọi đường dẫn tấn công; cập nhật lên phiên bản có bản vá là giải pháp duy nhất và hoàn chỉnh. Sau khi cập nhật, có thể đồng thời áp dụng biện pháp giảm thiểu bằng cách tắt các tính năng không cần thiết để thu hẹp bề mặt tấn công.
-
Cài đặt bản cập nhật gói PHP
Sử dụng trình quản lý gói của hệ điều hành để nâng cấp gói lên phiên bản đã sửa của dòng PHP đang sử dụng (với dòng 8.4 là 8.4.27). Sau khi cài đặt, trước tiên kiểm tra phiên bản CLI trong terminal.php -vKhi chạy lệnh, màn hình sẽ hiển thị số phiên bản đã cập nhật và ngày build, chẳng hạn như
PHP 8.4.27 (cli). Tuy nhiên, phiên bản CLI và trạng thái phiên bản của tiến trình PHP thực tế được web server liên kết có thể khác nhau, nên cần thực hiện bước tiếp theo. -
Điều chỉnh cấu hình PHP-FPM để giảm bề mặt tấn công (tùy chọn và giảm thiểu tạm thời)
Nếu khó áp dụng cập nhật ngay lập tức hoặc cần thêm một lớp bảo vệ, hãy sao lưuphp.inihoặc tệp cấu hình pool PHP-FPM (ví dụ:/etc/php-fpm.d/www.conf), sau đó điều chỉnh các mục dưới đây.php_admin_value[session.upload_progress.enabled] = Off php_admin_value[post_max_size] = 32M php_admin_value[upload_max_filesize] = 30MVô hiệu hóa
session.upload_progress.enabledcó thể chặn đường dẫn tấn công dựa trên session đã được xác nhận. Giảmpost_max_size(chẳng hạn8Mtrong môi trường không cần tải tệp lên hoặc32Mtrong môi trường cần tính năng này) sẽ khiến việc làm cạn kiệt bộ nhớ bằng request dung lượng lớn trở nên khó khăn hơn. Khi đó, cần đặtupload_max_filesizenhỏ hơn một chút so vớipost_max_sizeđể tính đến kích thước header bổ sung của multipart. Trong môi trường PHP 8.5, cũng áp dụngfatal_error_backtraces = 0. -
Kiểm tra cú pháp cấu hình PHP-FPM và khởi động lại tiến trình
Sau khi lưu cấu hình, kiểm tra lỗi cú pháp rồi khởi động lại dịch vụ PHP-FPM.php-fpm -t systemctl restart php-fpmNếu cấu hình không có vấn đề khi chạy
php-fpm -t, màn hình sẽ hiển thị thông báoNOTICE: configuration file ... test is successful. Cần khởi động lại worker để các worker phiên bản cũ đang thường trú trong bộ nhớ kết thúc và bản vá cùng cấu hình mới được áp dụng. -
Kiểm tra phiên bản thực tế được áp dụng thông qua web request
Gọi tab thông tin Site Health của WordPress hoặc trang chẩn đoán liên kết với web server để xác nhận worker PHP-FPM xử lý web request phản hồi bằng phiên bản đã vá như8.4.27. Nếu có tệp PHP chẩn đoán được tạo tạm thời để kiểm tra, hãy xóa ngay sau khi kiểm tra để tránh làm lộ thông tin hệ thống ra bên ngoài.
Cách xử lý khi cập nhật bị trì hoãn hoặc thay đổi cấu hình gây tác dụng phụ
Khi mirror của kho bên thứ ba (như Remi) cập nhật chậm khiến không thể tải gói
Ngay sau khi có bản vá bảo mật khẩn cấp, lưu lượng tăng cao hoặc quá trình đồng bộ chậm có thể khiến gói cập nhật chưa được hiển thị ngay hoặc tốc độ tải xuống chậm tại kho bên thứ ba (ví dụ: rpms.remirepo.net). Thông báo chính thức cho biết bản cập nhật có thể chưa được đưa lên kho do tình nguyện viên vận hành này trong ngày công bố, đồng thời khuyến nghị chuyển sang gói của bản phân phối hoặc build từ mã nguồn.
Trong trường hợp này, có thể chỉ định trực tiếp địa chỉ máy chủ mirror có tốc độ bình thường và đã hoàn tất đồng bộ trong cấu hình kho để tiến hành cập nhật. Dù thay đổi mirror thủ công, vẫn phải duy trì kiểm tra chữ ký GPG (gpgcheck=1) để ngăn gói bị giả mạo. Nếu không thể sử dụng mirror, hãy dùng gói backport chính thức của bản phân phối hệ điều hành hoặc trực tiếp biên dịch và áp dụng mã nguồn.
Khi lo ngại thiếu bộ nhớ (OOM) hoặc từ chối tải lên sau khi áp dụng cấu hình giảm thiểu
Thông báo chính thức đưa ra memory_limit = -1 (không giới hạn) như một biện pháp giảm thiểu CVE-2026-109618 khi chưa thể cập nhật ngay, đồng thời hướng dẫn đặt giới hạn bộ nhớ cho container hoặc cgroup. Tuy nhiên, nếu tắt giới hạn bộ nhớ trên máy chủ không có nhiều bộ nhớ vật lý, một request đơn lẻ có thể dùng hết bộ nhớ máy chủ, khiến OOM Killer của hệ điều hành buộc phải dừng các daemon quan trọng và gây sự cố. Đây chỉ là biện pháp tạm thời trước khi cập nhật; sau khi nâng cấp lên phiên bản đã vá, nên khôi phục giới hạn bộ nhớ ban đầu.
Ngoài ra, khi giảm post_max_size so với giá trị hiện tại (ví dụ: 64MB), trước tiên cần kiểm tra phương thức truyền tệp của website. Website cho phép tải trực tiếp tệp sao lưu hoặc plugin dung lượng lớn qua trang quản trị có thể bị chặn request. Ngược lại, nếu môi trường truyền tệp lớn bằng SFTP hoặc rsync, hoặc giới hạn của chính ứng dụng đã được đặt ở mức 30MB trở xuống, việc giảm giới hạn tải lên của PHP xuống 32MB sẽ không ảnh hưởng đến dịch vụ.
Nếu worker PHP-FPM thỉnh thoảng kết thúc bất thường sau khi nâng cấp phiên bản PHP, có thể xem xét cấu hình JIT (Just-In-Time) của OPcache. Tính năng JIT (ví dụ: opcache.jit=1255) không liên quan trực tiếp đến lỗ hổng bảo mật lần này, nhưng nếu từng gây vấn đề ổn định khi thay đổi phiên bản, có thể vô hiệu hóa bằng cách đặt opcache.jit=off trong tệp cấu hình để phòng ngừa xung đột.
Câu hỏi thường gặp
Cập nhật WordPress hoặc plugin lên phiên bản mới nhất có giải quyết được vấn đề không?
Không. Lỗ hổng này phát sinh trong engine lõi PHP, trước khi WordPress hoặc plugin bảo mật được thực thi. Có thể tạm thời chặn các mẫu tấn công đã biết thông qua tường lửa web (Cloudflare, AWS WAF, v.v.), nhưng để giải quyết tận gốc, cần cập nhật chính phiên bản PHP của máy chủ thông qua nhà cung cấp hosting hoặc quản trị viên máy chủ.
Tắt session.upload_progress.enabled có giúp an toàn mà không cần cập nhật không?
Không an toàn. Thông báo chính thức cho biết thiết lập này chỉ chặn đường dẫn session đã được xác nhận, không chặn được các đường dẫn biến thể khác. Ngoài ra, thiết lập phải được đặt ở nơi áp dụng trước khi phân tích request, chẳng hạn php.ini, pool FPM hoặc cấu hình máy chủ, chứ không phải ini_set() hay .user.ini của FPM; đồng thời phải khởi động lại mọi worker. Chỉ cài đặt bản vá mới là giải pháp hoàn chỉnh.
Đã hoàn tất áp dụng bản vá thì có thể vận hành ngay mà không cần kiểm tra thêm không?
Cập nhật chỉ ngăn các cuộc tấn công trong tương lai, không cho biết hệ thống có từng bị xâm phạm hay chưa. Sau khi cập nhật, nên kiểm tra riêng khả năng đã bị xâm phạm trước đó. Cần kiểm tra trong thư mục web có tệp PHP bất thường mới được tạo hoặc sửa gần đây (chẳng hạn webshell) hay không, đồng thời xem xét log truy cập web server và log lỗi PHP để tìm request POST dung lượng lớn bất thường hoặc các bản ghi lỗi bộ nhớ lặp lại.
Cần ứng phó thế nào trong môi trường container hoặc image đám mây?
Dù cập nhật gói trên máy chủ host, runtime PHP bên trong container cũng không tự động thay đổi. Vì vậy, cần dùng base image đã tích hợp phiên bản đã vá (8.5.12, 8.4.27, 8.3.36, 8.2.35) để build lại image container và triển khai lại.