Hôm nay mình vừa thấy Patchstack đăng một advisory mới về plugin ConvertPlus — plugin tạo popup opt-in khá phổ biến. Bản 3.6.3 trở xuống dính lỗi PHP Object Injection với điểm CVSS 8.8, và điều đáng nói là kẻ tấn công chỉ cần quyền Subscriber, tức tài khoản đăng ký tự do thấp nhất trong WordPress. Trong bài này mình sẽ đi từ A đến Z: lỗi hoạt động ra sao, kiểm tra site bạn có dính không, vá thế nào và rà soát log xem đã bị khai thác chưa.
ConvertPlus Object Injection là lỗi gì và nguy hiểm thế nào?
Lỗi nằm ở nhóm Deserialization of untrusted data: plugin nhận dữ liệu serialized từ request rồi gọi unserialize() mà không kiểm tra. Kẻ tấn công gửi chuỗi crafted, biến nó thành đối tượng PHP bất kỳ — nếu server có sẵn class chứa magic method như __destruct() hay __wakeup() (gọi là POP chain), attacker có thể chạy lệnh hoặc leo thang quyền. Điểm CVSS 8.8 cùng cảnh báo “expected to become exploited” của Patchstack nghĩa là loại này thường bị đánh hàng loạt.
Vì sao quyền Subscriber lại là vấn đề lớn?
Nhiều chủ site nghĩ Subscriber vô hại — chỉ đọc bài mà thôi. Nhưng nếu Settings > General bật “Anyone can register”, bất kỳ ai cũng tự tạo được tài khoản Subscriber trong 30 giây. Kết hợp với lỗ hổng này, register xong là có mồi nổ ngay. Mình đã gặp không ít site tin tức, site bán hàng để mở đăng ký vì vài plugin member bị dụ dỗ, và đó chính là cửa vào. Lỗ hổng cần xác thực nhưng mức rào cản gần bằng không.
Kiểm tra site có đang chạy ConvertPlus bản lỗi không?
Bạn SSH vào server rồi chạy WP-CLI. Ở đây mình dùng path mẫu của thienlv.com, bạn thay bằng path riêng:
sudo -u www-data wp plugin list --path=/var/www/thienlv.com/public_html | grep -i convert
sudo -u www-data wp plugin get convertplug --path=/var/www/thienlv.com/public_html | grep -E "version|status"Nếu phiên bản nhỏ hơn hoặc bằng 3.6.3 và trạng thái active — site bạn đang nằm trong vùng nguy hiểm. Với site dùng plugin clone mail, popup từ theme marketplace (Flatsome, Avada hay bundle OLD theme), cũng nên gõ thử tên thư mục trong wp-content/plugins/ vì ConvertPlus hay bị đổi tên phân phối:
ls /var/www/thienlv.com/public_html/wp-content/plugins/ | grep -iE "convert|cp|smile"Cách vá ConvertPlus an toàn trong 4 bước?
Mình luôn vá theo quy trình có backup trước, dù patch chỉ là nâng cấp minor:
Bước 1 — Backup: dump database và nén thư mục web:
sudo -u www-data wp db export /tmp/backup-$(date +%F).sql --path=/var/www/thienlv.com/public_html
sudo tar -czf /tmp/wp-backup-$(date +%F).tar.gz /var/www/thienlv.com/public_htmlBước 2 — Cập nhật lên 3.6.4:
sudo -u www-data wp plugin update convertplug --path=/var/www/thienlv.com/public_htmlBước 3 — Xác nhận phiên bản mới:
sudo -u www-data wp plugin get convertplug --path=/var/www/thienlv.com/public_html | grep versionBước 4 — Kiểm tra popup còn hoạt động: mở trang chủ ở chế độ ẩn danh, xác nhận popup hiển thị đúng, submission vẫn vào danh sách subscriber.
Cách rà log xem đã bị khai thác chưa?
Object Injection thường đi qua admin-ajax hoặc REST với tham số chứa chuỗi serialized — dấu hiệu nhận biết là các mẫu O: (object notation) trong payload. Grep access log:
grep -iE "O:[0-9]+:" /var/log/nginx/thienlv.com.access.log | grep -iE "convert|cp_|admin-ajax|rest_route" | tail -50
grep -i "convertplus" /var/log/nginx/thienlv.com.access.log | awk '{print $1}' | sort | uniq -c | sort -rn | headĐồng thời xem có user mới đăng ký lạ không:
sudo -u www-data wp user list --path=/var/www/thienlv.com/public_html --fields=ID,user_login,roles,registered | sort -k4Nếu thấy chuỗi O:8:"stdClass" dài bất thường hoặc IP lạ POST liên tục vào endpoint của plugin trong vài ngày qua, nên coi như site đã bị xâm nhập: đổi mật khẩu admin, re-issue key và salt trong wp-config.php, quét file lạ.
Cách chặn tạm khi chưa vá được ngay?
Nếu bạn không thể update ngay (đang giao thời điểm deploy, sợ conflict), có hai lớp phòng thủ tạm. Thứ nhất, đóng cửa đăng ký tự do:
Vào Settings > General, bỏ chọn “Anyone can register” — mất nguồn cung ứng tài khoản Subscriber là đứt mồi nổ. Thứ hai, nếu dùng Nginx, chặn các request chứa dấu vết serialized vào endpoint plugin:
location ~* /wp-admin/admin-ajax.php {
if ($args ~* "O:[0-9]+:") { return 403; }
}Lưu ý rule này chỉ là băng dính, không thay thế việc update lên 3.6.4.
Bài học rút ra cho site WordPress của bạn?
Mình rút ra hai điều. Một, nhóm lỗi “Authenticated (Subscriber+)” không hề an toàn — bất kỳ plugin nào cho phép open registration kết hợp đều đáng ngồi lên đầu. Hai, plugin opt-in popup có mặt ở frontend, hook sâu vào AJAX của WordPress, nên bề mặt tấn công lớn hơn vẻ ngoài. Hãy rà định kỳ bằng WP-CLI và tắt hẳn “Anyone can register” nếu bạn không thật sự cần nó. Bạn có thể tham khảo thêm hướng dẫn phát hiện tấn công trong log A-Z và bài rà soát 358 lỗ hổng plugin bằng WP-CLI mà mình đã chia sẻ trước đó, cùng ca UpdraftPlus authentication bypass và lỗi CSRF Elementor 4.3.x để có quy trình xử lý đầy đủ.