Wordfence vừa công bố một lỗ hổng nghiêm trọng trong Tutor LMS, plugin tạo khóa học online đang chạy trên hơn 100.000 website WordPress. Bất kỳ ai có tài khoản Subscriber cũng có thể leo thang lên chạy lệnh tùy ý trên server của bạn qua kỹ thuật PHP Object Injection. Bản vá 4.0.8 đã ra mắt ngày 10/9, nhưng phần lớn site vẫn chưa cập nhật.
Điều đáng lo nhất với mình ở vụ này: Tutor LMS là plugin dạy học, nên hầu hết site bật đăng ký mở cho học viên. Nghĩa là kẻ tấn công chỉ cần tự đăng ký một tài khoản miễn phí trên trang khóa học của bạn là đã có đủ điều kiện khai thác. Trong bài này mình sẽ đi từ kiểm tra site có dính không, vá đúng cách, cho đến rà dấu vết tấn công trong database, tất cả bằng WP-CLI.
Tutor LMS bị lỗ hổng gì và nghiêm trọng đến đâu?
Lỗ hổng mang mã CVE-2026-78175, điểm CVSS 8.8 (High), ảnh hưởng đến toàn bộ phiên bản Tutor LMS từ 4.0.7 trở xuống. Nó nằm ở AJAX handler tutor_save_withdraw_account trong file classes/Withdraw.php, cho phép Subscriber trở lên thực hiện PHP Object Injection rồi leo thang thành Remote Code Execution.
Được phát hiện bởi Wordfence Argus, agent nghiên cứu AI của Wordfence, vào ngày 23/8/2026. Đội ngũ Themeum xác nhận ngày hôm sau và phát hành bản vá 4.0.8 ngày 10/9/2026, xử lý khá nhanh so với mặt bằng chung.
Vì sao tài khoản Subscriber miễn phí cũng khai thác được?
Đây là phần mình thấy hay nhất về mặt kỹ thuật. Handler tutor_save_withdraw_account chỉ được đăng ký qua hook wp_ajax_ (dành cho người đã đăng nhập) và chỉ kiểm tra nonce mà không hề kiểm tra capability. Nghiêm trọng hơn, nonce _tutor_nonce được xuất ra ở mọi trang frontend qua wp_localize_script.
Hệ quả: một Subscriber vào trang chủ, view source lấy nonce, gọi thẳng AJAX handler. So với handler anh em tutor_make_an_withdraw có kiểm tra is_instructor() thì handler này hoàn toàn trần trụi. Với site bật đăng ký học viên mở, kẻ tấn công đăng ký miễn phí rồi khai thác ngay trong vài phút.
Điểm nghẽn kỹ thuật nằm ở esc_sql và unserialize?
Chuỗi khai thác dựa trên một tương tác khá tối giữa lớp trừu tượng database của WordPress và engine serialization của PHP. Nói ngắn gọn cho bạn nào không làm technical: dữ liệu người dùng đi qua esc_sql() trước khi lưu vào user meta. Hàm này thay mọi ký tự % bằng một placeholder token dài 66 byte, nhưng khi đọc lại thì token bị thu về đúng 1 ký tự %.
Chênh lệch chiều dài 65 byte này khiến chuỗi serialize bị lệch: khai báo độ dài lớn hơn nội dung thực tế, và unserialize() đọc tràn sang vùng dữ liệu kẻ tấn công kiểm soát. Từ đó chèn vào một serialized object stream, kích hoạt POP chain GuzzleHttp\Cookie\FileCookieJar qua autoloader Composer của chính plugin, ghi file tùy ý lên server, tức RCE. Yêu cầu thêm điều kiện tính năng monetization được bật.
Cách kiểm tra site có đang chạy Tutor LMS lỗi không?
Bạn SSH vào server rồi chạy lệnh WP-CLI sau. Nhớ thay đường dẫn cho đúng với host của mình:
sudo -u www-data wp plugin list --path=/var/www/thienlv.com/public_html | grep tutor
sudo -u www-data wp plugin get tutor --path=/var/www/thienlv.com/public_html --fields=name,version,statusNếu version nhỏ hơn 4.0.8, site bạn đang nằm trong vùng nguy hiểm. Trường hợp không tìm thấy dòng nào có chữ tutor, site không cài plugin này và bạn có thể thở nhẹ. Tuy nhiên mình vẫn khuyên rà lại toàn bộ site đa lớp vì LMS plugin khác như LearnDash hay Sensei từng có vấn đề tương tự trong quá khứ.
Vá lỗi Tutor LMS đúng cách trong 5 phút?
Nâng cấp lên 4.0.8 trở lên là cách vá duy nhất. Trước khi nâng, bạn backup database, tắt cache rồi chạy:
sudo -u www-data wp db export backup-before-tutor.sql --path=/var/www/thienlv.com/public_html
sudo -u www-data wp plugin update tutor --version=4.0.8 --path=/var/www/thienlv.com/public_html
sudo -u www-data wp cache flush --path=/var/www/thienlv.com/public_htmlKhi nâng xong, quay lại xác nhận version hiển thị 4.0.8 hoặc mới hơn. Với ai dùng Wordfence Premium, Care hoặc Response thì rule firewall đã có sẵn từ 25/8. Bản miễn phí nhận rule sau 30 ngày, tức 24/9/2026, thêm một lý do để cập nhật plugin ngay hôm nay thay vì chờ firewall.
Rà dấu vết tấn công trong database bằng lệnh nào?
Kẻ tấn công ghi đè user meta _tutor_withdraw_method_data nên bạn có thể truy vết từng user bằng lệnh:
sudo -u www-data wp db query "SELECT user_id, meta_value FROM wp_usermeta WHERE meta_key='_tutor_withdraw_method_data';" --path=/var/www/thienlv.com/public_htmlMeta bất thường sẽ chứa chuỗi dài lê thê kỳ lạ hoặc tên class như GuzzleHttp. Ngoài ra kiểm tra các file PHP mới xuất hiện trong thư mục uploads và access log:
find /var/www/thienlv.com/public_html/wp-content/uploads -name "*.php" -mtime -30
grep "tutor_save_withdraw_account" /var/log/nginx/access.log | head -20Nếu thấy request POST đến admin-ajax.php với action tutor_save_withdraw_account từ tài khoản lạ, xem như có dấu hiệu khai thác thật. Lúc đó bạn đổi mật khẩu toàn bộ admin, thu hồi session bằng wp user session destroy, quét malware toàn site và cân nhắc xây lại từ backup sạch. Bài viết runbook rà soát lỗ hổng WordPress bằng WP-CLI của mình có checklist đầy đủ cho tình huống này.
Làm sao để vụ tương tự không lặp lại?
Vụ Tutor LMS lặp lại một bài học cũ: plugin có chức năng tài chính (rút tiền cho giảng viên) nhưng không kiểm tra quyền người gọi. Với người quản trị site, mình rút ra ba việc nên làm ngay. Một, tắt đăng ký mở khi không thực sự cần, hoặc đặt moderation cho tài khoản mới. Hai, đặt lịch wp plugin update --all --minor hằng tuần. Ba, giám sát user mới đăng ký bằng alert email.
Bạn cũng nên đọc thêm phân tích của mình về WordPress 7.1.2 vá path traversal CVSS 9.2 và vụ Everest Forms RCE đang bị khai thác thật để có bức tranh tổng thể về mùa lỗ hổng năm nay. Câu hỏi duy nhất bạn cần trả lời hôm nay: site mình chạy Tutor LMS phiên bản bao nhiêu?