Kodeloka
  1. Kodeloka
  2. Kelas Keamanan Aplikasi
  3. Materi

5 · Rantai Pasok & API · Modul 7 dari 8

Keamanan Dependensi & Rantai Pasok

Sebagian besar kode yang berjalan di produksi bukan tulisan tim Anda — dan itu bagian dari permukaan serangan.

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
🚫 Menjalankan npm install di pipeline membuat build tidak dapat diulang

Perintah 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

🚫 Paket internal dapat dibajak lewat registry publik

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
⚠️ Jangan langsung memblokir pipeline pada setiap temuan

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