SCA - Software Composition Analysis
Pendahuluan
Software Composition Analysis (SCA) adalah praktik keamanan yang berfokus pada identifikasi kerentanan dan masalah lisensi pada dependensi pihak ketiga (open source components) yang digunakan dalam sebuah aplikasi. Dalam aplikasi modern, 80-90% kode berasal dari open source libraries - sebuah proyek Java Spring Boot sederhana bisa memiliki ratusan transitive dependencies. SCA membantu tim development menjawab pertanyaan kritis:
- Apakah library yang kita gunakan memiliki kerentanan yang diketahui (CVE)?
- Apakah lisensi library tersebut kompatibel dengan lisensi aplikasi kita?
- Apakah ada versi baru yang memperbaiki kerentanan tersebut?
- Bagaimana kita bisa melacak semua components yang membentuk aplikasi?
SCA berbeda dengan SAST. SAST menganalisis kode pertama yang kita tulis, sementara SCA menganalisis kode ketiga yang kita impor. Keduanya saling melengkapi.
Tools SCA Populer
Snyk
Snyk adalah platform SCA yang menyediakan vulnerability scanning untuk open source dependencies, container images, dan IaC (Infrastructure as Code). Snyk memiliki database kerentanan yang sangat lengkap dan integrasi yang mudah dengan Git repository, CI/CD pipeline, dan IDE.
Menjalankan Snyk di terminal:
# Instalasi
npm install -g snyk
# Autentikasi
snyk auth
# Test dependencies
snyk test
# Monitor untuk monitoring berkelanjutan
snyk monitor
# Test dengan output JSON
snyk test --json > snyk-report.json
# Test dengan fail on critical/high
snyk test --severity-threshold=high
Contoh output Snyk:
Testing /home/user/project...
Tested 342 dependencies for known issues, found 12 issues, 4 vulnerable paths.
Issues to fix by upgrading:
Upgrade [email protected] to [email protected] to fix
✗ Server-Side Request Forgery (SSRF) [High Severity]
[https://snyk.io/vuln/SNYK-JS-AXIOS-1571914]
Upgrade [email protected] to [email protected] to fix
✗ Command Injection [High Severity]
[https://snyk.io/vuln/SNYK-JS-LODASH-1040724]
-----------------------------------------------
Organization: engineering
Type: npm
Target file: package-lock.json
Project name: myapp
Open Source: no
Project path: /home/user/project
Done
Trivy
Trivy oleh Aqua Security adalah vulnerability scanner all-in-one yang mencakup SCA, container scanning, IaC scanning, dan secret scanning. Trivy terkenal karena kecepatan dan akurasi tinggi dengan database yang diperbarui setiap 12 jam.
Menjalankan Trivy untuk SCA:
# Instalasi
sudo apt-get install trivy # atau download binary
# Scan file lock
trivy fs --scanners vuln .
# Scan dengan format output spesifik
trivy fs --format json --output trivy-report.json .
# Scan hanya severity critical/high
trivy fs --severity CRITICAL,HIGH .
# Scan package.json spesifik
trivy fs --security-checks vuln path/to/package.json
Integrasi Trivy di GitHub Actions:
name: SCA Scan with Trivy
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
scan-ref: '.'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
- name: Upload Trivy results to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
category: 'code-scanning'
OWASP Dependency-Check
OWASP Dependency-Check adalah tool SCA open-source yang menganalisis dependensi dan mencocokkan signature (nama file, SHA1, SHA256) dengan database CVE publik seperti NVD (National Vulnerability Database).
Integrasi Dependency-Check di Maven (pom.xml):
<project>
<build>
<plugins>
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>9.0.9</version>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS>
<formats>
<format>HTML</format>
<format>JSON</format>
</formats>
<suppressionFiles>
<suppressionFile>dependency-check-suppression.xml</suppressionFile>
</suppressionFiles>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Menjalankan:
mvn dependency-check:check
Integrasi Dependency-Check di Gradle:
buildscript {
dependencies {
classpath 'org.owasp:dependency-check-gradle:9.0.9'
}
}
apply plugin: 'org.owasp.dependencycheck'
dependencyCheck {
failBuildOnCVSS = 7
formats = ['HTML', 'JSON']
suppressionFile = 'dependency-check-suppression.xml'
}
Menjalankan:
gradle dependencyCheckAnalyze
Grype
Grype oleh Anchore adalah vulnerability scanner cepat untuk container images dan filesystem. Database kerentanan diperbarui dari beberapa sumber termasuk NVD, GitHub Advisory, dan RedHat OVAL.
# Instalasi Grype (Linux)
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
# Scan direktori
grype dir:.
# Scan dengan output JSON
grype dir:. -o json
# Scan dengan threshold
grype dir:. --fail-on high
# Scan spesifik file lock
grype dir:. --only-fixed # hanya vuln yang sudah ada fix-nya
npm audit dan pip audit
Untuk pengembang JavaScript dan Python, package manager bawaan menyediakan vulnerability scanning dasar:
npm audit:
# Audit dependency
npm audit
# Fix otomatis (upgrade ke versi patch minor)
npm audit fix
# Output JSON
npm audit --json
# Fail pada high severity
npm audit --audit-level=high
pip audit:
# Instalasi
pip install pip-audit
# Audit requirements
pip-audit
# Audit dengan fail on critical
pip-audit --desc
# Output JSON
pip-audit --format json
CVE Correlation
SCA bekerja dengan mencocokkan dependensi terhadap database kerentanan publik. Sumber data utama:
- NVD (National Vulnerability Database): Database CVE resmi yang dikelola NIST.
- GitHub Advisory Database: Database kerentanan yang dikurasi GitHub.
- Snyk Vulnerability Database: Database komersial dengan informasi tambahan.
- OSV (Open Source Vulnerabilities): Database open-source terpadu oleh Google.
Tingkat Keparahan CVSS
CVE dinilai menggunakan CVSS (Common Vulnerability Scoring System):
- CRITICAL (9.0-10.0): Remote code execution tanpa autentikasi, berdampak sistemik.
- HIGH (7.0-8.9): Kerentanan yang mudah dieksploitasi dengan dampak signifikan.
- MEDIUM (4.0-6.9): Kerentanan dengan kondisi atau akses tertentu.
- LOW (0.1-3.9): Kerentanan yang sulit dieksploitasi atau dampak terbatas.
Contoh suppression file untuk false positive di Dependency-Check:
<?xml version="1.0" encoding="UTF-8"?>
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd">
<suppress>
<notes><![CDATA[
CVE-2023-1234 tidak relevan - library digunakan hanya di development,
bukan production. Tidak ada user input.
]]></notes>
<cve>CVE-2023-1234</cve>
</suppress>
<suppress>
<notes><![CDATA[
CVE-2022-5678 adalah false positive untuk framework versi ini.
]]></notes>
<gav regex="true">^com\.example:internal-lib:.*$</gav>
<cve>CVE-2022-5678</cve>
</suppress>
</suppressions>
License Compliance
Selain kerentanan, SCA juga mengidentifikasi lisensi dari setiap dependensi. Ini penting untuk:
- Compliance: Memastikan lisensi library sesuai dengan kebijakan perusahaan.
- Copyleft detection: GPL dan AGPL memerlukan source code disclosure untuk aplikasi yang didistribusikan.
- Patent clauses: Beberapa lisensi (Apache 2.0) memiliki klausa paten yang mengikat.
Jenis Lisensi Open Source Umum
| Lisensi | Tipe | Komersial | Catatan |
|---|---|---|---|
| MIT | Permissive | Ya | Paling longgar |
| Apache 2.0 | Permissive | Ya | Ada klausa paten |
| BSD (2/3 Clause) | Permissive | Ya | Sangat longgar |
| GPLv2/v3 | Copyleft | Terbatas | Wajib buka kode turunan |
| LGPL | Weak Copyleft | Ya | Boleh link dinamis |
| AGPLv3 | Strong Copyleft | Terbatas | Wajib buka kode meskipun via jaringan |
| MPL 2.0 | Weak Copyleft | Ya | Hanya file yang dimodifikasi |
| Unlicense | Public domain | Ya | Tanpa batasan |
Contoh policy Snyk untuk license compliance:
# .snyk policy
language-settings:
javascript:
license-check: true
license-threshold: high
disallowed-licenses:
- GPL-2.0-only
- GPL-3.0-only
- AGPL-3.0-only
allowed-licenses:
- MIT
- Apache-2.0
- BSD-2-Clause
- BSD-3-Clause
- ISC
- Unlicense
SBOM Generation
SBOM (Software Bill of Materials) adalah daftar inventaris semua komponen yang membentuk sebuah aplikasi. SBOM menjadi syarat wajib di banyak regulasi - termasuk Executive Order on Cybersecurity AS dan standar keamanan rantai pasok.
Membuat SBOM dengan Trivy
# Generate SBOM dalam format CycloneDX
trivy fs --format cyclonedx --output sbom.cdx.json .
# Generate SBOM dalam format SPDX
trivy fs --format spdx-json --output sbom.spdx.json .
Membuat SBOM dengan Syft
Syft oleh Anchore adalah tool khusus untuk menghasilkan SBOM:
# Instalasi
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
# Generate SBOM
syft dir:. -o cyclonedx-json=sbom.json
# Detect semua package manager
syft packages . -o table
Membuat SBOM di CI/CD Pipeline
name: SBOM Generation
on:
release:
types: [published]
jobs:
sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate SBOM with Syft
uses: anchore/sbom-action@v0
with:
path: ./
format: cyclonedx-json
output-file: sbom.cdx.json
- name: Upload SBOM as Release Asset
uses: actions/upload-release-asset@v1
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./sbom.cdx.json
asset_name: sbom.cdx.json
asset_content_type: application/json
SCA di Ekosistem Spesifik
Python (pip/poetry)
# Menggunakan safety
pip install safety
safety check
# Menggunakan pip-audit
pip install pip-audit
pip-audit -r requirements.txt
# Menggunakan pipenv
pipenv check
Node.js (npm/yarn/pnpm)
# npm audit (bawaan)
npm audit --production
# yarn audit
yarn audit
# pnpm audit
pnpm audit
# Menggunakan snyk untuk Node.js
npx snyk test
Java (Maven/Gradle)
# Maven Dependency-Check
mvn dependency-check:check
# Gradle Dependency-Check
gradle dependencyCheckAnalyze
# Snyk untuk Maven
snyk test --all-projects
Praktik Terbaik SCA
- Scan di setiap PR: Integrasikan SCA di pipeline CI/CD untuk memindai setiap pull request. Blokir PR yang menambahkan dependensi dengan kerentanan CRITICAL/HIGH.
- Automatic remediation: Gunakan tool seperti Dependabot atau Renovate untuk membuat pull request otomatis ketika ada update keamanan.
- Periodic scanning: Database CVE diperbarui setiap hari. Jadwalkan full scan ulang secara periodik untuk mendeteksi CVE baru yang berdampak pada dependensi yang sudah ada.
- SBOM archiving: Simpan SBOM untuk setiap release. Ini membantu saat terjadi CVE baru - Anda bisa langsung tahu apakah aplikasi versi X terpengaruh.
- License inventory: Pertahankan inventaris lisensi untuk semua komponen. Pastikan ada proses review untuk dependensi dengan lisensi copyleft.
- Vendor package feeds: Untuk package internal yang tidak dipublikasikan ke registry publik, pertimbangkan untuk memindainya juga - atau pastikan package tersebut tidak memiliki kerentanan.
- Transitive dependencies: Jangan abaikan transitive dependencies (dependensi dari dependensi). Tool SCA modern secara otomatis resolve pohon dependensi penuh.
- False positive suppression: Terapkan suppression file untuk false positive yang sudah diverifikasi, tetapi dengan proses review dan expiry date.
Kesimpulan
SCA adalah komponen yang tidak bisa ditawar dalam program DevSecOps modern. Rata-rata aplikasi web modern menggunakan 200-500+ dependensi open source - dan setiap dependensi adalah vektor serangan potensial. SCA memberi visibilitas penuh terhadap software supply chain dan memungkinkan tim untuk merespon cepat ketika kerentanan baru ditemukan.
Mulailah dengan tool sederhana seperti npm audit atau
pip-audit untuk proyek kecil, lalu tingkatkan ke tool
yang lebih komprehensif seperti Snyk, Trivy, atau OWASP
Dependency-Check seiring pertumbuhan organisasi. Pastikan untuk
mengintegrasikan SCA di pipeline CI/CD sebelum dependensi
baru masuk ke main branch - bukan setelahnya.