Đọc tệp cục bộ không cần đăng nhập qua get_page_template()
Một request không cần đăng nhập có thể điều khiển bước chọn template của trang, khiến WordPress nạp một tệp .php bất kỳ đọc được trên đĩa, ngoài thư mục theme. Kèm điều kiện về theme và một tệp PHP đọc được, lỗi dẫn tới chạy mã.
Chuyện gì xảy ra
get_page_template() chọn tệp template cho một trang; lỗi cho phép kết quả trỏ ra ngoài thư mục theme đang dùng, tới một tệp .php đọc được.
Điều kiện nêu trong cảnh báo: theme có thư mục tên bắt đầu bằng page-, và trên máy có một tệp PHP đọc được như pearcmd.php với register_argc_argv bật.
Điều kiện đó rẻ trên shared hosting: theme mặc định hoặc theme phổ biến có thư mục page-, và tệp PHP đọc được thì thường có sẵn — của site khác, của một bản sao lưu.
Đường vào
- Một request HTTP không cần đăng nhập điều khiển bước chọn template của trang.
- Tệp PHP đọc được trên cùng máy là nửa còn lại của điều kiện: không cần tệp đó thuộc site bị chạm, chỉ cần nó đọc được.
- Bản sao lưu trong thư mục web: không được vhost nào phục vụ nên không phải đường vào, nhưng nó vẫn là tệp PHP đọc được — tức là điều kiện cho site khác trên cùng máy.
Tệp nào là điều kiện
- Core WordPress trên đĩa: bản vá là thay tệp core, theo đúng nhánh.
- Theme đang dùng: điều kiện nằm ở cấu trúc thư mục theme. Đổi theme không phải bản vá, và không phải theme nào cũng có thư mục
page-. - Các site khác và bản sao lưu trên cùng máy: chúng không chạy bản WordPress lỗi, nhưng vẫn cung cấp tệp PHP đọc được.
Đang chạy, không phải đã cài
- Sau khi thay tệp core, khởi động lại FPM để chắc chắn mã mới đang chạy; opcache thường tự kiểm tra nhưng không phải lúc nào cũng vậy.
- Kiểm tra checksum của core sau khi nâng: một tệp core bị sửa tay có thể làm bản vá không còn đúng.
Bản bị ảnh hưởng và bản vá
| Sản phẩm | CVE | Bản bị ảnh hưởng | Bản vá |
|---|---|---|---|
| WordPress | CVE-2026-87902 | 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 |
Còn 19 nhánh nữa — danh sách đầy đủ: Mọi lỗ hổng WordPress
Tóm tắt giữ nguyên tiếng Anh như trong cảnh báo gốc.
Mô tả gốc (WordPress · CVE-2026-87902): An unauthenticated attacker can make `get_page_template()` page-template resolution include a chosen readable local `.php` file outside the active theme directories. If relevant pre-conditions for both the server and the active theme are met, this can lead to RCE.
Cách xử lý
- Nâng core theo đúng nhánh đang chạy; bảng trên liệt kê bản vá của từng nhánh.
- Dọn tệp PHP đọc được nằm ngoài thư mục phục vụ: bản sao lưu, thư mục cũ, tệp của site đã bỏ.
- Nếu chưa nâng được: giới hạn quyền đọc tệp PHP ngoài docroot, và theo dõi log cho request lạ tới trang có template lạ.
Tự kiểm tra
wp core versionCho biết: bản core đang chạy, so với bảng trên
wp core verify-checksumsCho biết: tệp core có bị sửa tay không
find <docroot> -maxdepth 3 -type d -name 'page-*'Cho biết: theme có thư mục page- — một nửa điều kiện
find /home -name '*.php' -readable 2>/dev/null | headCho biết: tệp PHP đọc được ngoài docroot — nửa điều kiện còn lại
wp theme list --status=activeCho biết: theme đang dùng; theme nào có thư mục page-
Nguồn
Viết từ cảnh báo gốc và tài liệu của nhà phát hành; phiên bản lấy từ dữ liệu của trang, cập nhật 10/11/2026. Khi có khác biệt, cảnh báo gốc là chuẩn.