Một trong những nỗi lo sợ lớn nhất của quản trị viên hệ thống là việc xuất hiện lỗ hổng bảo mật nghiêm trọng nằm ngay trong phần lõi (Core) của nền tảng quản trị nội dung.
Khác với lỗi bảo mật trong plugin hay theme bên thứ ba, lỗ hổng lõi có mức độ ảnh hưởng diện rộng khủng khiếp, đe dọa hàng triệu website trên toàn cầu. Đợt công bố an ninh khẩn cấp liên quan đến định danh CVE-2026-87902 mới đây đã gióng lên một hồi chuông cảnh báo lớn đối với toàn bộ cộng đồng phát triển và quản trị WordPress.
Lỗ hổng CVE-2026-87902 bắt nguồn từ cơ chế phân giải tệp tin giao diện (Template Resolution) trong nhân lõi WordPress, cho phép kẻ tấn công chưa xác thực thực hiện kỹ thuật chèn tệp cục bộ (Local File Inclusion – LFI). Đáng lo ngại hơn, trong một số điều kiện cấu hình môi trường máy chủ nhất định, lỗi này có thể nhanh chóng nâng cấp thành thực thi mã từ xa (Remote Code Execution – RCE), giúp tin tặc chiếm quyền điều khiển hoàn toàn máy chủ web.
Để bảo vệ hạ tầng máy chủ vững chắc trước các đợt quét tấn công tự động, bạn nên kết hợp tham khảo thêm quy trình bảo mật SSH Hardening máy chủ và áp dụng các tiêu chuẩn Docker Security Best Practices. Trong bài phân tích chuyên sâu này, mình sẽ cùng các bạn mổ xẻ tường tận về CVE-2026-87902: từ nguyên nhân gốc rễ trong mã nguồn, chuỗi khai thác WordPress LFI sang RCE, danh sách phiên bản bị ảnh hưởng cho đến 5 bước kiểm tra và quy trình xử lý an toàn nhất cho website production.
1. Bản chất kỹ thuật: CVE-2026-87902 là gì và cơ chế chọn template trong WordPress Core
Để hiểu rõ bản chất của CVE-2026-87902, chúng ta cần tìm hiểu cách thức WordPress lựa chọn tệp tin giao diện khi người dùng truy cập vào một trang cụ thể (Page). Theo hệ thống phân cấp mẫu (Template Hierarchy) của WordPress, khi có một request yêu cầu hiển thị một Page, hệ thống sẽ gọi hàm get_page_template() nằm trong tệp tin wp-includes/template.php để xây dựng danh sách các tệp template tiềm năng có thể sử dụng.
Quy trình phân giải này sẽ tìm kiếm lần lượt các tệp giao diện theo độ ưu tiên giảm dần: từ template tùy chỉnh được gán cho trang, đến tệp template theo slug trang (page-{slug}.php), tệp template theo ID trang (page-{id}.php) và cuối cùng là tệp dự phòng page.php hoặc index.php. Điểm mấu chốt tạo nên lỗ hổng WordPress Core mang mã CVE-2026-87902 nằm ở nhánh xử lý tham số pagename truyền vào từ người dùng.
Theo công bố chính thức từ hệ thống định danh lỗ hổng MITRE CVE, lỗ hổng CVE-2026-87902 được xếp loại ở mức độ nghiêm trọng cao do không yêu cầu kẻ tấn công phải sở hữu bất kỳ tài khoản hay đặc quyền đăng nhập nào (Unauthenticated). Bất kỳ ai trên internet gửi một request có cấu trúc đặc biệt đến website đều có thể kích hoạt nhánh mã nguồn chứa lỗi này.
2. Phân tích mã nguồn gốc rễ: Lỗi thiếu kiểm tra validate_file() trong CVE-2026-87902
Sự cố CVE-2026-87902 là một bài học đắt giá về việc kiểm tra dữ liệu đầu vào (Input Validation) trong kỹ thuật phần mềm. Khi phân tích tệp mã nguồn wp-includes/template.php trên các phiên bản WordPress bị ảnh hưởng, chúng ta sẽ thấy sự chênh lệch đáng ngạc nhiên trong cách xử lý các biến số.
Đoạn mã nguồn chứa lỗi trong các phiên bản WordPress cũ
Dưới đây là đoạn mã gốc xử lý tạo danh sách template trong wp-includes/template.php của WordPress phiên bản 7.1.1 trở về trước tạo nên CVE-2026-87902:
// 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";
}
Nhìn vào đoạn mã trên của CVE-2026-87902, bạn sẽ phát hiện ra ngay sự bất thường: Biến $template ở nhánh phía trên đã được các nhà phát triển WordPress bao bọc rất cẩn thận bằng hàm validate_file( $template ) để ngăn chặn các ký tự chuyển hướng thư mục (Directory Traversal). Tuy nhiên, ngay nhánh if ( $pagename ) kế bên, chuỗi $pagename_decoded sau khi được giải mã URL bằng urldecode() lại được nối thẳng trực tiếp vào mảng $templates[] mà hoàn toàn không hề có bước kiểm tra validate_file().
Chính sự thiếu sót này trong lỗ hổng WordPress Core cho phép kẻ tấn công truyền vào chuỗi ký tự được mã hóa URL hai lần (Double Encoding) hoặc các chuỗi đại diện cho kỹ thuật Path Traversal (chẳng hạn như ..%2f). Khi WordPress duyệt qua mảng $templates để tìm tệp giao diện, cơ chế phân giải đường dẫn có thể bị đánh lừa và vượt ra khỏi ranh giới thư mục theme hiện tại, dẫn tới nguy cơ CVE-2026-87902 bị khai thác thành công.
3. 4 Điều kiện môi trường biến lỗi LFI thành RCE qua chuỗi PEAR pearcmd.php trong CVE-2026-87902
Một điểm kỹ thuật rất quan trọng cần phải làm rõ khi đánh giá CVE-2026-87902: Lỗ hổng này về bản chất trực tiếp là LFI (Local File Inclusion), tức là khả năng ép máy chủ đọc và thực thi một tệp PHP đã có sẵn trên máy chủ. Lỗi này không đồng nghĩa với việc mọi website cài WordPress đều sẽ bị thực thi mã từ xa (RCE) ngay tức khắc.
Theo báo cáo phân tích chuyên sâu từ cơ sở dữ liệu bảo mật Patchstack, kịch bản leo thang từ WordPress LFI sang RCE với CVE-2026-87902 chỉ có thể xảy ra khi môi trường máy chủ hội tụ đủ 4 điều kiện khắt khe sau đây:
| Điều kiện | Yếu tố môi trường kỹ thuật | Vai trò trong chuỗi khai thác RCE |
|---|---|---|
| Điều kiện 1 | WordPress Core từ 4.7.0 đến 7.1.1 | Tồn tại nhánh mã nguồn thiếu hàm validate_file() |
| Điều kiện 2 | Theme có thư mục bắt đầu bằng page-* | Giúp vượt qua bước kiểm tra ranh giới thư mục |
| Điều kiện 3 | Tồn tại tệp PHP có thể include trên server | Tệp chứa mã nguồn mà attacker muốn thực thi |
| Điều kiện 4 | Chỉ thị PHP register_argc_argv bật (On) | Cho phép truyền tham số vào tệp CLI pearcmd.php |
Chi tiết về điều kiện thư mục theme page-* trong CVE-2026-87902
Trong cấu trúc phân giải template, tiền tố page- luôn được tự động thêm vào đầu tên tệp. Do đó, để đường dẫn traversal có thể hoạt động hợp lệ khi ghép nối, theme đang kích hoạt (hoặc theme cha Parent Theme) phải có một thư mục cấp cao nhất bắt đầu bằng page- (ví dụ: thư mục page-templates). Các theme mặc định kinh điển như Twenty Twelve, Twenty Fourteen và một số theme phổ biến bên thứ ba như Neve, Hestia hay Sydney thường có cấu trúc thư mục này, vô tình tạo điều kiện thuận lợi cho kẻ tấn công khai thác CVE-2026-87902.
Chuỗi khai thác RCE thông qua PEAR pearcmd.php
Nếu máy chủ chạy PHP bật sẵn chỉ thị register_argc_argv = On (thường gặp trên các môi trường cấu hình mặc định cũ của cPanel, DirectAdmin hoặc Docker image sơ sài) và có cài đặt sẵn gói PEAR (tệp /usr/local/lib/php/pearcmd.php), kẻ tấn công có thể lợi dụng CVE-2026-87902 để thực hiện chuỗi tấn công tinh vi: truyền tham số dòng lệnh qua URL để ép pearcmd.php tạo ra một tệp PHP chứa mã độc webshell vào thư mục web, sau đó include chính tệp đó để chiếm quyền điều khiển máy chủ.
4. Danh sách các phiên bản bị ảnh hưởng và bản vá chính thức trong WordPress 7.1.2
Mức độ nghiêm trọng của CVE-2026-87902 thể hiện ở phạm vi ảnh hưởng rộng lớn chưa từng thấy. Lỗ hổng này đã âm thầm tồn tại trong nhân lõi WordPress suốt gần 10 năm qua, bắt đầu từ phiên bản WordPress 4.7.0 (phát hành từ tháng 12 năm 2016) và kéo dài liên tục cho đến tận phiên bản WordPress 7.1.1.
Nhận thức được mức độ đe dọa to lớn của lỗ hổng WordPress Core này, đội ngũ an ninh của thông báo bảo mật WordPress.org đã khẩn cấp phát hành bản cập nhật cập nhật WordPress 7.1.2, đồng thời thực hiện backport bản vá cho toàn bộ các nhánh phiên bản cũ từ 4.7 trở lên.
Cách WordPress 7.1.2 vá dứt điểm lỗi CVE-2026-87902
Trong phiên bản 7.1.2, đoạn mã xử lý template trong wp-includes/template.php đã được bổ sung kiểm tra nghiêm ngặt bằng cách gọi validate_file( $pagename_decoded ):
// wp-includes/template.php, WordPress 7.1.2 (Đã vá dứt điểm CVE-2026-87902)
if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {
$templates[] = "page-{$pagename_decoded}.php";
}
Bên cạnh việc bổ sung validate_file() cho biến giải mã, bản vá của WordPress còn gia cố thêm cơ chế kiểm tra đường dẫn tuyệt đối (Resolved Path Validation) nhằm đảm bảo tệp template cuối cùng bắt buộc phải nằm bên trong các thư mục giao diện được phê duyệt hợp lệ. Việc đóng chặt cả hai lớp bảo vệ này đã triệt tiêu hoàn toàn khả năng khai thác CVE-2026-87902.
5. Quy trình 5 bước kiểm tra nhanh và rà soát an ninh trên máy chủ WordPress bằng WP-CLI
Để đảm bảo bảo mật WordPress Core trên toàn bộ các website mà bạn đang quản lý, hãy đăng nhập SSH vào máy chủ và thực hiện quy trình kiểm tra 5 bước chuẩn mực bằng công cụ WP-CLI đối với CVE-2026-87902:
Bước 1: Kiểm tra phiên bản WordPress hiện tại
# Di chuyển vào thư mục cài đặt WordPress và kiểm tra phiên bản
cd /var/www/html
wp core version --allow-root
wp core check-update --allow-root
Nếu kết quả hiển thị website đang chạy WordPress từ 4.7.0 đến 7.1.1, hệ thống của bạn đang nằm trong diện có nguy cơ bị ảnh hưởng bởi CVE-2026-87902 và cần được lên kế hoạch cập nhật ngay lập tức.
Bước 2: Kiểm tra thư mục giao diện có tiền tố page-*
Chạy đoạn script sau để kiểm tra xem theme đang kích hoạt hoặc theme cha có chứa thư mục dạng page-* hay không:
# Kiểm tra thư mục page-* trong theme đang kích hoạt
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/null
Nếu lệnh trả về các thư mục như page-templates, website của bạn thỏa mãn điều kiện then chốt của chuỗi khai thác và cần ưu tiên xử lý khẩn cấp trước.
Bước 3: Kiểm tra thông số register_argc_argv trong môi trường PHP
# Kiểm tra cấu hình register_argc_argv trong PHP CLI và Web Runtime
wp eval 'echo "register_argc_argv: " . ini_get("register_argc_argv") . PHP_EOL;' --allow-root
Nếu giá trị trả về là 1 hoặc On, môi trường runtime của bạn đang mở toang cánh cửa cho các cuộc tấn công leo thang RCE qua PEAR.
Bước 4: Rà soát tệp tin PHP lạ trong thư mục wp-content/uploads
Thư mục tải lên của WordPress chỉ được phép chứa các tệp đa phương tiện (ảnh, video, tài liệu). Tuyệt đối không được phép có sự xuất hiện của bất kỳ tệp thực thi PHP nào:
# Tìm kiếm các tệp PHP khả nghi trong thư mục uploads
find wp-content/uploads -type f \( -name '*.php' -o -name '*.phtml' -o -name '*.phar' \) -print
Để tự động hóa việc quét mã độc định kỳ cho toàn bộ máy chủ web, bạn nên kết hợp cài đặt thêm công cụ quét mã độc ClamAV nhằm phát hiện sớm các biến thể webshell được tải lên trái phép.
Bước 5: Kiểm tra danh sách tài khoản quản trị viên mới tạo
# Liệt kê toàn bộ người dùng có quyền Administrator trên website
wp user list --role=administrator --allow-root
Nếu phát hiện bất kỳ tài khoản quản trị nào có tên lạ hoặc được tạo vào những khung giờ bất thường, website của bạn rất có thể đã bị xâm nhập và cần tiến hành cô lập để điều tra ngay lập tức.
6. Hướng dẫn cập nhật và các biện pháp giảm thiểu rủi ro tức thì
Biện pháp xử lý triệt để và an toàn nhất cho CVE-2026-87902 là nâng cấp hệ thống lên phiên bản đã được vá lỗi. Tuy nhiên, trên các website thương mại điện tử lớn đang hoạt động, việc cập nhật trực tiếp luôn tiềm ẩn nguy cơ xung đột mã nguồn.
Quy trình cập nhật an toàn cho website Production
Để đảm bảo không gây gián đoạn dịch vụ của khách hàng, hãy tuân thủ quy trình cập nhật chuẩn mực sau:
- Sao lưu toàn diện (Full Backup): Luôn sao lưu toàn bộ mã nguồn và cơ sở dữ liệu MySQL trước khi thực hiện bất kỳ thao tác cập nhật nào để sẵn sàng khôi phục nếu phát sinh lỗi.
- Thực thi lệnh cập nhật qua WP-CLI: Chạy lệnh
wp core update --allow-rootđể tải về và cài đặt phiên bản cập nhật WordPress 7.1.2 chính thức. - Kiểm tra toàn diện chức năng website: Kiểm tra lại trang chủ, trang đăng nhập quản trị, chức năng thanh toán và các lệnh gọi REST API.
- Xóa sạch bộ nhớ đệm: Nếu website của bạn đang sử dụng cơ chế Full page cache cho WordPress hoặc Cloudflare CDN, hãy thực hiện lệnh Purge Cache toàn trang để đảm bảo mã nguồn mới được áp dụng đồng bộ.
Các giải pháp phòng thủ tạm thời nếu chưa thể cập nhật ngay
Nếu dự án của bạn bị ràng buộc bởi các plugin cũ chưa tương thích và chưa thể nâng cấp WordPress ngay lập tức, bạn có thể áp dụng các biện pháp giảm thiểu rủi ro tạm thời để phòng chống CVE-2026-87902:
- Tắt chỉ thị register_argc_argv trong php.ini: Chỉnh sửa tệp cấu hình PHP của bạn, đặt
register_argc_argv = Offvà khởi động lại dịch vụ PHP-FPM. Bước này giúp triệt tiêu hoàn toàn chuỗi khai thác RCE qua PEAR. - Chặn ký tự traversal trên máy chủ web Nginx: Bổ sung quy tắc từ chối các request chứa chuỗi encode traversal nguy hiểm nhắm vào tham số trang web.
- Kích hoạt WAF bảo vệ tầng biên: Bật các quy tắc phòng thủ Managed Rules trên Cloudflare, Wordfence hoặc Patchstack để tự động chặn các payload khai thác CVE-2026-87902 từ xa.
7. Rà soát dấu vết xâm nhập: Kiểm tra access log và tài khoản bất thường
Theo ghi nhận từ chuyên trang bảo mật uy tín chuyên trang an ninh The Hacker News, tại thời điểm lỗ hổng CVE-2026-87902 được công bố rộng rãi, chưa có báo cáo nào ghi nhận các chiến dịch tấn công diện rộng trong thực tế. Tuy nhiên, các công cụ quét mã độc tự động của tin tặc luôn phản ứng cực kỳ nhanh chóng để tìm kiếm các máy chủ chưa kịp cập nhật.
Dưới đây là câu lệnh phân tích tệp nhật ký truy cập (Access Log) của máy chủ web Nginx/Apache giúp bạn phát hiện sớm các dấu hiệu bị rà quét hoặc tấn công thử nghiệm CVE-2026-87902:
# Quét access log tìm kiếm các mẫu request path traversal và pearcmd đáng ngờ
grep -Ei "(\.\.%2f|\.\./|pearcmd\.php|page-.*templates)" /var/log/nginx/access.log
Nếu kết quả trả về các dòng log có chứa chuỗi ..%2f đi kèm với các tham số pagename hoặc lệnh gọi đến các tệp tin hệ thống, hãy nhanh chóng lưu trữ bằng chứng nhật ký và tiến hành kiểm toán an ninh toàn diện để đảm bảo website chưa bị cấy mã độc ngầm.
8. Lời khuyên thực chiến từ Cypher: Chiến lược bảo mật đa tầng cho WordPress
Sau nhiều năm trực tiếp tham gia ứng cứu sự cố và bảo vệ hạ tầng cho các hệ thống WordPress có lưu lượng hàng triệu người dùng, mình đúc kết được rằng: Không có một giải pháp đơn lẻ nào có thể bảo vệ an toàn 100% cho website của bạn. Để ngăn ngừa các hiểm họa tương tự như CVE-2026-87902, doanh nghiệp bắt buộc phải xây dựng chiến lược phòng ngự theo chiều sâu (Defense-in-Depth):
Quan điểm của Cypher: Một hệ thống bảo mật tốt là hệ thống mà ngay cả khi mã nguồn ứng dụng xuất hiện lỗ hổng LFI nghiêm trọng, kẻ tấn công vẫn bị chặn đứng ở tầng phân quyền hệ thống tệp và cấu hình máy chủ, hoàn toàn không thể leo thang đặc quyền để thực thi mã độc RCE.
Những nguyên tắc vàng xây dựng pháo đài bảo mật WordPress Core vững chắc:
- Khóa cứng quyền ghi trên hệ thống tệp tin (Read-Only Codebase): Trên môi trường sản xuất, hãy phân quyền chỉ đọc cho toàn bộ thư mục mã nguồn WordPress (
wp-admin,wp-includes,wp-content/plugins). Chỉ duy nhất thư mụcwp-content/uploadsđược phép ghi tệp tin, nhưng phải chặn tuyệt đối việc thực thi mã PHP bên trong thư mục này. - Tắt hoàn toàn các hàm PHP nguy hiểm: Cấu hình chỉ thị
disable_functions = exec,passthru,shell_exec,system,proc_open,popentrong tệpphp.iniđể triệt tiêu mọi khả năng thực thi lệnh hệ điều hành của tin tặc. - Thiết lập giới hạn tần suất truy vấn nghiêm ngặt: Áp dụng kỹ thuật Rate Limiting bảo vệ API tại tầng gateway đón đầu để ngăn chặn các đợt quét tìm lỗ hổng tự động với tần suất cao của các mạng botnet.
Tổng kết
Tóm lại, sự cố CVE-2026-87902 là một lời nhắc nhở sâu sắc về tầm quan trọng của việc duy trì tính kỷ luật trong quản trị hệ thống và kiểm thử mã nguồn. Bằng việc chủ động kiểm tra phiên bản, rà soát cấu hình PHP, tiến hành nâng cấp lên cập nhật WordPress 7.1.2 kịp thời và áp dụng các biện pháp phòng vệ đa tầng, bạn sẽ bảo vệ an toàn tuyệt đối cho tài sản dữ liệu và uy tín kinh doanh của doanh nghiệp trước các đợt sóng tấn công mạng khốc liệt.
Hy vọng cẩm nang phân tích chuyên sâu này đã mang lại cho các bạn những góc nhìn thực tế và các giải pháp hành động cụ thể để chủ động ứng phó với CVE-2026-87902. Nếu bạn có bất kỳ câu hỏi nào về cách kiểm tra hoặc cần hỗ trợ xử lý sự cố, hãy để lại bình luận phía dưới để chúng ta cùng nhau thảo luận nhé!


