ConvertPlus PHP Object Injection 3.6.3: Subscriber Cũng Nổ Được, Kiểm Tra Và Vá Ngay

Lỗi bảo mật ConvertPlus PHP Object Injection hiển thị trên màn hình laptop trong phòng server
Câu trả lời nhanh
ConvertPlus 3.6.3 trở xuống dính lỗi PHP Object Injection CVSS 8.8: kẻ tấn công chỉ cần quyền Subscriber gửi chuỗi serialized crafted để chạy POP chain, leo thang quyền hoặc thực thi lệnh. Kiểm tra bằng wp plugin get convertplug, backup rồi update lên 3.6.4, tắt Anyone can register, grep log tìm dấu O: trong request vào plugin và rà user đăng ký lạ.

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_html

Bướ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_html

Bướ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 version

Bướ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 -k4

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

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 *