Intisari (TL;DR)
Serangan rantai pasok NPM meningkat menjadi lebih dari 3.000 paket berbahaya pada tahun 2024 saja, dan kompromi Axios pada Maret 2026 membuktikan bahwa bahkan paket top-10 pun tidak aman. Panduan ini membahas setiap lapisan pertahanan yang wajib diterapkan pengembang API: penegakan lockfile, pemblokiran skrip postinstall, verifikasi asal, alat analisis perilaku, dan pilihan arsitektur untuk memperkecil permukaan serangan Anda.
Pendahuluan
Serangan rantai pasok Axios pada 31 Maret 2026 bukanlah kompromi npm pertama—dan jelas bukan yang terakhir. Namun dengan 83 juta unduhan mingguan dan RAT lintas platform yang tersebar hanya lewat 1 maintainer yang dibajak, ini jadi alarm keras bagi seluruh ekosistem JavaScript.
Inilah perbedaannya dari saran “perbarui dependensi Anda” biasa: serangan Axios menembus semua pertahanan konvensional. Kode berbahaya tidak ada di Axios utama, tapi disuntikkan lewat dependensi hantu yang memicu hook postinstall. Lockfile gagal jika Anda install di saat jendela serangan terbuka. Penentuan versi juga sia-sia jika Anda belum mem-pinnya.
Pengembang API sangat rentan. Skrip pengujian, pipeline CI/CD, server mock, dan klien HTTP semuanya mengandalkan npm. Satu paket yang disusupi bisa membocorkan API key, kredensial database, dan token cloud dari mesin development Anda.
💡 Apidog mengeliminasi satu vektor serangan utama dengan menyediakan klien HTTP bawaan untuk pengujian API, sehingga Anda tak perlu Axios, node-fetch, atau got dalam toolchain pengujian. Unduh Apidog gratis untuk mengurangi permukaan dependensi npm sambil menerapkan strategi pertahanan di bawah.
Panduan ini membedah tujuh lapisan perlindungan, mulai dari hygiene lockfile dasar hingga analisis perilaku tingkat lanjut.
Lapisan 1: Penegakan Lockfile
Mengapa Lockfile Penting
Lockfile mencatat versi pasti setiap paket dan dependensi transitif saat instalasi. Tanpa lockfile, npm install akan mengambil versi terbaru dalam rentang semver Anda. Misal, jika package.json Anda mendeklarasikan "axios": "^1.14.0" dan versi 1.14.1 di registry ternyata berbahaya, maka versi itulah yang akan terinstal.
Aturan-aturan
Selalu commit lockfile Anda. Baik itu package-lock.json (npm), yarn.lock (Yarn), pnpm-lock.yaml (pnpm), maupun bun.lock (Bun)—semua harus masuk version control.
Gunakan instalasi beku di CI/CD. Hindari npm install di lingkungan otomatis. Terapkan mode frozen lockfile:
# npm
npm ci
# yarn
yarn install --frozen-lockfile
# pnpm
pnpm install --frozen-lockfile
# bun
bun install --frozen-lockfile
npm ci menghapus node_modules dan meng-install hanya dari lockfile. Jika lockfile tidak sinkron dengan package.json, proses akan gagal—menghindari resolusi yang tidak diinginkan.
Review diff lockfile di pull request. Setiap PR yang mengubah package-lock.json wajib ditinjau: apakah ada dependensi baru, kenaikan versi, perubahan registry, dsb. Gunakan alat seperti Socket.dev untuk mendeteksi anomali lockfile pada PR.
Celah Lockfile
Lockfile melindungi dari resolusi tak terduga, tapi tidak dari instalasi pertama. Jika Anda menambah dependensi atau menginisialisasi proyek saat jendela serangan, versi berbahaya justru terkunci. Karena itu, lockfile hanyalah Lapisan 1—bukan satu-satunya garis pertahanan.
Lapisan 2: Nonaktifkan Skrip Postinstall
Vektor Serangan Utama
Serangan Axios, ua-parser-js, event-stream, dan puluhan kasus lain menggunakan mekanisme sama: skrip postinstall yang mengeksekusi kode arbitrary saat npm install. Hook ini berjalan sebelum aplikasi Anda start, sebelum Anda sempat review kode, bahkan sebelum alat keamanan runtime bisa aktif.
Blokir Skrip Secara Global
Tambahkan ke .npmrc Anda:
ignore-scripts=true
Atau via CLI:
npm config set ignore-scripts true
Semua skrip lifecycle (preinstall, install, postinstall, prepare) akan diblokir selama instalasi.
Tangani Paket yang Membutuhkan Skrip
Beberapa paket (misal: bcrypt, sharp, sqlite3) butuh postinstall untuk kompilasi native. Solusinya:
Opsi 1: Jalankan skrip selektif setelah instalasi
npm ci --ignore-scripts
npm rebuild bcrypt sharp
Opsi 2: Gunakan allowlist (npm 10+)
Buat .scriptsrc.json untuk whitelist paket yang diizinkan menjalankan skrip:
{
"allowScripts": {
"bcrypt": true,
"sharp": true
}
}
Opsi 3: Cari prebuilt binaries
Banyak paket kini menyediakan prebuilt binary. Contohnya, sharp sudah mengirimkan prebuilt untuk mayoritas platform, sehingga postinstall seringkali tak diperlukan. Audit dependensi Anda—mungkin pengecualian skrip bisa diminimalkan.
Peringatan PackageGate
Januari 2026, peneliti mengungkapkan enam zero-day "PackageGate" yang memengaruhi npm, pnpm, vlt, dan Bun. Salah satunya: dependensi Git dapat membawa file konfigurasi yang mengeksekusi kode walau lifecycle scripts sudah dinonaktifkan. Jika Anda memakai dependency via URL Git, jangan hanya mengandalkan ignore-scripts. Pin ke hash commit tertentu dan audit isi repo-nya.
Lapisan 3: Tentukan Versi Pasti
Stop Gunakan Rentang Semver
Default npm install --save menambah dependensi dengan awalan caret:
{
"axios": "^1.14.0"
}
^ artinya: semua versi 1.x.x terbaru. Saat serangan Axios, ini berarti Anda dapat 1.14.1 yang berbahaya.
Set versinya secara pasti:
{
"axios": "1.14.0"
}
Atur npm agar selalu menyimpan versi pasti:
# .npmrc
save-exact=true
save-prefix=''
Gunakan Override untuk Dependensi Transitif
Dependensi Anda punya dependensi sendiri (transitif). Jika mereka disusupi, mem-pin direct dependency saja tidak cukup. Gunakan override:
{
"overrides": {
"axios": "1.14.0",
"plain-crypto-js": "npm:empty-npm-package@1.0.0"
}
}
Yarn:
{
"resolutions": {
"axios": "1.14.0"
}
}
pnpm:
{
"pnpm": {
"overrides": {
"axios": "1.14.0"
}
}
}
Kompromi
Penentuan versi tepat artinya Anda tidak dapat patch otomatis. Update dilakukan manual—ada overhead, tapi trade-off ini krusial untuk proyek sensitif keamanan.
Lapisan 4: Verifikasi Asal Paket
Apa Itu Provenance
Atestasi asal npm menghubungkan paket ke sumber dan lingkungan build via tanda tangan Sigstore yang dicatat di ledger publik. Paket yang diterbitkan dari pipeline CI/CD dengan asal aktif membawa bukti:
- Repo sumbernya
- Sistem CI/CD pembangun
- Hash commit build
Cara Memeriksa Provenance
npm audit signatures
Ini memverifikasi apakah paket yang Anda install memiliki atestasi asal valid. Paket yang diupload manual dari mesin dev tidak akan punya asal.
Versi Axios berbahaya tidak punya OIDC binding, tidak ada commit GitHub terkait. Jika pemeriksaan asal dilakukan otomatis, serangan ini langsung terdeteksi.
Aktifkan Provenance untuk Paket Anda
Jika Anda publish paket npm, aktifkan asal di CI/CD:
# Contoh GitHub Actions
- uses: actions/setup-node@v4
with:
node-version: 20
registry-url: https://registry.npmjs.org
- run: npm publish --provenance
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Tambahkan ke .npmrc:
provenance=true
Keterbatasan
Asal bersifat opt-in. Mayoritas paket npm belum memilikinya. Provenance hanya membuktikan di mana sebuah paket dibangun; pipeline CI/CD yang disusupi tetap dapat publish paket berbahaya dengan asal valid.
Lapisan 5: Gunakan Alat Analisis Perilaku
Melampaui Pemindaian Kerentanan
Alat seperti npm audit dan Snyk hanya memeriksa CVE yang diketahui. Zero-day seperti kompromi Axios lolos dari CVE. Analisis perilaku mendeteksi apa yang dilakukan paket, bukan apa yang sudah dilaporkan.
Socket.dev
Socket menganalisis perilaku paket saat install dan runtime. Deteksi meliputi:
- Permintaan jaringan pada saat install
- Akses filesystem di luar direktori paket
- Eksekusi shell command
- Pengumpulan env vars
- Kode obfuscated
Terintegrasi dengan GitHub, Socket otomatis mengomentari PR jika ada dependensi baru dengan perilaku mencurigakan. Dependensi plain-crypto-js pada serangan Axios akan memicu peringatan: kode obfuscated, network request saat postinstall, penulisan file di luar direktori paket.
# Install Socket CLI
npm install -g @socketsecurity/cli
# Scan proyek Anda
socket scan
Snyk
Snyk menyediakan pemindaian kerentanan, skor risiko, dan rekomendasi perbaikan. Sangat kuat untuk CVE, tapi tidak untuk zero-day perilaku.
# Install Snyk CLI
npm install -g snyk
# Uji proyek Anda
snyk test
Pendekatan Berlapis
Gunakan keduanya. Socket untuk anomali perilaku, Snyk untuk kerentanan yang diketahui, dan npm audit sebagai baseline:
# Dasar
npm audit
# Analisis perilaku
socket scan
# Manajemen kerentanan
snyk test
Jalankan di CI/CD. Temuan kritis harus memblokir build.
Lapisan 6: Minimalkan Permukaan Dependensi
Audit Pohon Dependensi Anda
Setiap paket di node_modules = keputusan kepercayaan. Rata-rata proyek Node.js punya ratusan dependensi transitif. Setiap dependensi = vektor serangan.
Audit:
# Hitung total dependensi
npm ls --all | wc -l
# Cek duplikat
npm ls --all | sort | uniq -c | sort -rn | head -20
Evaluasi setiap dependensi:
-
Apakah sudah tersedia native di Node.js? Node.js 18+ sudah punya
fetch,crypto,URL,FormData, dsb. - Apakah dependensi ini menarik banyak sub-dependensi? Satu paket dengan 50 sub-dep memperluas permukaan serangan.
- Bisakah Anda melakukan vendor? Untuk utilitas kecil, copy saja source-nya ke repo Anda.
Alternatif Native untuk Paket Umum
| Paket | Alternatif Native | Tersedia Sejak |
|---|---|---|
| axios, node-fetch, got |
fetch (global) |
Node.js 18 |
| uuid | crypto.randomUUID() |
Node.js 19 |
| dotenv |
--env-file flag |
Node.js 20.6 |
| chalk | util.styleText() |
Node.js 21.7 |
| glob | fs.glob() |
Node.js 22 |
| path-to-regexp | Native URL pattern API | Node.js 23 |
Khusus untuk Pengujian API
Pengujian API biasanya butuh klien HTTP, assertion library, test runner, dan mock server. Semua itu = permukaan serangan tambahan.
Apidog menggantikan semua komponen itu:
- Klien HTTP: Built-in, tanpa npm dependency
- Assertion: Visual, assertion terintegrasi
- Test runner: Otomatis, integrasi CI/CD via CLI Apidog
- Mock server: Mock dinamis tanpa Express/third-party
- Dokumentasi: Auto-generated dari spesifikasi API
Migrasi ke Apidog = menghilangkan puluhan dependensi npm dari infrastruktur testing Anda. Sedikit dependensi, sedikit vektor serangan.
Coba Apidog gratis untuk konsolidasi stack pengujian API Anda.
Lapisan 7: Pemantauan Jaringan & Runtime
Blokir Domain Berbahaya
Setelah serangan supply chain, blokir domain C2 pada layer jaringan:
# Tambah ke /etc/hosts
echo "0.0.0.0 sfrclak.com" | sudo tee -a /etc/hosts
Di CI/CD, batasi outgoing network hanya ke registry npm, git host, dan target deploy. Defaultnya: blokir semua kecuali whitelist.
StepSecurity Harden-Runner untuk CI/CD
StepSecurity Harden-Runner memonitor workflow GitHub Actions secara real time. Dropper Axios terdeteksi menghubungi C2 dalam 1,1 detik setelah npm install. Fitur:
- Monitoring jaringan keluar untuk GitHub Actions
- Tracking eksekusi proses
- Monitoring integritas file
- Auto-alert untuk anomali
# GitHub Actions
- uses: step-security/harden-runner@v2
with:
egress-policy: audit # atau 'block' untuk mode ketat
Pemantauan Proses Runtime
Di mesin dev, pertimbangkan EDR (endpoint detection & response) yang menandai proses anak mencurigakan dari Node.js. RAT Axios menjalankan osascript (macOS), cscript (Windows), dan python3 (Linux) dari proses npm install. Pola ini bisa dideteksi.
Konfigurasi .npmrc yang Direkomendasikan
Berikut contoh .npmrc hardening yang menggabungkan lapisan di atas:
# Pin versi pasti
save-exact=true
save-prefix=
# Nonaktifkan skrip lifecycle
ignore-scripts=true
# Aktifkan provenance untuk publish
provenance=true
# Pakai registry resmi
registry=https://registry.npmjs.org/
# Wajibkan 2FA untuk publish
auth-type=web
# Batas minimal audit
audit-level=moderate
Commit file ini ke repo agar semua anggota tim pakai pengaturan keamanan yang sama.
Contoh Pipeline Keamanan CI/CD
Berikut pipeline GitHub Actions yang menerapkan 7 lapisan:
name: Secure Build
on: [push, pull_request]
jobs:
security-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: step-security/harden-runner@v2
with:
egress-policy: audit
- uses: actions/setup-node@v4
with:
node-version: 22
# Lapisan 1+2: Lockfile beku, tanpa skrip
- run: npm ci --ignore-scripts
# Lapisan 3: Verifikasi tidak ada versi yang tidak terduga
- run: npm ls --all > deps.txt
# Lapisan 4: Periksa provenance
- run: npm audit signatures
# Lapisan 5: Analisis perilaku
- run: npx socket scan
# Lapisan 5: Pemindaian kerentanan
- run: npx snyk test
# Lapisan 1: Audit dasar
- run: npm audit --audit-level=moderate
# Bangun ulang hanya dep native yang diizinkan
- run: npm rebuild sharp bcrypt
Apa Selanjutnya untuk Keamanan NPM
Provenance Wajib untuk Paket Populer
npm sedang menimbang persyaratan atestasi asal untuk paket dengan unduhan tinggi. Ini mencegah publish manual via token yang membuka celah seperti serangan Axios.
Persetujuan Rilis Dua Orang
Seperti transaksi keuangan, paket dengan unduhan besar dapat diwajibkan persetujuan dua maintainer sebelum publish. Satu akun disusupi sudah tidak cukup lagi.
Pembatasan Izin Runtime
Deno sudah membatasi akses runtime (network, filesystem, env vars) kecuali diizinkan eksplisit. Node.js sedang menjajaki model serupa. Nanti, skrip postinstall harus meminta izin eksplisit untuk network/file access.
Konvergensi Model Package Manager
pnpm sudah mengisolasi dependency tree dengan strictness tinggi—hanya dependency yang dideklarasikan yang bisa diakses paket. Jika npm mengadopsi hal serupa, permukaan serangan semakin mengecil.
FAQ
Apa itu serangan rantai pasokan di npm?
Serangan supply chain npm menarget rantai dependensi software, bukan aplikasi Anda langsung. Penyerang bisa membajak akun maintainer, menyuntikkan kode berbahaya ke paket populer, atau menerbitkan typosquat. Saat Anda install atau update dependency, kode itu dieksekusi di mesin/dev pipeline Anda—bisa mencuri kredensial atau membuka backdoor.
Apakah npm audit cukup untuk melindungi dari serangan rantai pasokan?
Tidak. npm audit hanya cek CVE yang sudah diketahui. Zero-day seperti kompromi Axios tidak terdaftar di CVE saat terjadi. Anda butuh alat analisis perilaku seperti Socket.dev yang mengecek apa yang dilakukan paket. Gunakan npm audit sebagai baseline, jangan jadi satu-satunya pertahanan.
Haruskah saya berhenti menggunakan npm sama sekali?
Tidak. npm tetap ekosistem paket terbesar, mayoritas paketnya aman. Tujuan Anda: minimalkan paparan lewat penentuan versi presisi, lockfile enforcement, pemblokiran skrip, dan minimalisasi dependency. Evaluasi tiap dependency, dan utamakan alternatif native jika bisa.
Bagaimana Apidog membantu mengurangi risiko rantai pasokan npm?
Apidog menyediakan klien HTTP, test runner, mock server, dan generator dokumentasi built-in untuk pengembangan API. Dengan demikian, Anda tak butuh paket npm seperti Axios, node-fetch, Jest, Express (untuk mock), dan dependency testing lain. Lebih sedikit dependensi, makin kecil vektor serangan di workflow pengembangan API Anda.
Apa itu provenance paket di npm?
Provenance paket memakai Sigstore untuk menghubungkan paket ke repositori sumber dan lingkungan build CI/CD secara kriptografis. Ini membuktikan di mana dan bagaimana paket dibangun. Anda bisa verifikasi provenance dengan npm audit signatures. Paket yang upload manual dari mesin dev tidak punya provenance—red flag untuk paket populer.
Berapa banyak paket npm yang berbahaya?
Snyk mengidentifikasi >3.000 paket npm berbahaya tahun 2024. Q4 2025, Sonatype memblokir 120.612 serangan malware di npm, PyPI, dan registry lain. Sebagian besar typosquat dengan unduhan rendah, tapi kompromi profil tinggi seperti Axios membuktikan paket populer juga rentan.
Apa itu kerentanan PackageGate?
PackageGate adalah 6 zero-day yang diungkap Januari 2026, memengaruhi npm, pnpm, vlt, dan Bun. Salah satunya: dependency via Git bisa membawa konfigurasi yang mengeksekusi kode walau lifecycle scripts off. Artinya, ignore-scripts saja tidak cukup jika dependency Anda mengarah ke repo Git; pin ke hash commit tertentu.
Poin-poin Penting
- Penegakan lockfile adalah fondasi, tapi tidak melindungi dari instalasi pertama di jendela serangan.
- Nonaktifkan skrip postinstall global dengan
ignore-scripts=truedi.npmrc. - Pin versi presisi dengan
save-exact=trueuntuk cegah kejutan semver. - Verifikasi asal paket dengan
npm audit signaturesuntuk mendeteksi upload manual. - Layer Socket.dev (analisis perilaku), Snyk (CVE), dan
npm audit(dasar). - Kurangi dependency dengan memakai API native Node.js & platform terintegrasi seperti Apidog.
- Monitor network oubound CI/CD dengan StepSecurity Harden-Runner.
Setiap dependency adalah keputusan kepercayaan. Sedikit dependency = permukaan serangan lebih kecil. Semakin banyak lapisan verifikasi, makin sulit penyerang menyusup. Implementasikan defense in depth, bukan sekadar checklist.



Top comments (0)