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

Ashley Innocent

Ashley Innocent

1 April 2026

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

Apidog untuk Perusahaan

Penerapan On-Premises

SSO & RBAC

Sesuai SOC 2

Jelajahi Apidog Enterprise

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 mencakup setiap lapisan pertahanan yang dibutuhkan pengembang API: penegakan lockfile, pemblokiran skrip postinstall, verifikasi asal, alat analisis perilaku, dan pilihan arsitektur yang memperkecil permukaan serangan Anda.

Pendahuluan

Serangan rantai pasok Axios pada 31 Maret 2026, bukanlah kompromi npm yang pertama. Ini juga bukan yang terakhir. Namun dengan 83 juta unduhan mingguan dan RAT lintas platform yang disebarkan melalui satu akun maintainer yang dibajak, ini adalah panggilan bangun paling keras yang pernah diterima ekosistem JavaScript.

Berikut adalah apa yang membuat ini berbeda dari saran biasa "perbarui dependensi Anda": serangan Axios melewati setiap pertahanan tradisional. Kode berbahaya tidak ada di Axios itu sendiri. Itu disuntikkan melalui dependensi hantu yang memicu hook postinstall. Lockfile tidak membantu jika Anda menjalankan npm install selama jendela serangan. Penentuan versi tidak membantu jika Anda belum menentukan versi.

Pengembang API sangat rentan. Skrip pengujian, pipeline CI/CD, server tiruan (mock server), dan klien HTTP Anda semuanya menarik dari npm. Satu paket yang disusupi dalam toolchain Anda dapat membocorkan kunci API, kredensial basis data, dan token cloud dari mesin pengembangan Anda.

💡
Apidog menghilangkan satu vektor serangan utama dengan menyediakan klien HTTP bawaan untuk pengujian API, jadi Anda tidak memerlukan Axios, node-fetch, atau got dalam tumpukan pengujian Anda. Unduh Apidog gratis untuk mengurangi permukaan dependensi npm Anda sambil mengikuti strategi pertahanan di bawah ini.
button

Panduan ini mencakup tujuh lapisan perlindungan, mulai dari kebersihan lockfile dasar hingga analisis perilaku tingkat lanjut.

Lapisan 1: Penegakan Lockfile

Mengapa Lockfile Penting

Lockfile mencatat versi pasti dari setiap paket dan dependensi transitif pada saat instalasi. Tanpa lockfile, npm install akan menyelesaikan versi terbaru yang cocok dengan rentang semver Anda. Jika package.json Anda mengatakan "axios": "^1.14.0" dan ada 1.14.1 berbahaya di registry, Anda akan mendapatkan versi berbahaya tersebut.

Aturan-aturan

Selalu komit lockfile Anda. Baik itu package-lock.json (npm), yarn.lock (Yarn), pnpm-lock.yaml (pnpm), atau bun.lock (Bun), semuanya harus ada di kontrol versi.

Gunakan instalasi beku di CI/CD. Jangan pernah menjalankan npm install di lingkungan otomatis. Gunakan lockfile beku yang setara:

# npm
npm ci

# yarn
yarn install --frozen-lockfile

# pnpm
pnpm install --frozen-lockfile

# bun
bun install --frozen-lockfile

npm ci menghapus node_modules dan menginstal secara ketat dari lockfile. Jika lockfile tidak cocok dengan package.json, maka akan gagal. Ini mencegah kejutan resolusi.

Tinjau perbedaan lockfile di pull request. Ketika sebuah PR memodifikasi package-lock.json, periksa apa yang berubah. Dependensi baru, kenaikan versi, dan perubahan URL registry semuanya patut dicermati. Alat otomatis seperti Socket.dev dapat menandai perubahan lockfile yang mencurigakan dalam ulasan PR.

Celah Lockfile

Lockfile melindungi dari resolusi versi yang tidak terduga, tetapi tidak melindungi dari instalasi pertama. Jika Anda menginisialisasi proyek atau menambahkan dependensi baru selama jendela serangan, versi berbahaya akan terkunci. Inilah mengapa lockfile adalah Lapisan 1, bukan satu-satunya lapisan.

Lapisan 2: Nonaktifkan Skrip Postinstall

Vektor Serangan Utama

Serangan Axios, serangan ua-parser-js, serangan event-stream, dan lusinan serangan lainnya semuanya menggunakan mekanisme yang sama: skrip postinstall yang menjalankan kode arbitrer selama npm install. Hook ini dieksekusi sebelum kode aplikasi Anda berjalan, sebelum Anda meninjau paket, dan sebelum alat keamanan runtime dapat campur tangan.

Blokir Skrip Secara Global

Tambahkan ke .npmrc Anda:

ignore-scripts=true

Atau setel melalui CLI:

npm config set ignore-scripts true

Ini mencegah semua skrip siklus hidup (preinstall, install, postinstall, prepare) berjalan selama instalasi paket.

Tangani Paket yang Membutuhkan Skrip

Beberapa paket memerlukan skrip postinstall untuk kompilasi native (seperti bcrypt, sharp, atau sqlite3). Anda memiliki dua pilihan:

Pilihan 1: Jalankan skrip secara selektif setelah instalasi

npm ci --ignore-scripts
npm rebuild bcrypt sharp

Pilihan 2: Gunakan daftar izin (npm 10+)

Buat .scriptsrc.json yang hanya mengizinkan paket terpercaya untuk menjalankan skrip:

{
  "allowScripts": {
    "bcrypt": true,
    "sharp": true
  }
}

Pilihan 3: Gunakan biner yang sudah dibangun sebelumnya

Banyak paket yang sebelumnya membutuhkan kompilasi native sekarang menawarkan biner yang sudah dibangun sebelumnya. sharp, misalnya, mengirimkan biner yang sudah dibangun sebelumnya untuk sebagian besar platform, menghilangkan kebutuhan untuk kompilasi postinstall. Periksa dependensi Anda; Anda mungkin memerlukan lebih sedikit pengecualian skrip daripada yang Anda kira.

Peringatan PackageGate

Pada Januari 2026, para peneliti mengungkapkan enam kerentanan zero-day yang disebut "PackageGate" yang memengaruhi npm, pnpm, vlt, dan Bun. Salah satu temuan: Dependensi berbasis Git dapat membawa file konfigurasi yang memungkinkan eksekusi kode bahkan ketika skrip siklus hidup dinonaktifkan. Jika package.json Anda mereferensikan URL Git untuk dependensi, ignore-scripts saja tidak cukup. Tentukan dependensi tersebut ke hash komit tertentu dan audit isi repositori.

Lapisan 3: Tentukan Versi Pasti

Berhenti Menggunakan Rentang Semver

Perilaku default dari npm install --save menambahkan paket dengan awalan caret:

{
  "axios": "^1.14.0"
}

Tanda ^ berarti "kompatibel dengan 1.14.0," yang akan menyelesaikan ke versi 1.x.x terbaru. Selama serangan Axios, ini berarti menyelesaikan ke 1.14.1.

Tentukan versi pasti sebagai gantinya:

{
  "axios": "1.14.0"
}

Konfigurasi npm untuk menyimpan versi pasti secara default:

# .npmrc
save-exact=true
save-prefix=''

Gunakan Override untuk Dependensi Transisi

Dependensi langsung Anda memiliki dependensi mereka sendiri. Jika dependensi transisi disusupi, menentukan dependensi langsung Anda tidak membantu. Gunakan override untuk mengontrol resolusi transisi:

{
  "overrides": {
    "axios": "1.14.0",
    "plain-crypto-js": "npm:empty-npm-package@1.0.0"
  }
}

Untuk Yarn:

{
  "resolutions": {
    "axios": "1.14.0"
  }
}

Untuk pnpm:

{
  "pnpm": {
    "overrides": {
      "axios": "1.14.0"
    }
  }
}

Kompromi

Penentuan versi yang tepat berarti Anda tidak mendapatkan pembaruan patch otomatis. Anda perlu memperbarui versi secara manual, yang menciptakan biaya pemeliharaan. Kompromi ini disengaja: Anda memilih pembaruan yang terkontrol daripada yang otomatis. Untuk proyek yang sensitif terhadap keamanan, kompromi ini sepadan.

Lapisan 4: Verifikasi Asal Paket

Apa Arti Asal (Provenance)

Atasitas asal npm menghubungkan paket yang diterbitkan ke kode sumber dan lingkungan build-nya menggunakan tanda tangan Sigstore yang dicatat dalam buku besar transparansi publik. Ketika sebuah paket diterbitkan dari pipeline CI/CD dengan asal diaktifkan, paket tersebut mencakup bukti kriptografi tentang:

Cara Memeriksa Asal

npm audit signatures

Ini memverifikasi bahwa paket yang diinstal memiliki atestasi asal yang valid. Paket yang diterbitkan secara manual dari mesin pengembang tidak akan memiliki asal.

Versi Axios yang berbahaya tidak memiliki pengikatan asal OIDC dan tidak memiliki komit GitHub yang sesuai. Jika pemeriksaan asal otomatis menjadi praktik standar, serangan itu akan segera memicu tanda bahaya.

Aktifkan Asal untuk Paket Anda Sendiri

Jika Anda menerbitkan paket npm, aktifkan asal di CI/CD Anda:

# 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 Anda:

provenance=true

Keterbatasan

Asal bersifat opt-in. Sebagian besar paket npm belum memilikinya. Dan asal hanya membuktikan di mana sebuah paket dibangun. Itu tidak membuktikan bahwa kode sumbernya aman. Pipeline CI/CD yang disusupi dapat menerbitkan paket berbahaya dengan asal yang valid.

Lapisan 5: Gunakan Alat Analisis Perilaku

Melampaui Pemindaian Kerentanan

Alat tradisional seperti npm audit dan Snyk memeriksa terhadap basis data kerentanan yang diketahui (CVE). Mereka menangkap masalah yang dilaporkan tetapi melewatkan serangan zero-day. Kompromi Axios tidak ada dalam basis data CVE mana pun saat diterbitkan.

Alat analisis perilaku memeriksa apa yang dilakukan paket, bukan apa yang telah dilaporkan tentangnya.

Socket.dev

Socket menganalisis perilaku paket selama instalasi dan runtime. Ini menandai:

Ketika terintegrasi dengan GitHub, Socket mengomentari PR ketika dependensi baru menunjukkan perilaku yang mencurigakan. Dependensi plain-crypto-js dari serangan Axios akan memicu beberapa peringatan Socket: kode yang di-obfuscated, permintaan jaringan selama postinstall, dan penulisan sistem file di luar direktori paket.

# Instal Socket CLI
npm install -g @socketsecurity/cli

# Pindai proyek Anda
socket scan

Snyk

Snyk menyediakan manajemen kerentanan dengan skor risiko, data kematangan eksploitasi, dan panduan perbaikan. Ini lebih kuat untuk kerentanan yang diketahui tetapi lebih lemah untuk deteksi perilaku zero-day.

# Instal Snyk CLI
npm install -g snyk

# Uji proyek Anda
snyk test

Pendekatan Berlapis

Gunakan keduanya. Socket menangkap anomali perilaku yang dilewatkan Snyk. Snyk menangkap kerentanan yang diketahui dengan konteks yang lebih kaya daripada yang disediakan Socket. Tambahkan npm audit sebagai dasar:

# Dasar
npm audit

# Analisis perilaku
socket scan

# Manajemen kerentanan
snyk test

Jalankan ketiga-tiganya di CI/CD sebagai gerbang. Setiap temuan kritis harus memblokir build.

Lapisan 6: Minimalkan Permukaan Dependensi Anda

Pertanyaan yang Lebih Dalam

Setiap paket di node_modules Anda adalah keputusan kepercayaan. Serangan Axios mengkompromikan sebuah paket dengan 83 juta unduhan mingguan. Proyek Node.js rata-rata memiliki ratusan dependensi transitif. Setiap dependensi adalah vektor serangan potensial.

Pertahanan paling efektif adalah memiliki lebih sedikit dependensi untuk dipertahankan.

Audit Pohon Dependensi Anda

# Hitung total dependensi Anda
npm ls --all | wc -l

# Periksa duplikat
npm ls --all | sort | uniq -c | sort -rn | head -20

Ajukan pertanyaan ini untuk setiap dependensi:

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

Alur kerja pengujian API umumnya bergantung pada pustaka klien HTTP, pustaka pernyataan, test runner, dan server mock. Setiap dependensi adalah permukaan serangan.

Apidog menggantikan seluruh tumpukan dengan satu platform:

Memindahkan alur kerja pengujian API Anda ke Apidog menghilangkan lusinan dependensi npm dari infrastruktur pengujian Anda. Lebih sedikit dependensi berarti lebih sedikit keputusan kepercayaan dan lebih sedikit vektor serangan.

Coba Apidog gratis untuk mengkonsolidasikan tumpukan pengujian API Anda.

button

Lapisan 7: Pemantauan Jaringan dan Runtime

Blokir Domain Berbahaya yang Dikenal

Setelah serangan rantai pasokan apa pun, blokir infrastruktur perintah dan kontrol pada tingkat jaringan:

# Tambahkan ke /etc/hosts
echo "0.0.0.0 sfrclak.com" | sudo tee -a /etc/hosts

Untuk lingkungan CI/CD, batasi akses jaringan keluar ke domain yang dikenal baik. Sebagian besar proses build hanya memerlukan akses ke registry npm, host git Anda, dan target deployment Anda. Segala sesuatu yang lain harus diblokir secara default.

Gunakan StepSecurity Harden-Runner untuk CI/CD

Harden-Runner dari StepSecurity memantau alur kerja GitHub Actions secara real time. Ini mendeteksi dropper Axios menghubungi C2 dalam waktu 1,1 detik setelah npm install dimulai. Alat ini menyediakan:

# GitHub Actions
- uses: step-security/harden-runner@v2
  with:
    egress-policy: audit  # atau 'block' untuk mode ketat

Pemantauan Proses Runtime

Untuk mesin pengembangan, pertimbangkan alat deteksi dan respons endpoint (EDR) yang menandai proses anak mencurigakan yang dihasilkan oleh Node.js. RAT Axios menghasilkan osascript (macOS), cscript (Windows), dan python3 (Linux) dari dalam proses instalasi npm. Pola proses anak ini dapat dideteksi.

Konfigurasi .npmrc yang Direkomendasikan

Berikut adalah file .npmrc yang diperkuat keamanan yang menggabungkan lapisan-lapisan di atas:

# Pin versi pasti
save-exact=true
save-prefix=

# Nonaktifkan skrip siklus hidup
ignore-scripts=true

# Aktifkan provenance untuk penerbitan
provenance=true

# Gunakan registry resmi
registry=https://registry.npmjs.org/

# Wajibkan 2FA untuk penerbitan
auth-type=web

# Ambang batas level audit
audit-level=moderate

Komit file ini ke repositori Anda agar setiap anggota tim menggunakan pengaturan keamanan yang sama.

Contoh Pipeline Keamanan CI/CD

Berikut adalah alur kerja GitHub Actions yang menerapkan ketujuh 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

Asal Wajib untuk Paket Populer

npm sedang membahas persyaratan atestasi asal untuk paket di atas ambang batas unduhan tertentu. Ini akan mencegah penerbitan berbasis token manual yang memungkinkan serangan Axios.

Persetujuan Rilis Dua Orang

Seperti transaksi keuangan yang memerlukan otorisasi ganda, paket dengan unduhan tinggi mungkin memerlukan maintainer kedua untuk menyetujui rilis. Satu akun yang disusupi tidak akan cukup.

Pembatasan Izin Runtime

Deno sudah membatasi apa yang dapat diakses oleh skrip (jaringan, sistem file, variabel lingkungan) kecuali diberikan secara eksplisit. Node.js sedang menjajaki model izin serupa. Ketika ini diluncurkan, skrip postinstall akan memerlukan izin eksplisit untuk membuat permintaan jaringan atau mengakses sistem file.

Konvergensi Pengelola Paket

Model isolasi ketat pnpm (paket hanya dapat mengakses dependensi yang dideklarasikan) mencegah banyak serangan kebingungan dependensi. Seiring npm mengadopsi keketatan serupa, permukaan serangan akan menyusut.

FAQ

Apa itu serangan rantai pasokan di npm?

Serangan rantai pasokan di npm menargetkan rantai dependensi perangkat lunak, bukan aplikasi Anda secara langsung. Penyerang mengkompromikan akun maintainer paket, menyuntikkan kode berbahaya ke dalam paket populer, atau menerbitkan paket typosquat dengan nama serupa. Ketika Anda menginstal atau memperbarui dependensi, kode berbahaya dieksekusi di mesin Anda atau di pipeline CI/CD Anda, mencuri kredensial, menginstal backdoor, atau mengeksfiltrasi data.

Apakah npm audit cukup untuk melindungi dari serangan rantai pasokan?

Tidak. npm audit memeriksa basis data kerentanan yang diketahui (CVE). Serangan zero-day seperti kompromi Axios tidak ada dalam basis data CVE mana pun saat terjadi. Anda memerlukan alat analisis perilaku seperti Socket.dev yang memeriksa apa yang dilakukan paket, bukan apa yang telah dilaporkan tentangnya. Gunakan npm audit sebagai dasar, bukan satu-satunya pertahanan Anda.

Haruskah saya berhenti menggunakan npm sama sekali?

Tidak. npm tetap menjadi ekosistem paket terbesar, dan sebagian besar paket aman. Tujuannya adalah mengurangi paparan Anda melalui penentuan versi yang tepat, penegakan lockfile, pemblokiran skrip, dan minimalisasi dependensi. Pertimbangkan apakah setiap dependensi diperlukan, dan gunakan alternatif native jika memungkinkan.

Bagaimana Apidog membantu mengurangi risiko rantai pasokan npm?

Apidog menyediakan klien HTTP bawaan, test runner, server mock, dan generator dokumentasi untuk pengembangan API. Ini menghilangkan kebutuhan akan paket npm seperti Axios, node-fetch, Jest, Express (untuk mock), dan dependensi pengujian lainnya. Lebih sedikit dependensi npm berarti lebih sedikit vektor serangan dalam alur kerja pengembangan API Anda.

Apa itu provenance paket di npm?

Provenance paket menggunakan Sigstore untuk secara kriptografis menghubungkan paket yang diterbitkan ke repositori sumber dan lingkungan build CI/CD. Ini membuktikan di mana dan bagaimana sebuah paket dibangun. Anda dapat memverifikasi provenance dengan npm audit signatures. Paket yang diterbitkan secara manual dari mesin pengembang tidak memiliki provenance, yang merupakan tanda bahaya untuk paket dengan unduhan tinggi.

Berapa banyak paket npm yang berbahaya?

Snyk mengidentifikasi lebih dari 3.000 paket npm berbahaya pada tahun 2024. Pada Kuartal 4 2025, Sonatype memblokir 120.612 serangan malware dalam satu kuartal di npm, PyPI, dan registry lainnya. Jumlahnya terus bertambah. Sebagian besar paket berbahaya adalah typosquat dengan unduhan rendah, tetapi kompromi profil tinggi seperti Axios membuktikan bahwa paket populer tidak kebal.

Apa itu kerentanan PackageGate?

PackageGate adalah serangkaian enam kerentanan zero-day yang diungkapkan pada Januari 2026 yang memengaruhi npm, pnpm, vlt, dan Bun. Salah satu temuan menunjukkan bahwa dependensi berbasis Git dapat membawa file konfigurasi yang memungkinkan eksekusi kode bahkan ketika skrip siklus hidup dinonaktifkan. Ini berarti ignore-scripts saja tidak cukup jika dependensi Anda mereferensikan repositori Git. Tentukan dependensi Git ke hash commit tertentu.

Poin-poin Penting

Setiap dependensi adalah keputusan kepercayaan. Semakin sedikit dependensi yang Anda miliki, semakin kecil permukaan serangan Anda. Semakin banyak lapisan verifikasi yang Anda terapkan, semakin sulit bagi penyerang untuk menyelinap masuk. Bangun pertahanan Anda secara mendalam, bukan secara terisolasi.

button

Mengembangkan API dengan Apidog

Apidog adalah alat pengembangan API yang membantu Anda mengembangkan API dengan lebih mudah dan efisien.

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