Pendahuluan

CVE-2025–14533 merupakan salah satu kerentanan pada wordpress plugin ACF-Extended pada versi sebelum 0.9.2.2 yang dapat dimanfaatkan untuk melakukan privilege escalation. intinya user biasa atau visitor dapat melakukan registrasi akun administrator.

Reference-nya ada disini https://nvd.nist.gov/vuln/detail/CVE-2025-14533 dan pada deskripsi terdapat sedikit penjelasannya seperti berikut :

The Advanced Custom Fields: Extended plugin for WordPress is vulnerable to Privilege Escalation in all versions 
up to, and including, 0.9.2.1. This is due to the 'insert_user' function not restricting the roles 
with which a user can register. 
This makes it possible for unauthenticated attackers to supply the 'administrator' role during registration 
and gain administrator access to the site. 
Note: The vulnerability can only be exploited if 'role' is mapped to the custom field.

Score CVE ini berada pada 9.8 atau critical. Kedengarannya menarik, tapi apakah exploitable dan benar seperti yang ditulis pada deskripsi ?

Disini saya melakukan research dan mencoba menyelami source code pada plugin ini yang cukup lumayan kompleks dan menemukan beberapa hal yang menarik, jadi mari kita mulai.

Research Time

Pada mulanya saya tertarik untuk research berdasarkan referensi disini karena ada sekitar 100.000 website yang terdampak dan pada penjelasan di blog wordfence tersebut juga tidak membahas secara keseluruhan dan hanya sedikit detail teknis yang tidak cukup untuk dijadikan PoC jadi memutuskan untuk research secara mandiri.

Hal pertama yang dilakukan yaitu dengan mengikuti refrensi CVE pada link berikut :

https://plugins.trac.wordpress.org/browser/acf-extended/tags/0.9.2.1/includes/modules/form/module-form-action-user.php#L636

https://plugins.trac.wordpress.org/browser/acf-extended/tags/0.9.2.2/includes/fields/field-user-roles.php#L437

2 URL diatas merupakan website yang menyimpan codebase semua plugin/theme wordpress, yang pada website tersebut kita bisa melakukan diffing, tracking dan analysis jika terdapat suatu kerentanan pada plugin/theme wordpress.

Lanjut ke masalahnya. sebenarnya sinks terjadi pada function insert_user() di file module-form-action-user.php

None

Code tersebut akan memanggil fungsi core wordpress yaitu wp_insert_user(), yang digunakan untuk menambahkan akun wordpress tetapi agar exploit berhasil harus ada kondisi yaitu administrator melakukan setup form dan inisialisasi input roles.

Inisialisasi data user yang akan diregistrasi beserta rolenya ada pada function setup_action()

None

Dan disimpan pada variable $action['save'] kemudian dilakukan foreach pada fungsi insert_user() untuk dijadikan argument pada fungsi wp_insert_user().

Disini semua menjadi jelas, tapi bagaimana untuk trigger exploitnya ? memang bisa dikatakan CVE ini tergantung kondisi dan konfigurasi jadi bukan secara default yang bisa langsung dilakukan hit endpoint seperti kerentanan wordpress pada umumnya, melainkan harus di setup manual agar bisa dilakukan exploit.

Source/sumber kerentanan ada pada file module-form-shortcode.php

None

fungsi init memanggil add_shortcode() yang akan memanggil fungsi render_shortcode() kemudian mentrigger fungsi acfe_form().

Agar tidak bingung jadi saya akan membahas dulu fungsi add_shortcode() yang ada pada wordpress dan digunakan untuk membuat makro khusus, contohnya seperti berikut :

function custom_function() {
    return "Halo heker!!";
}


add_shortcode('greet', 'custom_function');

Kita membuat shortcode greet yang diisi dengan callback custom_function() dan untuk memanggilnya tinggal kita buat post atau page wordpress dan insert shortcode menggunakan format :

[greet]

dan halaman akan tampil sesuai dengan isi function yang dimasukan dan pada case kali ini outputnya yaitu Halo heker!!

Artinya disini, ketika plugin aktif, shortcode di instansiasi dan saat init wordpress jalan maka shortcode acfe_form akan di register/dibuat. setelah itu kapanpun ada konten, halaman atau post yang berisikan shortcode [acfe_form] maka akan memanggil fungsi render_form(). Kesimpulannya yaitu exploit hanya terjadi jika form di instansiasi oleh administrator beserta tambahan input rolesnya.

Exploit Time

Untuk exploitnya kita bisa setup manual formnya pada dashboard di menu ACF, sebelum itu kita perlu membuat fields group untuk dijadikan input

None

Pada menu ACF -> Field Group dan tambahkan 3 field untuk keperluan exploit agar berhasil. Kemudian masuk pada bagian ACF -> Forms -> New Form

None

Kita pilih field group dengan field yang sudah kita buat sebelumnya dan pada action kita bisa memilih Create user sesuai vulnerable code yang sudah kita analysis diatas

None

Kemudian setelah itu pilih dropdown dari field name yang sudah dibuat dan disini ada 3 field yaitu user, pass dan role

None

Disini shortcode berhasil dibuat, jadi langkah terakhir yaitu membuat post atau halaman dengan memasukan shortcode tersebut agar form di render

None

Dan seharusnya jika kita buka halaman post maka akan terdapat 3 form

None

Dan disini exploit bisa dilakukan untuk create user Administrator, seperti berikut

None

Jika kita debugging source codenya pada function setup_action di file module-form-action-user.php, kita bisa melihat isi dari variable $action yang akan dijadikan argument pada fungsi wp_insert_user()

None

Setelah di submit seharusnya user heker di registrasi sebagai Administrator, untuk konfirmasi kita bisa melihat pada bagian All Users

None

Lalu kita coba login dengan username dan password yang kita buat sebelumnya yaitu heker:heker

None

Pada akhirnya disini mengindikasikan jika exploit berhasil.

Kesimpulan

Kita sudah mencoba memahami kerentanan dan root cause pada CVE-2025–14533. Kerentanan ini tidak semenarik itu, karena untuk sampai pada tahapan exploitation perlu banyak kondisi dan terlebih lagi, form harus di buat secara manual dengan tambahan input roles, yang berarti tidak semua yang memakai plugin ini dengan versi rentan itu dapat dilakukan exploit. Terlebih angka 100.000 website yang terdampak menurut saya juga terlalu di lebih-lebihkan karena faktanya CVE ini sangat bergantung setup dan konfigurasi yang sangat tidak memungkinkan untuk dibuat mass Automation Tools yang valid untuk semua target. Apapun itu kita juga banyak belajar pada CVE ini dan mengerti behaviour secara internalnya yang mungkin suatu hari kita menemukan pattern code yang serupa dan terbentuk intuisi. Sekian, semoga bermanfaat.

"Hidup yang baik adalah hidup yang diinspirasi oleh cinta dan dipandu oleh ilmu pengetahuan." -Bertrand Russell