Elementor Pro RCE CVE-2026-32475 CVSS 9.0: Hướng Dẫn Kiểm Tra, Vá Lỗi Và Rà Soát Dấu Vết Tấn Công

Câu trả lời nhanh
Elementor Pro 4.2.1 trở xuống dính lỗ hổng CVE-2026-32475 (CVSS 9.0): lỗi trong Forms module cho phép người không đăng nhập upload file PHP và chiếm quyền RCE nhờ hai vòng lặp xử lý entry rỗng khác nhau. Cập nhật lên 4.2.2 ngay, sau đó rà wp-content/uploads/elementor/forms/ tìm file .php lạ và chặn execute PHP trong thư mục uploads.

Ngày 19/8/2026, Elementor Pro vừa phát hành bản vá 4.2.2 cho lỗ hổng CVE-2026-32475 với điểm CVSS 9.0. Đây là lỗi unauthenticated arbitrary file upload dẫn tới RCE, nằm ngay trong Forms module của Elementor Pro, cho phép bất kỳ ai không đăng nhập upload file PHP lên server của bạn, miễn là site có form với trường File Upload. Mình đã đọc kỹ phân tích của Patchstack và trong bài này mình sẽ chỉ bạn cách kiểm tra, cập nhật và rà soát dấu vết tấn công từ A đến Z.

Lỗ hổng Elementor Pro RCE này hoạt động như thế nào?

Lỗ hổng RCE Elementor Pro CVE-2026-32475

Lỗi nằm trong file modules/forms/fields/upload.php của Elementor Pro 4.2.1 trở xuống. Cơ chế rất tinh vi: hàm validation() kiểm tra đuôi file trong một vòng lặp, còn hàm process_field() di chuyển file trong một vòng lặp khác, và hai vòng lặp này xử lý entry rỗng (file không có tên, lỗi UPLOAD_ERR_NO_FILE) theo hai cách khác nhau.

Cụ thể, validation() gặp entry rỗng thì return luôn, bỏ qua toàn bộ các file phía sau. Còn process_field() chỉ continue qua entry rỗng rồi vẫn di chuyển các file tiếp theo. Kẻ tấn công gửi hai file parts cho cùng một field: entry đầu rỗng, entry thứ hai là file .php. Validator dừng đọc từ entry rỗng nên không bao giờ kiểm tra file .php, trong khi bước move vẫn lưu nó vào wp-content/uploads/elementor/forms/, một thư mục public. Truy cập trực tiếp file đó là có RCE.

Blocklist đuôi file của Elementor Pro vốn rất đầy đủ, chặn từ php, phtml cho tới exe, jar. Nhưng vấn đề là kiểm soát đó chẳng bao giờ chạy đối với payload này. Một lớp hoàn hảo nhưng đứng nhầm chỗ thì cũng vô nghĩa.

Site của bạn có đang bị nguy hiểm không?

Câu trả lời ngắn gọn: nếu bạn đang chạy Elementor Pro từ 4.2.1 trở xuống và có ít nhất một trang đã publish chứa Form widget với trường File Upload không bật Required, thì có. Đây là cấu hình cực kỳ phổ biến: form ứng tuyển việc làm, form đính kèm ảnh, CCCD, hóa đơn, hay support ticket đều dính hết.

Cách kiểm tra phiên bản nhanh bằng WP-CLI:

sudo -u www-data wp plugin list --path=/var/www/thienlv.com/public_html | grep elementor
sudo -u www-data wp post list --post_type=elementor-library --field=ID --path=/var/www/thienlv.com/public_html

Nếu bạn không dùng WP-CLI, vào Dashboard > Plugins xem phiên bản Elementor Pro. Sau đó rà từng form: tìm form nào có widget Form chứa field dạng File Upload, đặc biệt là field không bật Required, vì lỗi chỉ khai thác được khi field không bắt buộc.

Cách cập nhật Elementor Pro 4.2.2 an toàn?

Nâng cấp lên 4.2.2 trở lên là cách vá duy nhất. Bản vá đưa hai vòng lặp về cùng một cách xử lý entry rỗng, và quan trọng hơn, phiên bản mới còn kiểm tra lại đuôi file ngay bên trong process_field(), tức là chặn trực tiếp tại điểm lưu file chứ không chỉ ở bước validation nữa. Đây là kiểu defense-in-depth đúng chuẩn.

Mình luôn làm theo trình tự này trước khi bấm Update:

# 1. Backup database và file
wp db export backup-pre-update.sql --path=/var/www/thienlv.com/public_html
tar -czf backup-wp-content.tar.gz /var/www/thienlv.com/public_html/wp-content

# 2. Kiểm tra bản update
sudo -u www-data wp plugin update elementor-pro --dry-run --path=/var/www/thienlv.com/public_html

# 3. Update thật
sudo -u www-data wp plugin update elementor-pro --path=/var/www/thienlv.com/public_html

# 4. Xác nhận phiên bản
sudo -u www-data wp plugin list --path=/var/www/thienlv.com/public_html | grep elementor-pro

Sau update, vào lại một trang có form upload, thử nộp file đính kèm bình thường để chắc chắn chức năng không vỡ. Nếu license Elementor Pro của bạn hết hạn và không update được, hãy tạm thời vô hiệu hóa trường File Upload trên mọi form cho đến khi gia hạn.

Cách rà soát dấu vết tấn công trên server?

Điểm nguy hiểm của lỗ hổng này là nó để lại file thật trên đĩa. Cập nhật vá lỗi chỉ đóng cửa lại, không xóa được file PHP mà kẻ tấn công đã upload trước đó. Nếu site bạn từng chạy bản dễ tổn thương với form upload public, hãy rà thư mục ngay:

# Liệt kê mọi file PHP trong thư mục uploads của Elementor (không được có file nào)
find /var/www/thienlv.com/public_html/wp-content/uploads/elementor/forms/ -name "*.php*"

# Xem toàn bộ file lạ theo thời gian tạo, sắp xếp mới nhất lên cuối
ls -ltr --time=birth /var/www/thienlv.com/public_html/wp-content/uploads/elementor/forms/

# Nếu thấy file .php khả nghi, đừng xóa vội, cách ly trước
mkdir -p /root/quarantine
mv /path/to/file-kha-nghi.php /root/quarantine/

Tên file được sinh bằng uniqid() nên sẽ có dạng như 68b0e380d1a2b.php, chứ không giữ tên gốc của attacker. Ngoài ra hãy kiểm tra access log xem có request GET bất thường vào /wp-content/uploads/elementor/forms/:

grep "uploads/elementor/forms" /var/log/nginx/access.log | grep -v ".(jpg|png|pdf|docx|zip)$"

Nếu phát hiện file PHP đã được request thành công, coi như server từng bị thực thi mã. Lúc đó bạn cần quét malware toàn diện, đổi toàn bộ mật khẩu, kiểm tra admin account lạ và cân nhắc rebuild từ backup sạch. Trường hợp tương tự WP-SHELLSTORM mình từng phân tích, xử lý webshell cần kỹ hơn chỉ xóa file.

Làm sao để phòng tránh kiểu lỗi này về sau?

Bài học lớn nhất từ CVE-2026-32475 là: validate và move file phải dùng một logic duy nhất, và blocklist cần đứng ngay tại nơi file được ghi. Với góc nhìn quản trị site, mình rút ra ba việc nên làm ngay từ hôm nay.

Thứ nhất, chặn execute PHP trong thư mục uploads ở mức web server. Với Nginx, thêm vào server block:

location ~* ^/wp-content/uploads/.*.php$ {
    deny all;
}

Với Apache, drop file .htaccess vào wp-content/uploads/:

<FilesMatch ".(php|php[0-9]|phtml|phar)$">
    Require all denied
</FilesMatch>

Thứ hai, cân nhắc thật kỹ trước khi bật trường File Upload trên form public. Nếu bắt buộc phải có, giới hạn file types ở mức tối thiểu và bật Required cho field. Thứ ba, luôn bật auto-update cho plugin trả phí quan trọng như Elementor Pro, hoặc tối thiểu có cron kiểm tra phiên bản mỗi ngày. Đây không phải lỗ hổng đầu tiên và chắc chắn sẽ không phải cuối cùng, giống như chuỗi CVE Kirki hay miniOrange SSO mình đã viết trước đó, tốc độ vá lỗi mới là tấm khiên thật sự.

Kết luận

CVE-2026-32475 là minh điển hình cho thấy một bug logic nhỏ, chỉ khác nhau giữa returncontinue, có thể biến thành RCE toàn quyền không cần đăng nhập. Nếu site bạn dùng Elementor Pro với form upload, hãy update lên 4.2.2 ngay hôm nay và rà uploads/elementor/forms/ tìm file .php lạ. Việc này mất chưa đến 15 phút, còn hậu quả nếu bị khai thác thì tính bằng cả server.

Thanh Tùng

Mình là Thanh Tùng. Bạn bè gọi mình là "bác sĩ máy tính" vì hễ máy nào có vấn đề là mình muốn mò vào xem sao. Mình viết hướng dẫn theo cách mà mình mong người khác đã viết cho mình ngày xưa — từng bước rõ ràng, không bỏ sót, và nói luôn cái gì hay bị lỗi. Ngoài giờ làm mình chơi guitar, nuôi mèo, và có một con VPS riêng dành riêng cho việc cài thử đủ thứ linh tinh.

Xem tất cả bài viết →

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *