Malware di dalam codebase bukan selalu berbentuk file mencurigakan bernama virus.php atau script yang terlihat jelas berbahaya. Dalam banyak kasus, malware disisipkan secara halus melalui dependensi, file hasil commit, konfigurasi server, plugin pihak ketiga, atau potongan kode yang tampak normal.
Karena itu, proses deteksi dan tracing malware di codebase perlu dilakukan secara sistematis. Tujuannya bukan hanya menemukan file berbahaya, tetapi juga memahami dari mana malware masuk, bagian mana yang terdampak, dan bagaimana mencegah infeksi ulang.
Artikel ini membahas langkah praktis untuk melakukan audit keamanan codebase, mulai dari pemeriksaan awal, pencarian pola mencurigakan, analisis dependensi, hingga mitigasi setelah malware ditemukan.
Mengapa Malware Bisa Masuk ke Codebase?
Sebelum melakukan tracing, penting untuk memahami jalur masuk malware. Dalam proyek aplikasi web, malware biasanya muncul karena beberapa penyebab berikut:
- Dependensi rentan, misalnya package NPM, Composer, plugin CMS, atau library pihak ketiga yang belum diperbarui.
- Kredensial bocor, seperti password database, API key, token Git, atau akses SSH yang tersimpan di repository.
- Upload file tanpa validasi, sehingga penyerang dapat mengunggah file berbahaya ke server.
- Backdoor lama yang pernah ditanam setelah insiden sebelumnya tetapi belum terhapus sepenuhnya.
- Commit mencurigakan dari akun developer yang terkena kompromi.
- Konfigurasi server lemah, seperti permission folder terlalu terbuka atau direktori sensitif dapat diakses publik.
Dengan memahami kemungkinan sumber masalah, proses investigasi akan lebih terarah dan tidak hanya berfokus pada “menghapus file mencurigakan”.
Tanda-Tanda Codebase Terinfeksi Malware
Malware sering kali meninggalkan jejak. Beberapa indikator yang perlu diperhatikan antara lain:
- Website tiba-tiba melakukan redirect ke domain asing.
- Muncul file baru yang tidak dikenal di folder project.
- Ada perubahan kode tanpa riwayat commit yang jelas.
- Performa website menurun drastis tanpa perubahan fitur besar.
- Google Search Console menampilkan peringatan keamanan.
- Server mengirim email spam secara otomatis.
- Terdapat script obfuscated, misalnya kode panjang yang sulit dibaca.
- Permission file atau folder berubah menjadi terlalu terbuka, seperti
777.
Jika salah satu tanda di atas muncul, segera lakukan audit menyeluruh. Jangan hanya menghapus file yang terlihat mencurigakan, karena malware sering memiliki mekanisme untuk membuat dirinya muncul kembali.
Langkah 1: Amankan Lingkungan Investigasi
Sebelum mulai melakukan tracing, pastikan proses investigasi dilakukan dengan aman. Hindari mengedit langsung di server produksi tanpa backup.
Checklist awal yang perlu dilakukan
- Buat backup penuh dari file dan database.
- Clone repository ke environment lokal atau staging.
- Batasi akses publik sementara jika website aktif menyebarkan malware.
- Catat waktu pertama kali masalah terdeteksi.
- Nonaktifkan sementara fitur upload, cron job, atau integrasi eksternal yang mencurigakan.
Contoh perintah untuk membuat arsip backup project:
tar -czvf backup-project-$(date +%F).tar.gz /path/to/project
Jika menggunakan Git, simpan kondisi saat ini ke branch khusus investigasi agar perubahan dapat dilacak dengan rapi:
git checkout -b investigation/malware-audit
git status
Langkah 2: Periksa Riwayat Perubahan dengan Git
Jika codebase menggunakan Git, riwayat commit adalah sumber informasi yang sangat penting. Anda bisa melihat file mana saja yang berubah sebelum insiden terjadi.
git log --oneline --decorate --all --graph
Untuk melihat file yang berubah dalam commit tertentu:
git show --stat COMMIT_ID
Untuk membandingkan perubahan antara dua commit:
git diff COMMIT_LAMA COMMIT_BARU
Hal yang perlu dicurigai dari riwayat Git
- Commit dari akun yang tidak biasa.
- Commit di luar jam kerja normal tanpa penjelasan.
- Perubahan pada file sensitif seperti
.env,config.php,wp-config.php, atau file autentikasi. - Penambahan file dengan nama menyerupai file sistem, misalnya
class-wp-cache.php,system.php, atauupdate.php. - Penambahan kode yang sulit dibaca atau sengaja dibuat obfuscated.

Langkah 3: Cari Pola Kode Mencurigakan
Malware sering menggunakan fungsi tertentu untuk menyembunyikan, menjalankan, atau mengambil kode dari sumber eksternal. Pencarian pola dapat membantu menemukan indikasi awal.
Untuk proyek PHP, Anda dapat mencari fungsi yang sering disalahgunakan:
grep -RIn --exclude-dir=vendor --exclude-dir=node_modules "eval\|base64_decode\|shell_exec\|system\|passthru\|exec" .
Untuk proyek JavaScript atau Node.js, cari penggunaan fungsi dan modul yang berisiko:
grep -RIn --exclude-dir=node_modules "eval\|Function(\|child_process\|require('http')\|require(\"http\")" .
Catatan penting: fungsi seperti eval atau base64_decode tidak selalu berarti malware. Namun, jika ditemukan di file yang tidak semestinya atau dikombinasikan dengan kode obfuscated, temuan tersebut perlu dianalisis lebih lanjut.
Contoh kode mencurigakan
Berikut contoh pola kode PHP yang perlu diwaspadai karena sulit dibaca dan berpotensi menjalankan payload tersembunyi:
<?php
$payload = "c29tZS1lbmNvZGVkLXBheWxvYWQ=";
eval(base64_decode($payload));
?>
Jika menemukan pola seperti ini, jangan langsung menjalankannya. Simpan sebagai bukti, analisis secara offline, lalu cari sumber masuknya.
Langkah 4: Audit Dependensi Project
Banyak serangan modern terjadi melalui supply chain attack, yaitu serangan yang masuk melalui package atau library pihak ketiga. Karena itu, audit dependensi wajib dilakukan.
Audit pada project Node.js
npm audit
npm audit fix
Untuk melihat package yang sudah usang:
npm outdated
Audit pada project PHP Composer
composer audit
composer outdated
Audit pada project Python
pip-audit
Jika ditemukan dependensi rentan, jangan asal memperbarui semuanya di production. Lakukan pembaruan di staging, jalankan testing, lalu deploy secara terkontrol.
Langkah 5: Periksa File yang Baru Dibuat atau Dimodifikasi
Jika Anda memiliki akses ke server, cari file yang berubah dalam rentang waktu tertentu. Ini membantu mempersempit area investigasi.
Contoh mencari file yang dimodifikasi dalam 7 hari terakhir:
find . -type f -mtime -7 -print
Contoh mencari file PHP yang baru berubah:
find . -type f -name "*.php" -mtime -7 -print
Periksa juga file tersembunyi:
find . -type f -name ".*" -print
Folder yang sering menjadi target
uploads/storage/cache/tmp/public/wp-content/pada WordPress
Folder upload sebaiknya tidak memiliki izin untuk mengeksekusi script. Jika aplikasi hanya menerima gambar, pastikan file seperti .php, .js, atau .html tidak dapat diunggah sembarangan.
Langkah 6: Cek Konfigurasi dan File Sensitif
Malware tidak selalu berbentuk script aktif. Kadang masalah berasal dari konfigurasi yang membuka akses terlalu luas.
File dan konfigurasi yang perlu dicek
.envdan file konfigurasi environment..htaccessatau konfigurasi Nginx.- File cron job.
- Konfigurasi CI/CD seperti GitHub Actions, GitLab CI, atau deployment script.
- Permission file dan folder.
- Daftar user admin di CMS atau panel server.
Contoh mencari file dengan permission terlalu terbuka:
find . -type f -perm 0777 -print
find . -type d -perm 0777 -print
Secara umum, file tidak perlu permission 777. Gunakan permission minimum sesuai kebutuhan aplikasi.
Langkah 7: Analisis Log Server
Log server membantu menjawab pertanyaan penting: kapan serangan terjadi, endpoint mana yang diserang, dan IP mana yang terlibat.
Contoh mencari request mencurigakan pada access log:
grep -Ei "wp-login|xmlrpc|upload|eval|base64|cmd|shell|php" access.log
Contoh melihat IP dengan jumlah request terbanyak:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
Indikator dari log yang perlu diperhatikan
- Request berulang ke endpoint login.
- Request ke file yang tidak ada sebelumnya.
- Upload file dengan ekstensi tidak wajar.
- Parameter URL yang berisi command, encoded string, atau path traversal.
- Lonjakan request dari IP yang sama dalam waktu singkat.

Langkah 8: Validasi dengan Scanner Keamanan
Scanner keamanan dapat membantu mempercepat proses deteksi, tetapi jangan mengandalkannya 100%. Hasil scanner tetap perlu divalidasi manual agar tidak terjadi false positive atau false negative.
Tools yang bisa digunakan
- ClamAV untuk scanning file umum di server.
- YARA untuk membuat rule deteksi pola malware.
- npm audit untuk proyek Node.js.
- composer audit untuk proyek PHP.
- GitHub Dependabot untuk monitoring dependensi.
- Snyk atau Semgrep untuk analisis keamanan kode.
Contoh scanning menggunakan ClamAV:
clamscan -r /path/to/project
Contoh menjalankan Semgrep dengan rules keamanan dasar:
semgrep --config auto .
Langkah 9: Bersihkan Malware dengan Aman
Setelah file atau kode berbahaya ditemukan, lakukan pembersihan secara hati-hati. Jangan hanya menghapus file tanpa memahami dampaknya.
Langkah pembersihan yang disarankan
- Bandingkan file terinfeksi dengan versi bersih dari repository.
- Hapus file yang tidak dikenal dan tidak memiliki fungsi valid.
- Rollback commit mencurigakan jika terbukti menjadi sumber masalah.
- Update dependensi rentan.
- Ganti seluruh password, token, API key, dan kredensial yang berpotensi bocor.
- Periksa database untuk kemungkinan script atau URL berbahaya.
- Deploy ulang dari source code bersih, bukan dari folder production yang sudah terinfeksi.
Jika menggunakan Git, Anda dapat mengembalikan file tertentu dari commit bersih:
git checkout COMMIT_BERSIH -- path/to/file.php
Namun, pastikan commit tersebut benar-benar belum terinfeksi.
Langkah 10: Cegah Infeksi Ulang
Bagian terpenting dari proses tracing malware adalah memastikan malware tidak kembali. Setelah pembersihan selesai, perkuat sistem keamanan aplikasi.
Best practice pencegahan
- Aktifkan autentikasi dua faktor untuk Git, hosting, CMS, dan panel server.
- Gunakan secret manager, jangan simpan kredens