All-in-One WP Migration CVE-2026-19949 RCE: 3,2 Triệu Site Chưa Vá, Hướng Dẫn Kiểm Tra Bằng WP-CLI

Câu trả lời nhanh
All-in-One WP Migration và Backup dính lỗ hổng CVE-2026-19949: second-order SQL injection ở chức năng restore archive, leo thang thành RCE không cần đăng nhập. Mọi bản từ 7.109 trở xuống đều lỗi, chỉ bản 7.110 vá. Kiểm tra bằng wp plugin list, vá bằng wp plugin update, rồi rà trackback lạ, thư mục mu-plugins và webshell trong uploads.

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?

Lỗ hổng RCE CVE-2026-19949 trong plugin All-in-One WP Migration
Lỗ hổng RCE CVE-2026-19949 trong plugin All-in-One WP Migration

Đâ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-one

Nế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-one

Mộ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_html

Ba, 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/null

Bố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_html

Nế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.

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 *