
Hari 5: Trivy SCA Scan Nemukan 4 CVE di Golang API
Hari kelima 60 hari DevSecOps! Scan dependensi Go pakai Trivy dan nemukan 4 CVE termasuk 1 CRITICAL — termasuk library deprecated jwt-go.
Dari Secret Scan ke Dependency Scan
Kemarin Gitleaks cuma ngecek secret yang bocor di kode. Hari ini langkahnya bergerak lebih jauh — bukan cuma kode yang kita tulis sendiri, tapi juga library orang lain yang kita pakai. Soalnya, menurut laporan industri, 70-80% kode di aplikasi modern itu berasal dari library open source. Kalau library punya celah, aplikasi kita ikut rentan.
Tools yang dipakai hari ini: Trivy — scanner SCA (Software Composition Analysis) gratis dari Aqua Security. Satu perintah dan langsung keluar daftar CVE yang ada di dependensi kita.
Install Trivy
brew install trivy
Untuk CI/CD nanti, bisa download binary langsung dari GitHub releases. Trivy support banyak bahasa — bukan cuma Go, tapi juga Node.js, Python, Docker image, bahkan Terraform.
Sengaja Tambah Library yang Rentan
Supaya bisa latihan mendeteksi CVE, kita tambah dua library yang memang sudah dikenal punya celah:
cd securebank-api
go get github.com/gin-gonic/gin@v1.9.0
go get github.com/dgrijalva/jwt-go@v3.2.0+incompatible
Kenapa dua ini?
- gin v1.9.0 — bawa transitive dependencies (
x/crypto,x/net) yang versinya udah tua dan punya CVE - jwt-go v3.2.0 — library JWT yang udah deprecated dan punya CVE tanpa fixed version
Satu trik yang kepakai: karena kedua library ini belum langsung dipakai di kode, go mod tidy bakal ngapus mereka. Makanya dibuat blank import supaya tetap kebaca:
package crypto
import (
_ "github.com/gin-gonic/gin"
_ "github.com/dgrijalva/jwt-go"
)
Trik blank import (_ "package") ini memastikan dependensi tetap ada di go.mod tanpa harus manggil fungsi apapun.
Hasil Trivy Scan: 4 CVE Ditemukan
trivy fs . --severity HIGH,CRITICAL
Satu perintah doang, langsung keluar hasilnya — 4 CVE ditemukan, termasuk 1 yang CRITICAL:
| Library | CVE | Severity | Fixed Version |
|---|---|---|---|
| dgrijalva/jwt-go | CVE-2020-26160 | HIGH | — (deprecated) |
| golang.org/x/crypto | CVE-2024-45337 | CRITICAL | 0.31.0 |
| golang.org/x/crypto | CVE-2025-22869 | HIGH | 0.35.0 |
| golang.org/x/net | CVE-2023-39325 | HIGH | 0.17.0 |
Yang menarik: 3 dari 4 CVE itu berasal dari transitive dependency — bukan library yang kita langsung pakai, tapi library yang dibawa oleh library lain (gin v1.9.0). Ini jadi reminder bahwa kita harus aware bukan cuma dependensi langsung, tapi juga dependensi dari dependensi.
Membuat .trivyignore: Dokumentasi Accepted Risk
Bukan berarti setiap CVE harus langsung di-fix. Kadang ada yang sengaja ditoleransi sementara, misalnya lagi nunggu migrasi ke library yang lebih baik.
Trivy nyediain file .trivyignore buat mendokumentasikan accepted risk ini:
# jwt-go deprecated — akan diganti golang-jwt/jwt/v5 di Day 07
CVE-2020-26160
# golang.org/x/crypto — transitive dari gin, akan di-fix di Day 07
CVE-2024-45337
CVE-2025-22869
# golang.org/x/net — transitive dari gin, akan di-fix di Day 07
CVE-2023-39325
File ini ditaruh di root repo supaya berlaku buat semua subdirectory. Yang penting: .trivyignore bukan tempat buat "sembunyi" masalah, tapi buat dokumentasi kenapa suatu CVE ditoleransi dan kapan rencana perbaikannya.
Simpan Report Buat Audit Trail
Buat keperluan dokumentasi dan audit, hasil scan disimpen dalam format JSON:
trivy fs . --severity HIGH,CRITICAL --format json \
--output security/trivy-fs-report.json
File JSON ini nanti di Day 46-47 bisa di-upload ke DefectDojo buat vulnerability management yang lebih terstruktur.
Lesson Learned
1. SCA dan SAST itu beda dan saling melengkapi. SCA fokus ke dependensi pihak ketiga, SAST ke kode yang kita tulis sendiri. Keduanya harus jalan barengan — cuma scan salah satu aja ga cukup.
2. Transitive dependency itu bahaya tersembunyi. Kita cuma pakai gin, tapi otomatis dapat 3 CVE dari library yang dibawa gin. Harus aware sama rantai dependensi, bukan cuma apa yang kita langsung import.
3. Library deprecated itu ribet. jwt-go udah deprecated dan gak ada fixed version-nya. Satu-satunya jalan adalah migrasi total ke library pengganti (golang-jwt/jwt/v5). Ini bakal dilakuin di Day 07.
4. .trivyignore itu alat dokumentasi, bukan tempat sembunyi. Setiap CVE yang di-ignore harus ada justifikasi dan timeline kapan bakal diperbaiki. Tanpa itu, file ini cuma jadi cara buat menghiraukan masalah.
Kesimpulan
Satu perintah trivy fs . dan kita langsung bisa lihat bahwa 4 CVE ada di dependensi kita — termasuk 1 CRITICAL yang bisa bikin bypass autentikasi. Bayangin kalau ini gak di-scan dan langsung masuk production.
Ditemukan 4 CVE (1 CRITICAL, 3 HIGH), semua terkait library yang sengaja ditambahkan buat latihan. Di Day 07 nanti, kita akan remediasi semua: ganti jwt-go ke golang-jwt, upgrade gin ke versi terbaru, dan pastikan scan Trivy kembali bersih.
Besok lanjut ke Hari 6: SCA di Pipeline — masukkin Trivy ke CI/CD biar setiap push otomatis di-scan dan pipeline gagal kalau ada CVE CRITICAL.
Diskusi & Komentar
Hari 4: Gitleaks di CI, Refactor Config ke Env Var
Next ArticleHari 6: Trivy SCA Quality Gate, Build Gagal Saat Ada CVE
Artikel Terkait
Hari 3: Ngecek Kebocoran Secret di Kode Pakai Gitleaks
Hari ketiga 60 hari DevSecOps! Pakai Gitleaks buat scan secret yang bocor di repo — ternyata tool ini cukup pintar bedainya secret asli dan contoh.
Hari 4: Gitleaks di CI, Refactor Config ke Env Var
Hari keempat 60 hari DevSecOps! Integrasikan Gitleaks ke pipeline CI, refactor config ke env vars, dan 3 kali fix error CI — akhirnya pipeline hijau.
Hari 6: Trivy SCA Quality Gate, Build Gagal Saat Ada CVE
Hari keenam 60 hari DevSecOps! Masukkin Trivy ke CI pipeline sebagai quality gate — build otomatis gagal kalau ada CVE CRITICAL atau HIGH di dependensi.