Satu perintah seperti npm install bisa menarik puluhan hingga ratusan paket ke dalam proyek. Biasanya proses itu terasa aman karena paketnya populer, punya banyak unduhan, atau muncul di urutan teratas hasil pencarian. Padahal, popularitas bukan bukti bahwa sebuah dependensi cocok, terawat, atau bebas dari risiko.
Dependensi adalah komponen perangkat lunak pihak ketiga yang dipakai oleh aplikasi kita. Ia dapat membantu memproses tanggal, membaca berkas, membuat antarmuka, atau menghubungkan aplikasi dengan layanan lain. Masalahnya, dependensi tidak hanya membawa fungsi. Paket juga bisa menyertakan skrip instalasi, dependensi turunan, dan akses ke lingkungan build.
Karena itu, memilih paket open source sebaiknya diperlakukan seperti memilih komponen untuk masuk ke rumah: bukan berarti semua harus dicurigai, tetapi asal-usul dan kebutuhannya tetap perlu diperiksa.
Jangan hanya melihat jumlah unduhan
Jumlah unduhan adalah sinyal awal, bukan penilaian keamanan. Sebuah paket bisa populer tetapi sudah jarang dirawat. Sebaliknya, paket yang lebih kecil mungkin berasal dari organisasi yang jelas, memiliki proses rilis yang baik, dan dokumentasi yang lengkap.
Sebelum memasang paket, periksa beberapa hal berikut:
- Nama dan ruang lingkup paket. Pastikan nama paket benar-benar sesuai. Paket tiruan sering memakai nama yang mirip dengan proyek terkenal.
- Repositori sumber. Lihat apakah tautan ke GitHub atau platform lain tersedia dan masih aktif.
- Rilis terakhir. Paket yang lama tidak diperbarui belum tentu berbahaya, tetapi mungkin tidak lagi mendukung versi runtime atau perbaikan keamanan terbaru.
- Jumlah dependensi. Paket kecil yang menarik puluhan dependensi membawa area risiko lebih besar daripada paket yang melakukan hal sama dengan rantai dependensi yang lebih pendek.
- Lisensi. Pastikan lisensinya sesuai dengan cara proyek akan digunakan, terutama untuk aplikasi komersial.
Dokumentasi npm sendiri menyarankan pengguna mempertimbangkan informasi paket, termasuk provenance jika tersedia, ketika memilih paket untuk diunduh. Namun, informasi tersebut tetap perlu dibaca sebagai bahan audit, bukan sebagai stempel aman otomatis.
Periksa apa yang dijalankan saat instalasi
Salah satu bagian yang sering dilewatkan adalah skrip lifecycle. npm dapat menjalankan skrip tertentu ketika paket dipasang, diperbarui, atau dibangun. Skrip semacam ini berguna untuk mengompilasi modul native, tetapi juga berarti ada kode yang berjalan di mesin pengembang atau server build.
Untuk melihat isi paket sebelum memasangnya, gunakan pendekatan yang lebih hati-hati. Misalnya, unduh metadata atau lihat berkas package.json dari halaman registry dan repositorinya. Perhatikan bagian seperti:
{
"scripts": {
"preinstall": "...",
"install": "...",
"postinstall": "..."
}
}Kehadiran postinstall bukan bukti bahwa paket itu jahat. Banyak modul memakainya untuk kebutuhan yang sah. Yang perlu ditanyakan adalah: mengapa skrip itu dibutuhkan, apa yang dijalankannya, dan apakah proyek memang memerlukan paket tersebut?
Untuk proyek yang tidak membutuhkan skrip instalasi, tim dapat mengevaluasi opsi seperti npm install --ignore-scripts. Namun, opsi ini harus diuji karena beberapa paket memang bergantung pada skrip tersebut untuk menyelesaikan proses build. Keamanan yang baik tidak berhenti pada mematikan fitur; perubahan juga harus diuji agar tidak menciptakan kerusakan tersembunyi.
Gunakan lockfile dan versi yang dapat ditelusuri
File seperti package-lock.json, yarn.lock, atau pnpm-lock.yaml mencatat versi konkret dan sumber paket yang dipakai proyek. Tanpa lockfile, instalasi di laptop pengembang dan server CI dapat menghasilkan kombinasi versi yang berbeda.
Lockfile bukan jaminan bahwa semua kode aman. Fungsinya lebih sederhana dan penting: membuat hasil instalasi dapat diulang dan perubahan lebih mudah diperiksa. Jika sebuah dependensi berubah versi, perubahan itu terlihat dalam pull request, bukan muncul diam-diam saat deployment.
Untuk build otomatis, gunakan perintah yang menghormati lockfile, seperti npm ci pada proyek npm. Setelah itu, tinjau perubahan dependensi seperti meninjau perubahan kode biasa. Tanyakan apakah pembaruan tersebut memang diperlukan, apakah ada breaking change, dan apakah paket transitive—dependensi yang ditarik oleh paket lain—ikut berubah.
Provenance membantu menjawab “paket ini dibuat dari mana?”
Provenance adalah informasi yang menghubungkan paket yang diterbitkan dengan kode sumber, commit, dan proses build yang menghasilkan paket tersebut. npm menyediakan informasi provenance untuk paket tertentu dan menyediakan perintah npm audit signatures untuk memeriksa tanda tangan registry serta attestation yang tersedia.
Informasi ini berguna ketika kita ingin memastikan bahwa paket memang dibangun dari sumber yang dapat diperiksa dan diterbitkan oleh pihak yang berwenang. Tetapi ada batas penting: provenance tidak membuktikan bahwa isi paket bebas dari kode berbahaya. Ia membantu menjawab asal-usul dan proses pembuatannya, bukan menggantikan audit terhadap kode dan perilakunya.
Provenance menjawab “dibangun dari mana dan oleh siapa”, bukan “pasti aman untuk semua penggunaan”.
Tambahkan pemeriksaan otomatis di pull request
Pemeriksaan manual penting, tetapi mudah terlewat ketika tim sedang mengejar tenggat. Untuk proyek yang dikelola di GitHub, Dependency Review Action dapat memeriksa perubahan dependensi dalam pull request dan menolak perubahan berdasarkan tingkat keparahan kerentanan atau aturan lisensi.
Contoh alur sederhananya dapat diletakkan di .github/workflows/dependency-review.yml:
name: Dependency Review
on: [pull_request]
permissions:
contents: read
jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/dependency-review-action@v4
with:
fail-on-severity: highAngka versi action dan konfigurasi perlu disesuaikan dengan dokumentasi resmi serta kebijakan proyek. Tujuannya bukan memblokir semua pembaruan, melainkan membuat perubahan berisiko terlihat sebelum masuk ke branch utama.
Checklist praktis sebelum menambah paket
- Tulis alasan mengapa paket diperlukan dan fitur apa yang akan digantikannya.
- Pastikan nama paket, repositori, pemilik, dan dokumentasinya konsisten.
- Periksa rilis, issue terbuka, aktivitas pemeliharaan, serta lisensinya.
- Lihat skrip instalasi dan dependensi turunannya.
- Pasang versi yang tercatat dalam lockfile dan tinjau perubahan yang dihasilkan.
- Periksa provenance atau tanda tangan jika tersedia.
- Jalankan pemindaian kerentanan secara berkala, bukan hanya sekali saat instalasi.
- Hapus dependensi yang tidak lagi digunakan. Komponen yang tidak diperlukan tetap menambah beban pemeliharaan.
Apa artinya bagi kita?
Keamanan dependensi bukan alasan untuk berhenti memakai open source. Justru karena open source menjadi bagian penting dari hampir semua aplikasi modern, proses pemilihannya perlu dibuat lebih disiplin.
Untuk proyek pribadi, cukup mulai dari kebiasaan memeriksa repositori, membaca package.json, menggunakan lockfile, dan menghindari pemasangan paket hanya karena namanya mirip dengan rekomendasi internet. Untuk tim, tambahkan pemeriksaan otomatis di pull request dan tetapkan siapa yang bertanggung jawab meninjau pembaruan.
Tujuan akhirnya bukan membuat setiap pengembang menjadi auditor keamanan. Tujuannya adalah mengubah npm install dari tindakan refleks menjadi keputusan teknis yang memiliki alasan, jejak, dan batas risiko yang jelas.
Sumber & bacaan lebih lanjut
- npm Docs — Viewing package provenance
- npm Docs — Generating provenance statements
- npm Docs — Searching for and choosing packages to download
- GitHub Docs — Configuring the dependency review action
– Rio Yotto @rioyotto
