Khi mình thấy con số 3,2 triệu site WordPress vẫn đang chạy plugin bị lỗ hổng RCE với exploit công khai, tôi thật sự không ngạc nhiên nhưng vẫn thấy đáng lo. All-in-One WP Migration and Backup, plugin backup hơn 5 triệu site đang dùng, vừa bị phát hiện lỗ hổng CVE-2026-19949 cho phép kẻ tấn công không cần tài khoản vẫn chiếm toàn quyền site. Trong bài này, mình sẽ đi từng bước: lỗ hổng hoạt động ra sao, cách kiểm tra site bạn có dính không bằng WP-CLI, vá thế nào và rà dấu vết nếu đã lỡ bị khai thác.
CVE-2026-19949 là lỗi gì mà nghiêm trọng đến vậy?

Đây là lỗ hổng second-order SQL injection (CVSS 8.8) nằm ở chức năng restore archive của plugin. Nghiêm trọng vì nó leo thang thành RCE: kẻ tấn công gửi hai trackback chứa payload đến một bài viết công khai của bạn, chờ đến khi bạn backup rồi import lại site, payload được đẩy vào SQL và lộ secret key của quá trình restore. Từ đó kẻ tấn công lấy key qua comments REST API, import file .wpress chứa malicious must-use plugin và chạy code tùy ý ngay lần tải trang tiếp theo.
Site của bạn có đang bị ảnh hưởng không?
Câu trả lời rất dễ kiểm tra: mọi phiên bản All-in-One WP Migration và Backup từ 7.109 trở xuống đều dính, chỉ bản 7.110 phát hành ngày 20/8 là đã vá. Theo số liệu WordPress.org tính đến 3/9, mới chỉ 35% bản cài được nâng cấp, nghĩa là khoảng 3,2 triệu site vẫn đang phơi mình. Kiểm tra ngay bằng lệnh sau, mất đúng 10 giây:
sudo -u www-data wp plugin list --path=/var/www/yoursite/public_html | grep all-in-oneNếu phiên bản hiện tại nhỏ hơn 7.110, site bạn đang nằm trong nhóm rủi ro. Còn nếu plugin đã tắt nhưng vẫn cài trên server, tôi khuyên nâng cấp hoặc gỡ hẳn, vì code cũ vẫn nằm đó.
Vá lỗi như thế nào cho đúng chuẩn?
Cách nhanh nhất là nâng cấp lên 7.110 qua WP-CLI, nhưng mình luôn làm theo quy trình ba bước để không vỡ việc: backup trước, cập nhật, kiểm tra sau.
# Bước 1: backup database
sudo -u www-data wp db export --path=/var/www/yoursite/public_html backup-pre-patch.sql
# Bước 2: nâng cấp plugin
sudo -u www-data wp plugin update all-in-one-wp-migration --path=/var/www/yoursite/public_html
# Bước 3: xác nhận phiên bản mới
sudo -u www-data wp plugin list --path=/var/www/yoursite/public_html | grep all-in-oneMột lưu ý thực tế từ kinh nghiệm của mình: bản miễn phí của plugin này đôi khi khóa tính năng import qua hạn mức extension, nhưng bản cập nhật bảo mật vẫn tải bình thường. Đừng trì hoãn chỉ vì bạn không dùng chức năng trả phí, vì code lỗi vẫn chạy trên site.
Làm sao biết site đã bị khai thác chưa?
Điểm nguy hiểm của second-order SQL injection là không có request tấn công trực tiếp nào dễ thấy trong log. Thay vào đó, bạn cần rà bốn dấu vết đặc trưng của chuỗi khai thác này. Tôi làm theo thứ tự sau:
Một, kiểm tra trackback lạ trên bài viết công khai. Payload đi vào qua trackback nên hãy tìm comment có URL kết thúc bằng backslash hoặc trỏ tới domain không rõ nguồn:
sudo -u www-data wp comment list --path=/var/www/yoursite/public_html
--status=approve --fields=comment_ID,comment_author,comment_author_url,comment_date
| grep -E 'http.+\$|odd-domain'Hai, rà thư mục must-use plugins. Đây là nơi malicious plugin được thả xuống khi khai thác thành công:
ls -la /var/www/yoursite/public_html/wp-content/mu-plugins/
sudo -u www-data wp mu-plugin list --path=/var/www/yoursite/public_htmlBa, quét webshell trong thư mục uploads và plugin. Tìm các file PHP có hàm đáng ngờ như eval, base64_decode, system:
grep -rlE "eval(|base64_decode|shell_exec"
/var/www/yoursite/public_html/wp-content/uploads/
/var/www/yoursite/public_html/wp-content/plugins/ 2>/dev/nullBốn, đối chiếu users và options. Kẻ tấn công sau RCE thường tạo admin mới hoặc đổi siteurl:
sudo -u www-data wp user list --path=/var/www/yoursite/public_html --role=administrator
sudo -u www-data wp option get siteurl --path=/var/www/yoursite/public_htmlNếu bất kỳ dấu vết nào dương tính, hãy coi site bị compromised: snapshot toàn bộ, thay toàn bộ mật khẩu, đánh dấu secret key và API token là rò rỉ rồi Clean-room restore từ backup sạch.
Làm gì để không gặp tình huống này lần sau?
Bài học từ CVE-2026-19949 với mình rất rõ: plugin backup cũng là bề mặt tấn công, và cơ chế second-order nghĩa là payload có thể nằm im trong database của bạn ngay lúc này. Ba việc tôi duy trì trên mọi site quản lý: bật auto-update cho các plugin quan trọng, gỡ plugin backup khi không dùng tới thay vì chỉ deactivate, và kiểm tra thư mục mu-plugins định kỳ. Bạn có thể tham khảo thêm hướng dẫn bật Brotli giảm tải trang hoặc checklist bảo mật thời AI mà tôi đã viết trước đây để dựng lớp phòng thủ nhiều tầng. Nâng cấp 7.110 ngay hôm nay, đừng để site mình nằm trong 3,2 triệu cái còn lại.