Mengelola risiko kode pihak ketiga dengan Software Composition Analysis: dari anatomi dependency tree dan transitive risk, SBOM CycloneDX/SPDX, npm audit vs Trivy vs Dependabot, hingga licensing compliance dan pipeline SCA yang tidak memblokir developer tanpa alasan

Setelah di episode 8 kita menguji aplikasi secara dinamis, episode ini menyasar sumber risiko yang bukan tulisan tim kalian: dependency pihak ketiga. Angka yang sering mengagetkan orang baru: pada aplikasi web modern, 70–90% baris kode production berasal dari open source. Kalian tidak men-audit semuanya secara manual — mustahil — tapi kalian wajib tahu apa saja yang masuk, risikonya apa, dan seberapa cepat bisa kalian ganti bila salah satunya meledak. Log4Shell (2021) membuktikan satu library logging bisa menjadi insiden global.
Topiknya kita susun berlapis: anatomi dependency tree → SCA & vulnerability database → SBOM → licensing → praktik pipeline.
npm install express tidak hanya memasang express — ia memasang seluruh pohon transitive: rata-rata paket npm populer menarik puluhan sampai ratusan sub-dependency. Tiga properti risikonya:
Konsekuensi strategisnya: SCA bukan kegiatan sekali-jalan saat rilis; ia harus berjalan terus-menerus terhadap codebase yang sudah ada, karena ancamannya datang belakangan.
SCA tool bekerja dengan pola umum: parse lockfile → identifikasi komponen + versi → cocokkan dengan database advisory (OSV, GitHub Advisory, NVD) → laporkan yang cocok. Pilihan utamanya:
| Tool | Kekuatan | Catatan |
|---|---|---|
npm audit / pnpm audit | Nol setup | Cakupan ekosistem JS saja |
Trivy (fs) | Multi-lockfile + IaC + image | Satu tool untuk banyak hal |
| Dependabot / Renovate | Auto PR update | Fokus remediasi, bukan gate |
| Snyk / Mend | Enterprise, fix advice | Berbayar, DB privat |
Praktik cepat dengan dua lapis:
npm audit --audit-level=high
npm audit fix --dry-run # lihat dulu apa yang akan berubah
# Lapis 2: scanner lintas ekosistem termasuk lockfile lain
trivy fs --scanners vuln,misconfig --severity HIGH,CRITICAL .Perhatikan output severity dan — lebih penting — apakah CVE tersebut punya fix version. Temuan tanpa fix perlu mitigasi beda (pin, fork, replace, atau accept dengan justifikasi).
Important
Jangan blind-run npm audit fix. Upgrade mayor bisa merusak runtime — jalankan dry-run, baca changelog breaking change, dan biarkan test suite memutuskan. Remediasi dependency adalah operasi rilis biasa, bukan tombol magic.
SBOM (Software Bill of Materials) adalah manifest formal seluruh komponen software — analog daftar bahan di kemasan makanan. Dua standar dominan:
Kenapa SBOM penting bagi AppSec engineer? Bayangkan CVE baru di library X dirilis pagi ini. Pertanyaan manajemen: "apakah kita terdampak?" Tanpa SBOM, jawabannya butuh grepping belasan repo. Dengan SBOM:
npx @cyclonedx/cyclonedx-npm --output-file sbom.json
jq -r '.components[].name' sbom.json | grep -i '^lodash$'Jawaban dalam hitungan detik, untuk setiap repo, tanpa build ulang. Regulasi (EU CRA, US EO 14028) mendorong SBOM dari "nice to have" menuju syarat pasar — organisasi kalian akan minta lebih cepat dari perkiraan.
Bagian SCA yang sering dilupakan: setiap paket punya lisensi, dan beberapa lisensi bermasalah untuk penggunaan komersial:
| Lisensi | Aman untuk produk proprietary? |
|---|---|
| MIT, Apache-2.0, BSD | Ya — dengan atribusi sesuai ketentuan |
| LGPL | Umumnya ya jika dynamically linked |
| GPL (library) | Berisiko — dapat "menginfeksi" lisensi kalian |
| AGPL | Bahaya untuk SaaS — network clause |
| SSPL/BSL (contoh: Redis lama, Elastic) | Perlu review legal per kasus |
Automasi minimal: generate SBOM SPDX, filter licenseConcluded, alarm untuk lisensi di denylist organisasi. Ini pekerjaan sekali-setup yang melindungi dari risiko hukum mahal.
Susunan yang saya rekomendasikan untuk organisasi kecil-menengah:
name: SCA
on:
pull_request:
schedule:
- cron: "0 3 * * *" # scan ulang harian — CVE baru tanpa push baru
jobs:
deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22 }
- run: npm ci
- name: Fail on new critical vulns
run: trivy fs --exit-code 1 --severity CRITICAL .
- name: Generate SBOM artifact
run: npx @cyclonedx/cyclonedx-npm --output-file sbom.json
- uses: actions/upload-artifact@v4
with: { name: sbom, path: sbom.json }Dua keputusan desain di workflow ini yang layak digarisbawahi:
Tambahkan Dependabot config minimal di .github/dependabot.yml agar update minor otomatis jadi PR mingguan — kombinasi gate keras (critical) + otomatisasi lembut (update rutin) menjaga hutang dependency tetap rendah tanpa drama.
Inti yang harus dibawa pulang:
npm audit native + Trivy lintas ekosistem + Dependabot/Renovate untuk auto-update.Di episode 10 kita turun satu lapis lagi ke unit deployment: Container & Deployment Security — Dockerfile hardening, pemilihan base image, image scanning, dan guard runtime yang membuat container sulit dieksploitasi. Sampai jumpa di episode 10!