Wordfence Threat Intelligence vừa bóc tách một mẫu malware rất đáng lưu ý: nó cài mình vào thư mục wp-content/mu-plugins dưới dạng must-use plugin, tự ẩn khỏi Dashboard, tự tạo tài khoản admin rồi giấu luôn tài khoản đó khỏi danh sách Users, và ẩn command channel của kẻ tấn công sau một smart contract trên chuỗi khối Ethereum. Trong bài này, mình sẽ đi từng bước: malware hoạt động ra sao, và quan trọng hơn, cách bạn kiểm tra site mình có bị dính hay không bằng WP-CLI và truy vấn trực tiếp database.
Must-use plugin là gì và vì sao malware thích chỗ này?

Must-use plugin (mu-plugin) là loại plugin đặc biệt nằm trong wp-content/mu-plugins. WordPress tự động load mọi file PHP trong thư mục này ở mỗi request, và bạn không thể deactivate chúng từ màn hình Plugins thông thường. Chính đặc tính “luôn chạy, không tắt được” này khiến mu-plugins trở thành vị trí lý tưởng cho malware lưu trú. Mẫu malware mà Wordfence phân tích còn khoác áo hợp pháp: giả làm công cụ “automated health check”, có tên tác giả nghe khả tín và link repository. Nguy hiểm hơn, nó xuất hiện dưới hơn 4.000 tên file khác nhau, trong đó nhiều tên rất giống file thật như advanced-cache.php, db.php hay functions.php của theme. Nói cách khác, đừng bao giờ tin metadata của plugin khi rà soát an ninh.
Malware này tự ẩn khỏi Dashboard như thế nào?
Nó hook filter show_advanced_plugins và tự xóa chính mình khỏi mảng $GLOBALS['plugins']['mustuse'] trước khi WordPress render trang. Kết quả: bạn vào màn hình Must-Use Plugins cũng không thấy nó. Ngoài ra chuỗi văn bản trong code không dùng eval(base64_decode()) kiểu cũ nữa mà dùng bảng chữ cái thay thế tự dựng: hai hàm có tên ngẫu nhiên, một hàm chứa bảng lookup mã hóa, một hàm giải mã ký tự tại thời điểm chạy. Các câu lệnh SQL còn được giấu bằng hex, ví dụ "\x55P\x44\x41\x54\x45" thực chất là UPDATE. Vì vậy các công cụ scan chỉ tìm pattern quen tên sẽ bỏ sót.
Tài khoản admin ảo được giấu bằng cách nào?
Đây là phần mình thấy tinh vi nhất. Malware đọc option bu để nhớ username mình đã tạo. Nếu chưa có, nó tạo tài khoản với prefix ngẫu nhiên như admin_, adm_, administrator_, backup_ cộng suffix 6 ký tự, gán role administrator, rồi lưu cả username lẫn mật khẩu plaintext vào hai option bu và bp. Sau đó nó hook ba filter để giấu tài khoản: pre_user_query chèn điều kiện AND user_login != '...' vào truy vấn danh sách Users, rest_user_query thêm username vào login__not_in để ẩn khỏi REST API, và views_users trừ đúng 1 khỏi số đếm “All” và “Administrator” cho khớp. Admin xem trang Users sẽ thấy danh sách sạch bong, tổng số cũng khớp. Cách duy nhất nhìn thấy nó là soi trực tiếp database.
Làm sao phát hiện malware mu-plugin trên site của bạn?
Bạn kiểm tra theo ba hướng: liệt kê file trong mu-plugins, truy vấn bảng wp_users trực tiếp từ database, và rà các option đáng ngờ. Vì Dashboard có thể bị chính malware làm mù, mọi lệnh dưới đây phải chạy từ server qua SSH. Với WP-CLI, mọi thứ chỉ mất vài phút.
Bước 1, liệt kê toàn bộ mu-plugins:
ls -la wp-content/mu-plugins/
# So sánh với những gì bạn/host chủ động cài.
# File lạ có tên kiểu advanced-cache.php nhưng bạn không dùng caching nào? Đáng ngờ.Bước 2, truy vấn users trực tiếp từ database, bỏ qua mọi filter của WordPress:
sudo -u www-data wp db query \
"SELECT ID, user_login, user_email, user_registered
FROM wp_users
WHERE user_login LIKE 'admin\_%'
OR user_login LIKE 'adm\_%'
OR user_login LIKE 'administrator\_%'
OR user_login LIKE 'backup\_%';" --path=/var/www/thienlv.com/public_htmlBước 3, kiểm tra các option đáng ngờ:
sudo -u www-data wp option get bu --path=/var/www/thienlv.com/public_html
sudo -u www-data wp option get bp --path=/var/www/thienlv.com/public_html
sudo -u www-data wp option get ic --path=/var/www/thienlv.com/public_htmlNếu bu trả về một username, bp trả về mật khẩu plaintext, thì gần như chắc chắn site bạn bị dính mẫu này. Option ic còn tệ hơn: nó là nơi malware lưu mật khẩu plaintext của các admin thật, vì nó hook filter authenticate để thu hoạch mật khẩu ngay tại lúc đăng nhập.
Tại sao xóa một file là không đủ?
Vì malware được thiết kế “self-healing” theo nhiều tầng. Xóa file mu-plugin nhưng quên xóa tài khoản admin ảo thì attacker vẫn đăng nhập được. Reset mật khẩu admin thật nhưng mật khẩu cũ đã bị lưu plaintext trong option ic và có thể đã bị exfiltrate. Còn command channel thì dùng kỹ thuật Etherhiding: địa chỉ server điều khiển được giấu trong dữ liệu của một smart contract trên Ethereum blockchain, nên kể cả khi bạn chặn một domain, attacker đổi dữ liệu trên chuỗi là kênh điều khiển sống lại. Kiểm tra database bằng SQL trực tiếp, như Bước 2 ở trên, là cách phòng thủ đáng tin cậy nhất vì nó không bị bất kỳ filter nào của WordPress chặn giữa đường.
Runbook dọn sạch nếu site bị nhiễm?
Mình tóm tắt lại thành checklist 15 phút. Thứ tự quan trọng, làm thiếu bước nào infection sẽ quay lại. Bạn có thể tham khảo thêm runbook rà soát bảo mật WordPress bằng WP-CLI mà mình từng chia sẻ để có bối cảnh rộng hơn.
- Xóa toàn bộ file lạ trong
wp-content/mu-plugins/, giữ lại những file host của bạn xác nhận. - Xóa tài khoản admin ảo:
sudo -u www-data wp user delete <username> --reassign=1 - Xóa option:
wp option delete bu,wp option delete bp,wp option delete ic - Reset mật khẩu mọi tài khoản administrator:
sudo -u www-data wp user update admin --prompt=user_pass - Đổi khóa bảo mật trong
wp-config.phpđể vô hiệu mọi session cũ: dùng API key Salt mới của WordPress.org. - Rà lại toàn bộ plugins và core đã cập nhật, ưu tiên vá các lỗi đang bị khai thác thật như mình từng ghi chú ở bài săn dấu vết CVE-2026-87902 trong log.
- Chạy scan toàn bộ file bằng Wordfence hoặc clamav, rồi theo dõi access log vài ngày để chắc chắn không còn kết nối ra ngoài lạ.
Bài học lớn nhất từ mẫu malware này là gì?
Theo mình, bài học nằm ở chỗ: mọi thứ bạn nhìn thấy trong Dashboard đều có thể bị giả mạo. Danh sách plugins, danh sách users, cả số đếm role — tất cả chỉ là kết quả của các filter mà malware hoàn toàn có thể hook vào. Vì thế quy trình kiểm tra an ninh nghiêm túc phải bao gồm truy vấn trực tiếp database và filesystem từ server, không chỉ tin vào giao diện. Một habit đơn giản: hằng tuần chạy đúng ba lệnh WP-CLI ở trên, mất chưa đến 2 phút, và bạn đã chặn được lớp malware ẩn mình tinh vi nhất hiện nay.
Nguồn: Wordfence — Inside a Malicious, Stealthy WordPress Must Use Plugin