WordPress: Jutaan Situs Jebol via Plugin

Pekan lalu, jagat web development dibikin jantungan. Sekitar 1,2 juta situs WordPress terkena imbas serangan *supply chain* (rantai pasok) yang teramat sunyi. Hebatnya, para admin situs ini sebenarnya nggak melakukan kesalahan apa-apa. Mereka nggak pasang plugin bajakan, dan sistem mereka pun sudah *up-to-date*. Tapi, dari balik layar, sebuah skrip jahat diam-diam membuat akun admin bayangan dan menanam *backdoor*.

Ilustrasi keamanan web dan kerentanan pada sistem manajemen konten WordPress akibat serangan supply chain
Serangan rantai pasok membuktikan bahwa perimeter keamanan tradisional tak lagi cukup.

Jujur aja, ini *edan* banget. Insiden yang diungkap pertama kali oleh tim keamanan Sansec pada 13 Juni 2026 ini masuk lewat plugin-plugin terpercaya. Tiga nama besar yang terdampak adalah OptinMonster, TrustPulse, dan PushEngage—semuanya dikelola oleh satu perusahaan yang sama, yakni Awesome Motive. Buat kamu yang sering mainan *digital marketing*, pasti nggak asing dengan plugin ini yang biasa dipakai buat *pop-ups*, notifikasi *social proof*, dan *browser push messages*.

Bagaimana Bencana Ini Terjadi Tanpa Disadari?

Skema serangannya terbilang jenius sekaligus mengerikan. Alih-alih merusak *source code* plugin yang diinstal di server korban, si peretas justru mencegat dari sumbernya langsung: Content Delivery Network (CDN) milik vendor. Setiap plugin tadi butuh memuat *JavaScript SDK* dari CDN resmi vendor agar bisa jalan. Nah, SDK inilah yang diracun.

Kode jahat tersebut disisipkan tepat di akhir file SDK yang sudah di- *minify*. Hasilnya? Plugin tetap berfungsi normal. *Pop-up* diskon tetap muncul, notifikasi tetap jalan, dan pemilik situs melihat websitenya baik-baik saja. Namun, saat seorang Administrator yang sah *login* ke *dashboard* WordPress dan membuka halamannya, mimpi buruk itu dimulai.

Anatomi Payload: 5 Fase Eksekusi Senyap

Peneliti dari Patchstack membongkar sampel *payload* ini dan menemukan bahwa peretas mendesainnya dalam beberapa tahapan yang sangat hati-hati agar tidak memicu alarm keamanan.

1. Menghindari Deteksi (Anti-Bot)

Sebelum bereaksi, skrip akan memastikan ia tidak sedang diuji di dalam *sandbox* peneliti atau *crawler* otomatis. Ia mengecek keberadaan `navigator.webdriver`, penanda *headless browser* seperti `window._phantom` dan `window.__nightmare`, serta ukuran jendela *browser*. Ia juga mengecek jejak admin WordPress lewat *admin bar*, *path* `/wp-admin/`, dan keberadaan *cookie* `wordpress_logged_in_`. Jika yang mengakses bukan admin sungguhan, skrip ini akan pura-pura mati. Ia juga menaruh penanda di *browser* agar tidak mengeksekusi ulang di mesin yang sama selama 24 jam.

2. Membajak Otoritas Admin

Sistem keamanan WordPress sejatinya dilindungi oleh token sekali pakai yang disebut *nonce*. Skrip nakal ini memanen *nonce* valid langsung dari halaman yang sedang dibuka admin (dari `wpApiSettings`, `admin-ajax.php`, atau halaman pembuatan *user* baru). Bermodalkan *nonce* dan *login cookie* milik admin, skrip kini bisa mengirim *request* yang dianggap sah oleh server.

3. Membuat Akun Siluman

Membawa hak akses dewa, ia mencoba membuat akun admin baru melalui empat rute berbeda secara berurutan hingga salah satunya tembus:

  • Melalui REST API dengan POST ke `/wp-json/wp/v2/users`.
  • Submit form biasa via `/wp-admin/user-new.php`.
  • Pemanggilan AJAX ke `/wp-admin/admin-ajax.php`.
  • Memuat *iframe* berukuran 1x1 piksel yang tersembunyi untuk mengeksekusi pembuatan *user*.

Akun yang ditanam bernama `developer_api1` (dengan email `[email protected]`) atau nama acak berpola `dev_xxxxxx`. Gila-nya lagi, skrip ini membawa kamus kecil berisi pesan error "user already exists" dalam 20 bahasa berbeda untuk mendeteksi kesuksesan injeksi di berbagai lokalisasi WordPress!

4. Instalasi Backdoor

Sekarang punya akses pintu depan, peretas memasang pintu belakang (*backdoor*). Skrip mengunduh file ZIP dari server penyerang dan mengunggahnya sebagai plugin via `/wp-admin/update.php`. Agar tak mencolok, namanya disamarkan jadi "Content Delivery Helper" atau "Database Optimizer". Setelah aktif, plugin ini menghapus dirinya sendiri dari daftar plugin aktif, menyembunyikan *user* siluman dari *user list*, dan membungkam *activity log*. Sansec menemukan bahwa *backdoor* ini membuka *web shell* via parameter `?developer_api1_fm` (untuk perintah sistem) dan `?developer_api1_eval` (untuk eksekusi kode bebas).

5. Eksfiltrasi Data

Semua hasil eksploitasi kemudian disandikan menggunakan kunci XOR (`jX9kM2nP4qR6sT8v`) dan dikirim ke server komando `tidio.cc`. Agar tak terdeteksi *firewall*, lalu lintas ini dikamuflase dengan *path* ala Cloudflare seperti `/cdn-cgi/...`.

**Kenapa Firewall Susah Deteksi?** Karena secara jaringan, yang melakukan *request* jahat ini adalah *browser* milik Administrator yang sah! *Session* -nya asli, IP-nya asli, dan *nonce* -nya valid. Sang admin di sini murni sebagai korban pembajakan sesi.

Siapa Pelakunya dan Seberapa Parah Dampaknya?

Atribusi dalam dunia keamanan siber itu pelik. Server `tidio.cc` didaftarkan pada 28 April 2026 (sekitar enam minggu sebelum serangan) menggunakan layanan Ultrahost. Nama domainnya sengaja dibuat mirip dengan layanan *live chat* populer, Tidio, untuk mengelabui mata analis jaringan.

Log deteksi internal Patchstack menunjukkan betapa organiknya serangan ini: *request* nakal tercatat datang dari 81 alamat IP berbeda yang tersebar di 13 situs. Sekitar 60% di antaranya berasal dari perangkat *mobile*, menegaskan bahwa eksekusi benar-benar menunggangi koneksi internet rumah dan seluler milik admin asli yang sedang iseng mengecek web mereka. Durasi serangannya bervariasi; OptinMonster dan TrustPulse mendistribusikan kode beracun ini selama kurang lebih 25 menit pada 12 Juni, sementara PushEngage terus bocor hingga 14 Juni.

Pihak Awesome Motive menduga pintu masuk awal penyerang berasal dari eksploitasi celah keamanan (CVE-2026-10795) pada plugin UpdraftPlus yang kebetulan terpasang di situs *marketing* mereka. Dari sana, peretas berhasil mencuri API Key untuk mengotak-atik file SDK di CDN. Sansec belum bisa mengonfirmasi klaim UpdraftPlus ini secara independen, mengingat perusahaan ini juga menaungi raksasa lain seperti WPForms (6 juta *installs*), All in One SEO (3 juta), dan MonsterInsights (2 juta). Beruntung, ketiganya belum terdeteksi ikut menelan pil pahit ini.

Tren *supply chain* ini makin mengkhawatirkan. Dalam hitungan bulan di tahun yang sama, kita melihat kasus serupa: plugin yang dibeli dari Flippa (EssentialPlugin) ditanami *backdoor dorman* sejak 2025 dan baru diaktifkan bulan April, serta pembaruan beracun dari Smart Slider 3 Pro. Belum lagi kasus Polyfill di tahun 2024 yang domainnya berpindah tangan ke pihak bermasalah.

Mitigasi: Apa yang Harus Dilakukan?

Kalau kamu sempat *login* ke situs WordPress-mu (yang memakai OptinMonster, TrustPulse, atau PushEngage) antara tanggal 12 hingga 14 Juni 2026, asumsikan situsmu sudah *compromised*. Memperbarui CDN vendor saat ini tak akan menghapus *backdoor* yang sudah telanjur tertanam. Lakukan langkah forensik mandiri berikut:

  1. **Audit Akun Admin:** Cek database (bukan cuma dari menu WP Admin karena disembunyikan). Buang segera akun `developer_api1` atau yang berawalan `dev_xxxxxx`.
  2. **Inspeksi Filesystem:** Cek folder `wp-content/plugins/`. Cari direktori asing seperti `content-delivery-helper` atau `database-optimizer`. Grep/cari kode yang memuat `developer_api1_fm`, `developer_api1_eval`, dan kunci `jX9kM2nP4qR6sT8v`.
  3. **Gunakan Server-side Malware Scanner:** Jangan cuma andalkan plugin *security*. Pindai langsung dari level server.
  4. **Rotasi Kredensial Total:** Ganti semua *password* admin, *API keys*, kredensial database, serta segarkan *Security Keys & Salts* di dalam file `wp-config.php`.
  5. **Blokir Jalur Komunikasi:** Tambahkan aturan di tingkat jaringan atau DNS untuk memblokir trafik ke `tidio.cc`.

Tragedi ini jadi pengingat keras buat kita. Situs bisa saja ditambal rapat, diurus dengan standar keamanan militer, tapi tetap remuk karena mengimpor skrip "pihak ketiga" saat admin sedang *login*. Plugin yang kamu instal bukan satu-satunya ancaman; skrip eksternal yang dipanggil oleh plugin tersebut memegang kunci kehancuran yang setara.