Malware Must-Use Plugin Giấu Tài Khoản Admin Ảo Trong WordPress: Hướng Dẫn Kiểm Tra Bằng WP-CLI

Câu trả lời nhanh
Malware WordPress mới giả dạng must-use plugin, tự ẩn khỏi Dashboard, tạo tài khoản admin ảo rồi giấu nó khỏi danh sách Users và REST API, đồng thời thu hoạch mật khẩu plaintext của admin thật. Kiểm tra bằng ba lệnh WP-CLI: liệt kê wp-content/mu-plugins, truy vấn trực tiếp bảng wp_users theo prefix admin_, adm_, administrator_, backup_, và đọc option bu, bp, ic. Nếu có kết quả lạ, xóa file, xóa user ảo, xóa option rồi reset toàn bộ mật khẩu.

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?

Malware WordPress giấu tài khoản admin ảo qua must-use plugin

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_html

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

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

  1. 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.
  2. Xóa tài khoản admin ảo: sudo -u www-data wp user delete <username> --reassign=1
  3. Xóa option: wp option delete bu, wp option delete bp, wp option delete ic
  4. Reset mật khẩu mọi tài khoản administrator: sudo -u www-data wp user update admin --prompt=user_pass
  5. Đổ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.
  6. 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.
  7. 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

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 *