ā” Jawaban Singkat / Key Takeaways: Memasang patch keamanan Jetpack tidak menjamin situsmu bersih. Penyerang sering meninggalkan leftover artifact berupa file PHP asing di folder uploads, user admin siluman, dan cron job tersembunyi yang tetap aktif meski plugin sudah diupdate. Skrip verifikasi post-patch dalam artikel ini mengecek tiga hal kritis dalam 3 detik: versi Jetpack terkini, artifact mencurigakan di struktur file, dan role user yang melanggar prinsip least-privilege. Jalankan sebelum klienmu dapat telepon panik.
Bayangkan skenario ini. Kamu freelance webmaster yang megang 15 situs klien. Notifikasi keamanan masuk: Jetpack rilis patch darurat buat CVE skor 9.8. Kamu langsung login satu per satu, klik update, dan merasa lega. Selesai.
Tiga hari kemudian klien telepon. Situsnya redirect ke web judi. Padahal patch sudah terpasang. Apa yang terlewat?
Realitanya, patch tidak menghapus kerusakan yang sudah terjadi. Patch cuma menutup lubang. Tapi kalau penyerang sudah masuk sebelum patch terpasang, mereka sudah menanam backdoor, membuat user admin tambahan, dan menyembunyikan script berbahaya di folder yang jarang kamu cek. Artikel ini ngasih kamu skrip PHP sederhana yang verifikasi semuanya dalam 3 detik, plus checklist hardening otomatis buat mencegah serangan susulan.
Kenapa Update Patch Saja Tidak Cukup
Kebanyakan freelance webmaster dan small agency owner berhenti di tahap “sudah diupdate.” Ini kesalahan fatal. Data dari Wordfence Threat Intelligence menunjukkan bahwa 62% situs WordPress yang terinfeksi tetap terinfeksi setelah plugin diupdate, karena penyerang sudah menanam persistent backdoor sebelum patch diaplikasikan.
Artifact yang biasa ditinggalkan penyerang setelah exploit Jetpack antara lain:
- File
.phpdengan nama acak di/wp-content/uploads/ wp-cron.phpyang dimodifikasi- User administrator tersembunyi dengan nama mirip plugin (misal:
jetpack_support) - Opsi di tabel
wp_optionsdengan prefix mencurigakan - Token Jetpack yang sudah bocor ke server remote
Kalau kamu cuma update plugin tanpa verifikasi, semua artifact itu tetap aktif. Makanya kamu butuh skrip verifikasi post-patch.

Skrip Verifikasi Post-Patch: 3 Cek Dalam 3 Detik
Skrip di bawah ini bisa kamu upload sebagai file verify-jetpack.php ke root WordPress, jalankan via browser, lalu langsung hapus setelah selesai. Jangan biarkan file ini stay di server karena dia baca data sensitif.
Cek #1: Konfirmasi Versi Jetpack
<?php
// verify-jetpack.php - Post-Patch Verification Script v1.0
// Jalankan via: https://situmu.com/verify-jetpack.php?token=RAHASIAKAMU
// HAPUS file ini setelah selesai!
define('WP_USE_THEMES', false);
require_once(__DIR__ . '/wp-load.php');
$secret_token = 'RAHASIAKAMU'; // Ganti dengan string random
if (!isset($_GET['token']) || $_GET['token'] !== $secret_token) {
header('HTTP/1.1 403 Forbidden');
die('Akses ditolak. Gunakan parameter ?token=');
}
echo "<h1>ā
Jetpack Post-Patch Verification</h1>";
echo "<pre>";
// === CEK 1: Versi Jetpack ===
echo "\nš¦ CEK 1: VERSI JETPACK\n";
echo str_repeat('-', 50) . "\n";
$jetpack_data = get_plugin_data(WP_PLUGIN_DIR . '/jetpack/jetpack.php');
$current_version = $jetpack_data['Version'];
echo "Versi terpasang: {$current_version}\n";
$api_response = wp_remote_get('https://api.wordpress.org/plugins/info/1.0/jetpack.json');
if (!is_wp_error($api_response)) {
$api_data = json_decode(wp_remote_retrieve_body($api_response));
$latest_version = $api_data->version;
echo "Versi terbaru API: {$latest_version}\n";
if (version_compare($current_version, $latest_version, '>=')) {
echo "ā
STATUS: Jetpack versi terbaru.\n";
} else {
echo "ā STATUS: Jetpack perlu update! Versi {$latest_version} tersedia.\n";
}
}
Ini langkah paling basic tapi sering dilewatin karena asumsi “kan sudah klik update.” Faktanya, update bisa gagal karena file permissions, konflik plugin cache, atau partial download. Verifikasi selalu.
Cek #2: Deteksi Leftover Artifact
// === CEK 2: LEFTOVER ARTIFACT ===
echo "\nš CEK 2: DETEKSI ARTIFACT MENCURIGAKAN\n";
echo str_repeat('-', 50) . "\n";
$suspicious_dirs = [
WP_CONTENT_DIR . '/uploads/',
WP_CONTENT_DIR . '/upgrade/',
ABSPATH . 'wp-includes/',
];
$suspicious_patterns = [
'/\.php$/', // PHP files di folder non-plugin
'/.*\.php\.[a-z0-9]+$/i', // double extension
'/^(?!index\.php$).*\.php$/',
];
$artifacts_found = [];
foreach ($suspicious_dirs as $dir) {
if (!is_dir($dir)) continue;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
if ($file->getExtension() !== 'php') continue;
$filename = $file->getFilename();
$filepath = $file->getPathname();
$modified = date('Y-m-d H:i:s', $file->getMTime());
// Skip known safe PHP files
$safe_files = ['index.php', 'wp-temp-upload.php'];
if (in_array($filename, $safe_files)) continue;
// Flag files yang modified dalam 7 hari terakhir
if ($file->getMTime() > strtotime('-7 days')) {
$artifacts_found[] = [
'path' => str_replace(ABSPATH, '', $filepath),
'name' => $filename,
'modified' => $modified,
];
}
}
}
if (count($artifacts_found) > 0) {
echo "ā STATUS: " . count($artifacts_found) . " artifact mencurigakan ditemukan!\n\n";
foreach ($artifacts_found as $art) {
echo " š {$art['path']}\n";
echo " Last modified: {$art['modified']}\n\n";
}
echo "ā ļø TINDAKAN: Investigasi setiap file. Kalau nggak dikenali, hapus!\n";
} else {
echo "ā
STATUS: Tidak ada artifact mencurigakan.\n";
}
Folder /wp-content/uploads/ adalah tempat favorit penyerang menanam shell. Kenapa? Karena folder ini writable dan jarang diinspeksi. Skrip ini otomatis memindai semua file PHP yang dimodifikasi dalam 7 hari terakhir di folder rawan.

Cek #3: Least-Privilege User Role Audit
// === CEK 3: LEAST-PRIVILEGE USER ROLE AUDIT ===
echo "\nš„ CEK 3: AUDIT USER ROLE DAN CAPABILITY\n";
echo str_repeat('-', 50) . "\n";
$users = get_users();
$flags_found = 0;
foreach ($users as $user) {
$caps = $user->get_role_caps();
$user_roles = implode(', ', $user->roles);
// Flag: Administrator yang nggak dikenal
if (in_array('administrator', $user->roles)) {
// Cek apakah user administrator aneh
$suspicious_admin_patterns = [
'jetpack', 'support', 'admin2', 'manager', 'root',
'test', 'wp_', 'backup', 'temp', 'sa', 'system'
];
foreach ($suspicious_admin_patterns as $pattern) {
if (stripos($user->user_login, $pattern) !== false) {
echo "šØ USER MENCURIGAKAN: {$user->user_login} (ID: {$user->ID})\n";
echo " Role: {$user_roles}\n";
echo " Email: {$user->user_email}\n";
echo " Registered: {$user->user_registered}\n\n";
$flags_found++;
break;
}
}
}
// Flag: User non-admin dengan capability admin
$dangerous_caps = ['manage_options', 'edit_themes', 'edit_plugins', 'update_core'];
foreach ($dangerous_caps as $cap) {
if (!in_array('administrator', $user->roles) && !empty($caps[$cap])) {
echo "ā ļø CAPABILITY BERLEBIH: {$user->user_login} ({$user_roles}) punya '{$cap}'\n";
$flags_found++;
}
}
}
if ($flags_found === 0) {
echo "ā
STATUS: Semua user role sesuai prinsip least-privilege.\n";
} else {
echo "\nā ļø TINDAKAN: Hapus user admin mencurigakan. Reset capability user non-admin.\n";
}
echo str_repeat('-', 50) . "\n";
echo "\nš Verifikasi selesai. HAPUS file ini dari server sekarang juga!\n";
echo "</pre>";
Cek ketiga ini adalah jurus yang paling sering bikin klien melongo. Banyak penyerang membuat user admin dengan nama mirip plugin yang sah, misalnya jetpack_support atau wp_backup_admin. Sekilas terlihat resmi, padahal itu backdoor. Skrip ini otomatis mendeteksi pola-pola itu dan ngasih peringatan.
Checklist Hardening Otomatis Pasca-Insiden
Setelah verifikasi selesai, jangan berhenti. Kamu perlu hardening tambahan biar kejadian serupa nggak terulang. Check ini adalah ekstensi dari skrip di atas yang bisa kamu jalankan sebagai rutinitas di semua situs klien.
1. Token Rotation: Mutasikan Semua Kunci Jetpack
Ini langkah yang paling sering diabaikan. Setelah insiden keamanan, token Jetpack wajib dirotasi. Penyerang mungkin sudah mengekspor XML-RPC token atau connection key ke server remote. Kalau token tidak dimutasi, mereka masih bisa berinteraksi dengan situsmu via Jetpack API meskipun plugin sudah diupdate. Baca detailnya di artikel Token Jetpack-mu Bocor? Ini 5 Layanan yang Diam-diam Nyimpen Kunci.
2. Disable File Editing via wp-config.php
// Tambahkan di wp-config.php
define('DISALLOW_FILE_EDIT', true);
Satu baris ini mematikan theme dan plugin editor di dashboard WordPress. Kalau penyerang berhasil login sebagai admin, mereka tetap nggak bisa inject malicious code via editor bawaan. Ini adalah defense-in-depth yang selalu gw rekomendasikan ke semua klien. Baca juga Satu Baris di wp-config.php yang Bikin Situsmu Tahan Bobol buat hardening tambahan.
3. Lock File Permissions
# Jalankan via SSH
find /path/to/wp -type d -exec chmod 755 {} \;
find /path/to/wp -type f -exec chmod 644 {} \;
chmod 440 wp-config.php
chmod 444 .htaccess
Banyak hosting shared menggunakan permission 777 untuk “mempermudah” user. Ini bencana. Permission 644 untuk file dan 755 untuk folder sudah cukup. wp-config.php cukup 440. Kalau hosting-mu minta 777, ganti hosting.
4. Monitor wp-cron.php Integrity
Penyerang sering menyisipkan kode di wp-cron.php karena file ini dieksekusi secara periodik. Simpan hash dari file ini dan cek secara berkala:
# Simpan hash setelah install bersih
sha256sum wp-cron.php > wp-cron.sha256
# Cek periodik
sha256sum -c wp-cron.sha256

Automasi: Bungkus Semua Jadi Satu Skrip Cron
Kalau kamu megang banyak situs, jangan verifikasi manual. Bungkus semua pengecekan di atas dalam satu skrip PHP yang dijalankan via cron tiap 24 jam. Ini kerangka dasarnya:
<?php
// hardening-check.php - Daily Automated Verification
// Tambahkan ke cron: 0 3 * * * php /path/to/hardening-check.php
define('ABSPATH', __DIR__ . '/');
require_once(ABSPATH . 'wp-load.php');
$alert_email = '[email protected]';
$alerts = [];
// 1. Jetpack version check
$jetpack = get_plugin_data(WP_PLUGIN_DIR . '/jetpack/jetpack.php');
if (version_compare($jetpack['Version'], JETPACK_REQUIRED_VERSION, '<')) {
$alerts[] = "Jetpack outdated: {$jetpack['Version']}";
}
// 2. Admin user count
$admin_count = count(get_users(['role' => 'administrator']));
if ($admin_count > EXPECTED_ADMIN_COUNT) {
$alerts[] = "Admin count abnormal: {$admin_count}";
}
// 3. File integrity check
$core_checksums = get_core_checksums($GLOBALS['wp_version'], 'id_ID');
foreach (['wp-cron.php', 'wp-login.php', 'xmlrpc.php'] as $file) {
$local_hash = md5_file(ABSPATH . $file);
if (isset($core_checksums[$file]) && $local_hash !== $core_checksums[$file]) {
$alerts[] = "File integrity failed: {$file}";
}
}
// Send alert
if (!empty($alerts)) {
$body = "Hardening Alert:\n\n" . implode("\n", $alerts);
wp_mail($alert_email, 'šØ Hardening Check Failed', $body);
}
Skrip ini berjalan otomatis jam 3 pagi. Kalau ada anomali, kamu dapat email. Kamu bisa tidur nyenyak sementara skrip yang jaga. Untuk hardening REST API dan XML-RPC yang lebih detail, baca Dua Fitur Bawaan WordPress Ini Jadi Celah Favorit Penyerang.
FAQ: Skrip Verifikasi Post-Patch Jetpack
Q: Apakah skrip ini aman dijalankan di production?
A: Ya, dengan syarat: Skrip hanya membaca data, tidak melakukan perubahan apapun. Pastikan kamu menggunakan token parameter di URL buat proteksi akses, dan hapus file verify-jetpack.php segera setelah selesai verifikasi. Jangan biarkan file ini stay di server.
Q: Gimana kalau ketemu file PHP mencurigakan di folder uploads?
A: Jangan langsung hapus. Backup dulu file tersebut untuk investigasi. Periksa isinya, catat timestamp dan owner. Setelah di-backup, hapus dari server. Lalu cek log server di sekitar timestamp file itu dibuat untuk memahami bagaimana penyerang masuk. Patch celah masuknya setelah ketemu.
Q: Berapa sering harus menjalankan verifikasi ini?
A: Untuk freelance webmaster, gw rekomendasi: (1) Setiap kali ada patch keamanan Jetpack atau plugin critical lain; (2) Minimal sebulan sekali sebagai rutinitas maintenance; (3) Otomatis via cron harian untuk situs high-traffic atau yang pernah kena serangan sebelumnya.
Q: Apakah CVE Jetpack terbaru sudah difix dengan cara ini?
A: Patch resmi dari Jetpack menutup celah eksploitasi. Tapi skrip verifikasi ini melindungi dari efek samping yang tersisa pasca-patch. Dua hal berbeda yang harus dikerjakan bersamaan. Selalu cek WPScan Vulnerability Database untuk daftar CVE terbaru terkait Jetpack.
Jangan Tunggu Situsmu Jadi Korban Berikutnya
Freelance webmaster dan small agency owner sering terjebak dalam siklus reaktif: ada insiden, panik, perbaiki, lupa, insiden lagi. Skrip verifikasi post-patch ini ngasih kamu satu proactive layer yang bisa dijalankan dalam 3 detik.
Ingat, penyerang cuma butuh satu celah yang nggak terverifikasi. Jangan kasih mereka kesempatan itu. Simpan artikel ini, salin skripnya, dan masukkan ke rutinitas maintenance semua situs klienmu mulai hari ini.
Kalau kamu punya pertanyaan tentang hardening WordPress atau pengalaman pasca-patch yang ingin dibagikan, langsung aja tulis di kolom komentar. Atau subscribe newsletter di bawah buat dapetin script keamanan WordPress langsung ke inbox-mu, setiap minggu.



