Permukaan Serangan yang Sesungguhnya
Aplikasi Node biasa dengan lima puluh dependensi langsung sering menarik lebih dari seribu paket transitif. Setiap paket itu menjalankan kode dengan hak yang sama seperti aplikasi Anda, dan setiap pemeliharanya adalah pihak yang Anda percayai secara implisit.
Lockfile Bukan Formalitas
# Menghormati lockfile — dipakai di CI dan produksi npm ci pnpm install --frozen-lockfile yarn install --immutable pip install -r requirements.txt --require-hashes # Boleh memperbarui lockfile — hanya untuk pengembangan lokal npm install
npm install di pipeline membuat build tidak dapat diulangPerintah itu boleh memutakhirkan paket sesuai rentang versi di package.json, sehingga build hari ini dapat memuat kode yang berbeda dari build kemarin tanpa satu pun perubahan pada repositori. Bila sebuah paket diambil alih dan dirilis versi jahat dalam rentang yang diizinkan, pipeline menariknya secara otomatis. Gunakan npm ci yang menolak berjalan bila lockfile tidak sinkron.
Skrip Instalasi Berjalan Otomatis
npm ci --ignore-scripts # jangan jalankan postinstall # Bila beberapa paket memang membutuhkannya, izinkan selektif npm ci --ignore-scripts npm rebuild sharp bcrypt
Skrip postinstall berjalan dengan hak pengguna yang memasang paket, sebelum satu baris pun kode Anda dieksekusi. Di mesin CI, hak itu sering mencakup akses ke token registry, kredensial cloud, dan seluruh kode sumber.
Kebingungan Dependensi
Bila perusahaan memakai paket internal bernama @perusahaan/util tetapi lingkupnya tidak terdaftar di registry publik, penyerang dapat menerbitkan nama yang sama di npm dengan versi jauh lebih tinggi. Alat pengelola paket yang mencari ke beberapa registry sering memilih versi tertinggi — dan menarik paket penyerang. Serangan ini terbukti berhasil menembus banyak perusahaan besar.
# .npmrc — kunci lingkup ke registry internal
@perusahaan:registry=https://npm.internal.perusahaan.id/
//npm.internal.perusahaan.id/:_authToken=${TOKEN_NPM}
Memindai Kerentanan
npm audit --production pip-audit govulncheck ./... trivy fs --severity HIGH,CRITICAL . trivy image aplikasi:terbaru
Banyak CVE berada di paket yang tidak pernah dipanggil, atau pada jalur kode yang tidak dapat dijangkau aplikasi Anda. Memblokir semuanya menghasilkan kelelahan peringatan, dan tim mulai melewati pemeriksaan secara rutin — termasuk yang sungguh penting. Blokir pada tingkat kritis dan tinggi yang benar-benar dapat dijangkau, dan tangani sisanya lewat proses pemutakhiran berkala.
SBOM
syft aplikasi:terbaru -o cyclonedx-json > sbom.json grype sbom:sbom.json
Daftar komponen ini menjawab pertanyaan yang muncul setiap kali kerentanan besar diumumkan: apakah kita memakainya, di layanan mana, versi berapa? Tanpa SBOM, jawabannya membutuhkan penelusuran manual berhari-hari — tepat ketika waktu paling berharga.
Menyematkan Versi Aksi CI
# Rentan — tag dapat dipindahkan ke commit lain - uses: actions/checkout@v4 # Aman — SHA tidak dapat diubah - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
Tag Git dapat dipindahkan oleh siapa pun yang menguasai repositori aksi tersebut. Menyematkan SHA commit memastikan kode yang berjalan di pipeline persis yang pernah ditinjau.
Sebelum Menambahkan Dependensi Baru
Kapan rilis terakhir? paket terbengkalai tidak menerima perbaikan Berapa pemelihara aktifnya? satu orang berarti satu titik kegagalan Berapa dependensi transitifnya? satu paket dapat membawa ratusan Apakah cukup ditulis sendiri? utilitas puluhan baris sering lebih murah dibuat