NỘI DUNG
WordPress vừa phát hành bản vá bảo mật cho CVE-2026-87902, một lỗi nghiêm trọng trong cơ chế chọn template của WordPress Core. Lỗi này cho phép attacker chưa đăng nhập ép WordPress include một file PHP cục bộ ngoài thư mục theme trong một số điều kiện nhất định. Khi môi trường máy chủ thỏa thêm điều kiện, lỗi có thể dẫn đến thực thi mã từ xa (RCE).

Bài viết này được biên soạn lại theo hướng thực hành quản trị WordPress, dựa trên thông tin từ The Hacker News, WordPress.org, GitHub Security Advisory và phân tích kỹ thuật của Patchstack.
Tóm tắt nhanh
| CVE | CVE-2026-87902 / GHSA-7hp8-65ch-5whp |
| Mức độ | Critical, CVSS 9.2 |
| Loại lỗi | Unauthenticated path traversal trong page-template resolution, dẫn đến LFI và RCE có điều kiện |
| Phiên bản ảnh hưởng | WordPress Core 4.7.0 đến 7.1.1 |
| Bản vá chính | WordPress 7.1.2 |
| Điều kiện RCE | Theme có thư mục top-level bắt đầu bằng page- và server có file PHP phù hợp để include, ví dụ chuỗi PEAR pearcmd.php khi register_argc_argv bật |
| Trạng thái khai thác | Theo The Hacker News, tại thời điểm bài gốc chưa có báo cáo bị khai thác thực tế và chưa có trong CISA KEV |
CVE-2026-87902 nguy hiểm ở điểm nào?
Lỗi nằm trong quá trình WordPress xác định template file cho một page. Khi WordPress xử lý request, hàm get_page_template() trong wp-includes/template.php sẽ tạo danh sách file template có thể dùng. Một nhánh xử lý lấy dữ liệu từ biến pagename trong request, sau đó ghép thành tên file dạng page-{giá_trị}.php.
Ở các phiên bản bị ảnh hưởng, một giá trị kế bên đã được kiểm tra bằng validate_file(), nhưng nhánh tạo template từ pagename lại thiếu bước kiểm tra này. Vì vậy attacker có thể lợi dụng path traversal trong một số điều kiện để khiến WordPress include file PHP nằm ngoài thư mục theme.
// wp-includes/template.php, WordPress <= 7.1.1
if ( $template && 0 === validate_file( $template ) ) {
$templates[] = $template;
}
if ( $pagename ) {
$pagename_decoded = urldecode( $pagename );
if ( $pagename_decoded !== $pagename ) {
$templates[] = "page-{$pagename_decoded}.php";
}
$templates[] = "page-{$pagename}.php";
}Điểm cần hiểu đúng: lỗi này không đồng nghĩa mọi website WordPress đều bị RCE ngay lập tức. LFI là rủi ro chính; RCE xảy ra khi server có thêm điều kiện phù hợp. Dù vậy, vì lỗi không cần tài khoản đăng nhập, ảnh hưởng nhiều nhánh WordPress và có đường nâng cấp lên RCE trên một số môi trường phổ biến, quản trị viên nên xử lý như lỗi critical.

Điều kiện nào làm website rủi ro cao hơn?
- WordPress Core đang ở phiên bản từ 4.7.0 đến 7.1.1.
- Theme đang active hoặc parent theme có thư mục cấp cao nhất bắt đầu bằng
page-, ví dụpage-templates. GitHub advisory nêu các theme như Twenty Twelve, Twenty Fourteen và một số theme bên thứ ba như Neve, Hestia, Sydney có thể có dạng thư mục này. - Server có file PHP cục bộ readable bởi web server và file đó có thể tạo tác động khi bị include.
- PHP bật
register_argc_argv, điều kiện thường được nhắc đến trong chuỗi PEARpearcmd.phpsang RCE.
Hai điểm kiểm tra theme page-* và register_argc_argv chỉ giúp đánh giá mức độ gần với kịch bản xấu nhất. Chúng không phải bản vá. Cách xử lý đúng vẫn là cập nhật WordPress Core.
Cách kiểm tra nhanh trên server WordPress
1. Kiểm tra phiên bản WordPress
cd /path/to/wordpress
wp core version --allow-root
wp core check-update --allow-rootNếu website đang dùng WordPress 7.1.1 trở xuống, cần kiểm tra bản vá phù hợp cho nhánh đang chạy. Website dùng auto background update có thể đã tự cập nhật, nhưng vẫn nên xác minh bằng WP-CLI hoặc Dashboard.
2. Kiểm tra theme có thư mục page-* không
cd /path/to/wordpress
CHILD=$(wp option get stylesheet --allow-root)
PARENT=$(wp option get template --allow-root)
find wp-content/themes/$CHILD wp-content/themes/$PARENT \
-maxdepth 1 -type d -name 'page-*' -print 2>/dev/nullNếu lệnh trả về thư mục như page-templates, website có một trong các điều kiện quan trọng để kịch bản khai thác tiến xa hơn. Không nên kết luận website đã bị hack chỉ vì có thư mục này, nhưng cần ưu tiên cập nhật.
3. Kiểm tra register_argc_argv
Lệnh CLI có thể không phản ánh chính xác cấu hình PHP đang phục vụ web nếu server dùng nhiều phiên bản PHP hoặc PHP-FPM pool riêng. Tuy nhiên đây là bước kiểm tra nhanh ban đầu:
php -i | grep -i register_argc_argv
wp eval 'echo ini_get("register_argc_argv") . PHP_EOL;' --allow-rootNếu register_argc_argv bật trong web runtime, rủi ro từ chuỗi khai thác liên quan PEAR có thể cao hơn. Trên hosting/cPanel, nên kiểm tra đúng phiên bản PHP của domain trong MultiPHP INI Editor hoặc file cấu hình PHP-FPM tương ứng.
WordPress đã vá như thế nào?
WordPress 7.1.2 bổ sung kiểm tra validate_file() cho nhánh xử lý pagename_decoded. Ngoài ra, theo phân tích của Patchstack, bản vá còn thêm cơ chế kiểm tra đường dẫn template được resolve có nằm trong các thư mục hợp lệ hay không. Đây là điểm quan trọng vì nó xử lý vấn đề theo hướng chặn cả một lớp lỗi trong template resolution, không chỉ vá đúng một nhánh bị báo cáo.
// wp-includes/template.php, WordPress 7.1.2
if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {
$templates[] = "page-{$pagename_decoded}.php";
}Nên cập nhật lên phiên bản nào?
Bản chính được khuyến nghị là WordPress 7.1.2. WordPress cũng backport bản vá cho các nhánh cũ còn nhận security fix, xuống đến 4.7. Theo The Hacker News, một số nhánh cập nhật tương ứng gồm:
| Nhánh đang chạy | Bản cần cập nhật |
|---|---|
| 7.1.x | 7.1.2 |
| 7.0.x | 7.0.6 |
| 6.9.x | 6.9.9 |
| 6.8.x | 6.8.10 |
| 6.7.x | 6.7.9 |
| 6.6.x | 6.6.9 |
\n
Nếu có thể, nên chạy phiên bản WordPress mới nhất thay vì chỉ bám một nhánh cũ. Backport giúp giảm rủi ro trong ngắn hạn, nhưng nhánh mới nhất vẫn là hướng duy trì an toàn hơn về lâu dài.
Quy trình xử lý an toàn cho website production
- Backup source và database trước khi cập nhật.
- Kiểm tra bản WordPress hiện tại, PHP version, theme đang active và plugin quan trọng.
- Cập nhật WordPress Core lên bản đã vá phù hợp.
- Kiểm tra lại trang chủ, trang bài viết, trang đăng nhập, REST API và các chức năng quan trọng.
- Nếu dùng cache/CDN, purge cache sau khi cập nhật.
- Theo dõi access log trong vài giờ đầu để phát hiện request bất thường liên quan traversal hoặc request đến file PHP lạ.
# Ví dụ cập nhật bằng WP-CLI sau khi đã backup
cd /path/to/wordpress
wp core update --allow-root
wp core version --allow-rootLưu ý: cập nhật core trên production là thao tác thay đổi trạng thái hệ thống. Nên thực hiện trong khung giờ phù hợp, có backup và phương án rollback nếu website dùng plugin/theme cũ.
Nếu chưa thể cập nhật ngay thì làm gì?
Không có workaround chính thức thay thế bản vá. Tuy nhiên, trong thời gian chờ bảo trì, có thể giảm rủi ro bằng cách:
- Kiểm tra và tạm thời xử lý theme có thư mục
page-*nếu không thật sự cần dùng. Việc đổi/xóa thư mục theme có thể gây lỗi giao diện, nên phải backup và test trước. - Tắt
register_argc_argvcho web requests nếu ứng dụng không cần dùng. Cần kiểm tra đúng PHP runtime của domain. - Gỡ hoặc hạn chế các thành phần PEAR không dùng nếu môi trường cho phép.
- Bật hoặc cập nhật WAF nếu đang dùng Cloudflare, Wordfence, Patchstack hoặc lớp bảo vệ tương đương.
- Theo dõi log request bất thường. Không nên xem các bước này là bản vá hoàn chỉnh.
# Ví dụ kiểm tra file PHP lạ trong uploads
cd /path/to/wordpress
find wp-content/uploads -type f \
\( -name '*.php' -o -name '*.phtml' -o -name '*.phar' \) -printCó cần kiểm tra dấu hiệu bị khai thác không?
The Hacker News cho biết tại thời điểm công bố chưa có báo cáo khai thác thực tế và lỗ hổng chưa xuất hiện trong CISA Known Exploited Vulnerabilities Catalog. Dù vậy, với lỗi không cần đăng nhập và điểm CVSS cao, quản trị viên vẫn nên kiểm tra log và tình trạng file nếu website đang chạy bản dễ bị ảnh hưởng.
- Kiểm tra access log quanh thời điểm trước và sau khi tin công bố.
- Tìm request bất thường có dấu hiệu traversal, chuỗi encode lạ hoặc request page không bình thường.
- Kiểm tra file PHP lạ trong
wp-content/uploads, thư mục cache hoặc thư mục tạm. - Kiểm tra admin user mới, plugin/theme lạ và cron bất thường nếu nghi ngờ đã bị khai thác.
FAQ
Website vừa cập nhật WordPress 7.1.1 có an toàn không?
Chưa đủ. CVE-2026-87902 ảnh hưởng đến cả WordPress 7.1.1. Nếu đang ở nhánh 7.1, cần cập nhật lên 7.1.2.
Lỗi này có phải mọi site đều bị RCE không?
Không. RCE phụ thuộc thêm vào theme và môi trường server. Tuy nhiên lỗi LFI không cần đăng nhập vẫn là rủi ro nghiêm trọng, nên không nên trì hoãn cập nhật.
Tắt register_argc_argv có đủ không?
Không. Đây chỉ là biện pháp giảm rủi ro cho một chuỗi RCE đã biết. Nó không vá lỗi path traversal trong WordPress Core.
Có cần đổi theme không?
Không nhất thiết. Nếu theme có thư mục page-*, điều đó giúp đánh giá rủi ro nhưng bản vá đúng vẫn là cập nhật WordPress. Đổi hoặc sửa theme trên production cần test kỹ vì có thể làm lỗi giao diện.
Kết luận
CVE-2026-87902 là lỗi nghiêm trọng vì nằm trong WordPress Core, không cần đăng nhập và ảnh hưởng nhiều phiên bản từ 4.7.0 đến 7.1.1. Kịch bản RCE cần thêm điều kiện, nhưng quản trị viên không nên xem đó là lý do để trì hoãn. Cách xử lý đúng là cập nhật WordPress lên bản đã vá, kiểm tra theme page-*, kiểm tra register_argc_argv và theo dõi log nếu website từng chạy bản bị ảnh hưởng.
Nguồn tham khảo: The Hacker News, WordPress.org, GitHub Security Advisory và Patchstack.
Với kinh nghiệm thực chiến từ việc tiếp xúc hàng ngày với vô vàn vấn đề về Website, Hosting, VPS, Server tại Phòng Kỹ thuật AZDIGI, mình luôn ấp ủ niềm đam mê chia sẻ kiến thức.
Mình xây dựng các blog không chỉ để tự trau dồi kỹ năng mà còn để cung cấp những tài liệu, hướng dẫn hữu ích nhất đến cộng đồng. Rất mong nhận được sự quan tâm của các bạn!
Để lại thông tin, mình sẽ phản hồi ngay.
