DEV Community

Cover image for Cara Mengamankan Dependensi NPM: Panduan Lengkap Keamanan Rantai Pasokan untuk Developer API
Walse
Walse

Posted on • Originally published at apidog.com

Cara Mengamankan Dependensi NPM: Panduan Lengkap Keamanan Rantai Pasokan untuk Developer API

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.

Coba Apidog hari ini

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Atau via CLI:

npm config set ignore-scripts true
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Opsi 2: Gunakan allowlist (npm 10+)

Buat .scriptsrc.json untuk whitelist paket yang diizinkan menjalankan skrip:

{
  "allowScripts": {
    "bcrypt": true,
    "sharp": true
  }
}
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

^ 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"
}
Enter fullscreen mode Exit fullscreen mode

Atur npm agar selalu menyimpan versi pasti:

# .npmrc
save-exact=true
save-prefix=''
Enter fullscreen mode Exit fullscreen mode

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"
  }
}
Enter fullscreen mode Exit fullscreen mode

Yarn:

{
  "resolutions": {
    "axios": "1.14.0"
  }
}
Enter fullscreen mode Exit fullscreen mode

pnpm:

{
  "pnpm": {
    "overrides": {
      "axios": "1.14.0"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 }}
Enter fullscreen mode Exit fullscreen mode

Tambahkan ke .npmrc:

provenance=true
Enter fullscreen mode Exit fullscreen mode

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

Socket Warning

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Snyk Scan

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

API Testing Workflow

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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=true di .npmrc.
  • Pin versi presisi dengan save-exact=true untuk cegah kejutan semver.
  • Verifikasi asal paket dengan npm audit signatures untuk 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)