Vào ngày 21/8/2026, Patchstack đăng tải một phân tích mà mình nghĩ mọi admin WordPress chạy plugin SSO đều nên đọc chậm rãi. Câu chuyện này không chỉ về hai lỗ hổng nghiêm trọng CVSS 9.8 trong plugin miniOrange SAML 2.0 Single Sign On, mà về một điều đáng sợ hơn: các site chạy bản trả tiền bị lỗ hổng nhưng không một vulnerability database nào trên đời báo là đang nguy hiểm, và dashboard WordPress cũng không hiện bất kỳ bản update nào. Mình sẽ giải thích tại sao lại có chuyện ngược đời như vậy, và hướng dẫn từng bước để bạn tự kiểm tra site của mình.
Vụ việc miniOrange SAML SSO này là gì?

Hai lỗ hổng bypass xác thực không cần đăng nhập, mang số hiệu CVE-2026-61979 và CVE-2026-15981, cho phép kẻ tấn công giả mạo SAML assertion và đăng nhập vào wp-admin với tư cách bất kỳ user nào, kể cả administrator. Cả hai đều được chấm CVSS 9.8 — mức nghiêm trọng nhất. Điều đáng lo là đã có dấu hiệu khai thác thật ngoài thực tế, kẻ tấn công quét đại vào mọi endpoint của plugin mà không cần biết bạn chạy edition nào. DigitalOcean phát hiện ra vụ này nhờ một phiên đăng nhập admin bất thường từ ngoài mạng tin cậy, bị chặn bởi lớp phòng thủ bên trong chứ không phải bởi plugin.
Một slug nhưng bảy edition khác nhau nghĩa là thế nào?
Đây chính là gốc rễ của mọi rắc rối. Trên WordPress.org, plugin này chỉ có một slug duy nhất: miniorange-saml-20-single-sign-on. Nhưng bên trong slug đó, nhà cung cấp phân phối bảy dòng sản phẩm độc lập với bảng phiên bản riêng: Free, Premium, Standard, Premium/Enterprise multisite, Enterprise/All-Inclusive, VIP single site và VIP multisite. Không dòng nào dùng chung số phiên bản với dòng nào.
Hệ quả là gì? Bản advisory công khai chỉ viết cho bản Free, lỗi tới 5.4.4 và vá ở 5.4.5. Mọi site chạy bản trả tiền đều có số phiên bản cao hơn 5.4.5 — nên mọi database đều kết luận “đã vá rồi”. Trong khi thực tế, bản Standard 16.1.9 vẫn dính cả hai lỗi và phải lên 17.0.6. Một mẩu tin ghi một slug một dải phiên bản không thể nào đúng cho bảy dòng phiên bản cùng lúc. Sáu bản trả tiền được vá âm thầm, không changelog, không advisory.
Bạn đang chạy edition nào và phiên bản nào?
Bảng tra cứu dưới đây là thứ mà trước 21/8 chưa từng được công bố ở đâu. Bạn đối chiếu edition và phiên bản đang chạy của mình vào đây, chú ý hai cột “dính lỗi tới” và “đã vá từ”:
| Edition | Dính lỗi tới | Đã vá từ |
|---|---|---|
| Free (single site) | 5.4.4 | 5.4.5 |
| Premium (single site) | 13.0.3 | 13.0.4 |
| Standard (single site) | 17.0.5 | 17.0.6 |
| Premium/Enterprise/All-Inclusive (multisite) | 20.2.7 | 20.2.8 |
| Enterprise/All-Inclusive (single site) | 26.0.2 | 26.0.3 |
| VIP (single site) | 32.0.7 | 32.0.8 |
| VIP (multisite) | 35.0.6 | 35.0.7 |
Để xem phiên bản đang chạy, bạn vào Plugins trong wp-admin, hoặc dùng WP-CLI cho nhanh:
sudo -u www-data wp plugin list --path=/var/www/yoursite/public_html | grep miniorangeNhớ rằng con số phiên bản đứng một mình không nói lên bạn đang ở edition nào. Free trải 3.x đến 5.x, Premium 11.x đến 13.x, Standard 15.x đến 17.x. Nếu bạn có license, hãy tra email mua hàng hoặc trang tài khoản miniOrange để biết chính xác edition.
Tại sao dashboard không hiện bản update?
Đây là phần khiến mình thấy ớn lạnh nhất. Nếu bạn đang chạy bản 16.x dính lỗi, mục Updates trong wp-admin sẽ không hiển thị bất kỳ bản cập nhật nào, dù bản vá 17.0.6 tồn tại ngay trên dòng sản phẩm bạn đang có license. Cơ chế update thông thường của WordPress không thực hiện cú nhảy xuyên dòng phiên bản kiểu này. Nghĩa là: bạn không biết mình dính lỗi, database không báo, và đường nâng cấp tự động cũng bị tắc. Cách duy nhất là tải bản vá về và upload thủ công qua Plugins > Add New > Upload Plugin.
Khai thác diễn ra như thế nào?
Hai lỗi đều tinh vi nhưng cơ chế lại dễ hiểu. Lỗi CVE-2026-61979 là signature algorithm confusion: plugin cho phép SAML response tự chọn thuật toán ký, kẻ tấn công chọn HMAC-SHA1 rồi dùng chính khóa công khai RSA của IdP làm HMAC secret. Khóa công khai thì ai cũng lấy được — lấy từ metadata endpoint của Identity Provider, ký assertion giả, và plugin xác nhận là thật.
Lỗi CVE-2026-15981 còn ngắn gọn hơn: hàm openssl_verify() của PHP trả về 1 nếu chữ ký hợp lệ, 0 nếu sai, và -1 nếu chính OpenSSL gặp lỗi nội bộ. Plugin kiểm tra kết quả theo kiểu boolean, mà trong PHP thì -1 là truthy. Chữ ký lỗi thời làm OpenSSL treo lỗi sẽ được chấp nhận như chữ ký hợp lệ. Một dòng code lỏng lẻo, một admin session trao tay kẻ xa lạ.
Nếu chưa update được ngay thì vá tạm thế nào?
DigitalOcean chia sẻ hai hotfix hẹp, rủi ro tương thích gần như bằng không, dùng để mua thời gian khi bạn chưa kịp upload bản vá chính thức. Với lỗi algorithm confusion, thêm ngay sau dòng 246 trong file Utilities.php:
if ( XMLSecurityKey::HMAC_SHA1 === $MG ) {
printf( 'HMAC SAML signatures are not supported.' );
exit;
}Với lỗi OpenSSL tri-state, thay câu lệnh return tại dòng 494 của file includes/lib/SAML2Core/XMLSecurityKey.php bằng:
return openssl_verify( $ql, $hl, $this->key, $MG ) === 1;Lưu ý đây chỉ là giải pháp tạm, thay cho việc vá không được. Bản vá đầy đủ của vendor mới xử lý tận gốc: chỉ cho phép danh sách thuật toán RSA, chặn hẳn đường recast khóa công khai. Kể cả khi bạn đã vá, hãy rà access log tìm các request bất thường tới endpoint SSO của plugin từ những IP lạ — dấu hiệu quét tự động đã xuất hiện từ nhiều nước.
Bài học cho cả hệ sinh thái plugin WordPress?
Mình rút ra ba điều. Thứ nhất, đừng bao giờ tin tuyệt đối vào tín hiệu “không có update” trong dashboard — nó chỉ đúng khi vendor phát hành đúng quy trình, mà trường hợp này thì không. Thứ hai, với plugin SSO giữ chìa khóa đăng nhập toàn bộ hệ thống, hãy ưu tiên vendor có security disclosure minh bạch; patch âm thầm sáu dòng sản phẩm là hành vi không thể chấp nhận. Thứ ba, defense-in-depth thực sự cứu DigitalOcean trong vụ này: admin panel bị khóa sau mạng tin cậy khiến attacker cầm session cũng không vào được. Một lớp WAF hoặc giới hạn IP truy cập wp-admin là khoản đầu tư xứng đáng, mình đã từng phân tích điều này trong bài về kiểm tra secure hosting WordPress.
Nếu bạn quản lý nhiều site khách hàng, hãy rà ngay hôm nay bằng lệnh WP-CLI ở trên — đặc biệt với các enterprise đang dùng edition Standard trở lên, vì đây là nhóm bị blind spot nặng nhất. Vấn đề “một slug nhiều edition” chắc chắn không riêng gì miniOrange, và mình sẽ cập nhật khi có thêm phân tích tương tự. Trường hợp Kirki CVE-2026-8206 mà mình viết trước đây cũng là lời nhắc rằng lỗi admin takeover có thể nằm ở plugin rất phổ thông, còn danh sách các CVE plugin cần chú ý khác bạn xem thêm tại bài viết về CVE-2026-57807.