Dependency Management
Pendahuluan
Perangkat lunak modern sangat bergantung pada library dan framework pihak ketiga. Sebuah aplikasi web sederhana bisa memiliki ratusan hingga ribuan dependensi transitif - library yang digunakan oleh library lain. Fenomena ini disebut sebagai dependensi hirarki atau transitive dependency tree. Riset Synopsys (2024) menunjukkan bahwa 96% codebase mengandung open-source components, dan rata-rata 84% dari kode aplikasi sebenarnya berasal dari dependency.
Ketergantungan yang masif ini menciptakan attack surface yang sangat luas. Sebuah kerentanan di library kecil yang jarang dikenal bisa berdampak pada jutaan aplikasi - seperti yang terjadi pada Log4Shell (CVE-2021-44228) yang menyerang library logging Apache Log4j versi 2.x. Kerentanan ini memengaruhi ribuan aplikasi Java di seluruh dunia dan membutuhkan waktu berbulan-bulan untuk dimitigasi secara menyeluruh.
Dependency management dalam konteks DevSecOps adalah proses sistematis untuk mengidentifikasi, memantau, memperbarui, dan mengamankan semua dependensi perangkat lunak - mulai dari pemilihan awal hingga pensiun (deprecation).
Risiko Dependency
1. Malicious Packages (Package Malware)
Attacker mengunggah paket berbahaya ke registry publik (npm, PyPI, Maven, RubyGems) dengan nama yang mirip atau menarik untuk digunakan developer. Contoh terkenal:
- event-stream (npm, 2018): Seorang contributor mengambil alih paket populer dengan 2 juta download per minggu dan menyisipkan malware untuk mencuri cryptocurrency Bitcoin dari aplikasi Copay.
- colors.js dan faker.js (npm, 2022): Pemain library sengaja merusak (protestware) library yang digunakan ribuan project, menyebabkan aplikasi crash dengan output berulang "LIBERTY LIBERTY LIBERTY".
- ctx (npm): Package dengan 1000+
download/minggu yang ternyata adalah typo-squatting
dari
context.
2. Typo-Squatting
Attacker membuat paket dengan nama yang sengaja mirip dengan paket populer, memanfaatkan kesalahan ketik developer:
| Paket Asli | Paket Palsu | Dampak |
|---|---|---|
lodash |
lodahs |
Eksekusi kode remote |
cross-env |
cross-env.js |
Payload berbahaya |
babel-cli |
babel-cli |
Data exfiltration |
requests (PyPI) |
request (PyPI) |
Credential theft |
Mitigasi: Gunakan lock file, verifikasi checksum,
gunakan registry resmi dengan namespace scope (misalnya
@scope/package di npm), dan aktifkan tool seperti
npm-malware-checker atau pip
audit.
3. Version Vulnerability
Kerentanan yang sudah dikenal (known vulnerability) pada versi library tertentu:
- CVE-2021-44228 (Log4j 2.x): Remote Code Execution di library logging.
- CVE-2014-0160 (Heartbleed): Buffer over-read di OpenSSL.
- CVE-2017-5638 (Struts2): Remote Code Execution via Content-Type header.
- CVE-2025-xxxxx: Ribuan CVE baru diterbitkan setiap tahun untuk berbagai library.
Mitigasi: Pantau CVE secara proaktif menggunakan GitHub Advisory Database, NVD, Open Source Vulnerabilities (OSV) database. Gunakan tool SCA otomatis.
4. License Compliance
Setiap library open-source memiliki lisensi tertentu yang mungkin bertentangan dengan model bisnis aplikasi. Lisensi yang perlu diperhatikan:
- Copyleft (GPL, AGPL): Penggunaan library GPL dalam aplikasi komersial bisa mewajibkan source code aplikasi untuk dirilis juga di bawah GPL.
- Non-commercial: Beberapa library hanya boleh digunakan untuk non-komersial.
- Patent clauses: Lisensi tertentu memiliki klausul paten yang perlu di-review oleh tim legal.
Tools Dependency Management
Dependabot
Dependabot adalah tool automated dependency update dari GitHub yang terintegrasi langsung dengan repository GitHub.
Cara kerja Dependabot:
- Memindai file manifest (package.json, pom.xml, requirements.txt, Gemfile).
- Membandingkan versi yang digunakan dengan versi terbaru atau database kerentanan.
- Membuat pull request otomatis untuk memperbarui dependency.
- Menandai PR dengan label seperti
dependencies,security, sesuai jenis update.
Konfigurasi Dependabot
(.github/dependabot.yml):
version: 2
updates:
# Update npm dependencies
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "09:00"
timezone: "Asia/Jakarta"
open-pull-requests-limit: 10
labels:
- "dependencies"
- "npm"
reviewers:
- "team-security"
# Hanya update untuk security fixes
allow:
- dependency-type: "direct"
- dependency-type: "indirect"
ignore:
- dependency-name: "react"
versions: [">=18.0.0"]
# Update Docker images
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
# Update GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
Kelebihan: Gratis untuk semua repository publik dan privat di GitHub, integrasi mulus, PR auto-labeling. Kekurangan: Hanya untuk GitHub; tidak mendukung kebijakan policy as code yang kompleks.
Renovate
Renovate oleh Mend (sebelumnya WhiteSource) adalah alternatif Dependabot yang lebih configurable. Tersedia sebagai GitHub App, GitLab Integration, CLI, atau self-hosted.
Konfigurasi Renovate (renovate.json):
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
"group:allNonMajor",
"schedule:weekly"
],
"labels": ["dependencies", "renovate"],
"packageRules": [
{
"matchUpdateTypes": ["major"],
"labels": ["major-update"],
"reviewers": ["team:core-devs"]
},
{
"matchUpdateTypes": ["minor", "patch"],
"automerge": true,
"automergeType": "pr",
"platformAutomerge": true
},
{
"matchCategories": ["security"],
"automerge": false,
"priority": "high",
"reviewers": ["team:security"]
}
],
"vulnerabilityAlerts": {
"enabled": true
}
}
Kelebihan: Cross-platform (GitHub, GitLab, Bitbucket, Gitea); policy as code yang sangat fleksibel; auto-merge untuk minor/patch update; dukungan untuk 80+ package managers. Kekurangan: Konfigurasi lebih kompleks; perlu onboarding untuk project baru.
Snyk
Snyk adalah platform developer security komprehensif yang mencakup SCA (Software Composition Analysis), SAST, container scanning, dan IaC scanning.
Cara menggunakan Snyk CLI:
# Install Snyk CLI
npm install -g snyk
# Autentikasi
snyk auth
# Test dependency untuk kerentanan
snyk test
# Monitor project secara berkelanjutan
snyk monitor
# Test dengan output JSON untuk CI/CD
snyk test --json
# Test hanya untuk kerentanan kritis
snyk test --severity-threshold=high
Integrasi Snyk di CI/CD (GitHub Actions):
name: Snyk Security Scan
on:
pull_request:
branches: [main]
jobs:
snyk:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Snyk test
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high
Kelebihan: Database kerentanan yang sangat komprehensif; fix guidance otomatis; platform terintegrasi dengan SAST dan container scan. Kekurangan: Versi gratis terbatas; komersial cukup mahal untuk skala besar.
OWASP Dependency-Check
Tool SCA open-source yang mendeteksi kerentanan pada dependency project. Mendukung Java, .NET, Python, Ruby, Node.js, dan C/C++.
Cara menggunakan OWASP Dependency-Check:
CLI:
# Download dan jalankan
wget https://github.com/jeremylong/DependencyCheck/releases/download/v10.0.0/dependency-check-10.0.0-release.zip
unzip dependency-check-10.0.0-release.zip
./dependency-check/bin/dependency-check.sh --scan /path/to/project --out /path/to/report
# Untuk Maven project (plugin)
mvn dependency-check:check -DfailBuildOnCVSS=7
Kelebihan: Gratis dan open-source; database NVD dan OSS Index; output HTML untuk laporan visual. Kekurangan: Update database NVD butuh koneksi internet; false positive cukup tinggi; scan lambat untuk project besar.
npm audit
Tool bawaan npm untuk memindai kerentanan pada dependency Node.js:
# Audit dependency
npm audit
# Audit dengan fix otomatis (update compatible)
npm audit fix
# Audit hanya untuk kerentanan kritis
npm audit --audit-level=high
# JSON output
npm audit --json
# Force fix (termasuk major update)
npm audit fix --force
Kelebihan: Gratis, bawaan npm, cepat. Kekurangan: Hanya untuk Node.js; library database lebih terbatas dibanding Snyk.
pip-audit
Tool untuk memindai kerentanan pada Python packages:
# Install
pip install pip-audit
# Audit dependency saat ini
pip-audit
# Audit dari requirements.txt
pip-audit -r requirements.txt
# Audit dari lock file
pip-audit -r requirements.txt --requirement
# JSON output untuk CI/CD
pip-audit --format json
Policy as Code untuk Dependency
Policy as code adalah praktik mendefinisikan aturan keamanan dependency dalam format kode yang bisa di-version control dan dijalankan otomatis di CI/CD.
Contoh kebijakan menggunakan OPA (Open Policy Agent) dengan Rego:
package dependency.policy
# Blokir library dengan lisensi GPL
deny[msg] {
lib := input.libraries[_]
lib.license == "GPL-3.0-or-later"
msg := sprintf("Library %v %v memiliki lisensi GPL yang tidak diizinkan", [lib.name, lib.version])
}
# Blokir library dengan kerentanan kritis
deny[msg] {
lib := input.libraries[_]
vuln := lib.vulnerabilities[_]
vuln.cvss_score >= 9
msg := sprintf("Library %v %v memiliki kerentanan kritis: %v (CVSS: %v)", [lib.name, lib.version, vuln.id, vuln.cvss_score])
}
# Blokir library yang sudah deprecated selama lebih dari 2 tahun
deny[msg] {
lib := input.libraries[_]
lib.deprecated_since != null
time.now_ns() - time.parse_rfc3339_ns(lib.deprecated_since) > 63072000000000000 # 2 tahun
msg := sprintf("Library %v %v sudah deprecated sejak %v", [lib.name, lib.version, lib.deprecated_since])
}
Dengan policy ini, pipeline CI/CD bisa secara otomatis memblokir pull request yang menambahkan library berlisensi GPL, memiliki kerentanan kritis, atau sudah deprecated.
Lock File Verification
Lock file (package-lock.json, yarn.lock, Gemfile.lock, poetry.lock) memastikan bahwa dependency yang diinstal selalu identik di semua lingkungan. Namun, lock file juga bisa dimanipulasi.
Praktik verifikasi lock file:
- Integrity check: Verifikasi checksum setiap package dalam lock file.
- Content-addressed storage: npm
registry mendukung integrity hashing menggunakan
integrityfield di lock file. - Subresource Integrity (SRI): Untuk frontend assets.
- Git diff review: Setiap perubahan pada lock file harus di-review dengan teliti - perubahan mendadak pada banyak hash bisa menandakan serangan.
Contoh konfigurasi npm untuk integrity checking:
# Force integrity checking
npm config set audit true
npm config set fund false
# Verifikasi lock file
npm ci # clean install - hanya menggunakan lock file, tidak generate ulang
Chain of Trust: Sigstore dan cosign
Chain of trust memastikan bahwa dependency yang digunakan benar-benar berasal dari sumber yang sah dan tidak dimodifikasi.
Sigstore
Sigstore adalah proyek dari Linux Foundation yang menyediakan infrastruktur code signing gratis. Komponen utama:
- Fulcio: Root CA yang menerbitkan short-lived certificate untuk signing.
- Rekor: Transparency log untuk menyimpan semua signature.
- Cosign: CLI untuk signing dan verification container images dan artifacts.
cosign (Container Signing)
Cosign adalah tool untuk signing dan verification container images:
# Install cosign
wget https://github.com/sigstore/cosign/releases/download/v2.4.0/cosign-linux-amd64
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign
# Generate key pair
cosign generate-key-pair
# Sign container image
cosign sign --key cosign.key ghcr.io/nousresearch/myapp:v1.0.0
# Verify signature
cosign verify --key cosign.pub ghcr.io/nousresearch/myapp:v1.0.0
# Keyless signing (menggunakan identitas OIDC)
cosign sign ghcr.io/nousresearch/myapp:v1.0.0
# Keyless verification
cosign verify ghcr.io/nousresearch/myapp:v1.0.0
Integrasi Dependency Management di CI/CD
Contoh Pipeline Lengkap dengan GitHub Actions
name: Dependency Security
on:
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1' # Setiap Senin pagi
jobs:
dependency-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
# 1. Lock file verification
- name: Verify npm lock file
run: npm ci --audit=false
# 2. Audit dengan npm audit
- name: npm audit
run: npm audit --audit-level=moderate
continue-on-error: true # non-blocking untuk audit
# 3. SCA dengan OWASP Dependency-Check
- name: Dependency Check
uses: dependency-check/Dependency-Check_Action@main
with:
project: 'myapp'
path: '.'
format: 'HTML'
args: >
--failOnCVSS 7
--enableExperimental
# 4. SBOM generation
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
path: ./
format: cyclonedx-json
# 5. License compliance check
- name: License Check
run: |
npx license-checker --summary --failOn 'GPL-3.0' \
--excludePackages '[email protected]'
# 6. Upload SBOM & report
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dependency-reports
path: |
sbom.spdx.json
dependency-check-report.html
Kesimpulan
Supply chain security tidak bisa diabaikan di era modern. Dengan rata-rata aplikasi bergantung pada ratusan bahkan ribuan library eksternal, satu kerentanan di leaf dependency bisa menghancurkan seluruh sistem.
Strategi dependency management yang komprehensif mencakup:
- Automated Scanning: Gunakan Dependabot / Renovate untuk update otomatis, Snyk / OWASP Dependency-Check untuk SCA.
- Lock File Discipline: Selalu gunakan lock file dan verifikasi integrity-nya di CI/CD.
- Policy as Code: Tentukan aturan tentang lisensi, versi, dan kerentanan yang bisa diterima.
- SBOM Generation: Hasilkan SBOM secara otomatis dan simpan sebagai artifact setiap rilis.
- Chain of Trust: Verifikasi signature dependency menggunakan Sigstore/cosign.
- Developer Education: Latih developer untuk mengenali tanda-tanda typo-squatting dan malicious package.
Mulailah dengan langkah paling sederhana: aktifkan Dependabot di
repository GitHub dan jadwalkan npm audit /
pip-audit di pipeline. Dari sana, tingkatkan secara
bertahap dengan SCA tools dan policy as code.