
Hari 7: Patch CVE di Go API, Pipeline Hijau Lagi
Hari ketujuh 60 hari DevSecOps! Remediasi 4 CVE — ganti jwt-go ke golang-jwt, upgrade gin, dan pipeline CI kembali hijau setelah sebelumnya merah.
Dari Pipeline Merah ke Pipeline Hijau
Kemarin pipeline CI kita merah karena Trivy nemuin 4 CVE di dependensi — 1 CRITICAL dan 3 HIGH. Itu emang sengaja buat ngebuktiin kalau quality gate berfungsi. Hari ini tugasnya: remediasi semua CVE itu biar pipeline kembali hijau.
Secara strategi, ada dua pendekatan:
- Library deprecated (
jwt-go) → ganti total ke library baru yang masih maintained - Library yang masih aktif (
gin) → upgrade ke versi terbaru yang udah nge-fix CVE
Ganti jwt-go ke golang-jwt/jwt/v5
Library dgrijalva/jwt-go udah deprecated dan gak akan pernah nge-fix CVE-2020-26160. Jadi satu-satunya jalan adalah ganti total ke library pengganti yang masih aktif: golang-jwt/jwt/v5.
Perubahannya cuma di satu file:
// SEBELUM — deprecated, punya CVE
import (
_ "github.com/dgrijalva/jwt-go"
_ "github.com/gin-gonic/gin"
)
// SESUDAH — library pengganti yang masih maintained
import (
_ "github.com/gin-gonic/gin"
_ "github.com/golang-jwt/jwt/v5"
)
Perintahnya:
go get github.com/golang-jwt/jwt/v5@latest
go mod tidy
go mod tidy otomatis ngapus dgrijalva/jwt-go karena gak ada lagi yang import.
Upgrade gin dan Semua Transitive Dependencies
Tiga CVE lainnya (di x/crypto dan x/net) itu dependency transitif dari gin. Jadi cara nge-fix-nya bukan langsung upgrade x/crypto, tapi upgrade gin ke versi terbaru yang udah pakai x/crypto dan x/net versi lebih baru.
go get github.com/gin-gonic/gin@v1.12.0
go get -u ./...
go mod tidy
Karena koneksi internet lagi bermasalah dan go get -u timeout berkali-kali, aku akalin dengan edit go.mod langsung — tulis versi minimum yang fix CVE, lalu go mod tidy yang resolve ke versi terbaru yang kompatibel.
Versi Sebelum dan Sesudah
| Library | Sebelum | Sesudah | CVE yang Diperbaiki |
|---|---|---|---|
| dgrijalva/jwt-go | v3.2.0+incompatible | DIHAPUS | CVE-2020-26160 |
| golang-jwt/jwt/v5 | — | v5.3.1 | (pengganti jwt-go) |
| gin | v1.9.0 | v1.12.0 | — (upgrade transitive deps) |
| x/crypto | v0.5.0 | v0.48.0 | CVE-2024-45337, CVE-2025-22869 |
| x/net | v0.7.0 | v0.51.0 | CVE-2023-39325 |
| x/sys | v0.5.0 | v0.41.0 | — |
| x/text | v0.7.0 | v0.34.0 | — |
Verifikasi: Trivy Scan Bersih
Setelah semua di-upgrade, jalanin Trivy lagi:
trivy fs . --severity CRITICAL,HIGH --scanners vuln
Hasilnya: 0 vulnerabilities. Dari 4 CVE jadi 0. Bersih.
Verifikasi: Pipeline Hijau
Push ke GitHub dan liat hasil CI:
✅ Build & Test (Go 1.26) — PASS
✅ Secret Scan (Gitleaks) — PASS
✅ SCA Scan (Trivy) — PASS (0 vulnerabilities)
Pipeline kembali hijau setelah sebelumnya merah karena 4 CVE. Quality gate bekerja seperti yang diharapkan: nge-blok kalau ada masalah, dan allow kalau masalahnya udah diperbaiki.
Lesson Learned
1. Library deprecated harus diganti total, bukan di-upgrade. jwt-go gak punya fixed version buat CVE-2020-26160. Satu-satunya jalan adalah migrasi ke golang-jwt/jwt/v5. Ini beda sama library yang masih aktif — tinggal upgrade versi dan selesai.
2. Transitive dependency ikut ter-upgrade saat library utama di-upgrade. Kita gak perlu langsung upgrade x/crypto atau x/net. Cukup upgrade gin ke v1.12.0, dan otomatis versi terbaru dari x/crypto dan x/net ikut ke-bawa.
3. go mod tidy itu powerful. Setelah manual edit go.mod, go mod tidy otomatis resolve ke versi terbaru yang kompatibel dan ngapus dependency yang gak dipakai lagi (seperti jwt-go yang udah diganti).
4. Network timeout bisa diakali. Daripada nunggu go get -u yang timeout berkali-kali, lebih efektif edit go.mod langsung lalu jalanin go mod tidy. Hasilnya sama, tapi lebih cepat.
5. Remediasi SCA itu tentang menghapus dan mengganti, bukan cuma patch. Beberapa CVE (seperti di jwt-go) emang gak bisa di-patch. Harus ganti library-nya sama sekali. Ini pelajaran penting buat dependency management.
Kesimpulan
Dari 4 CVE (1 CRITICAL, 3 HIGH) jadi 0. Dari pipeline merah jadi pipeline hijau. Semua dalam satu hari.
Yang bikin menarik: proses remediasi ini bikin kita paham bahwa vulnerability di dependensi itu gak selalu bisa di-fix cuma dengan upgrade versi. Kadang library-nya emang udah mati (deprecated) dan harus diganti total. Dan kadang vulnerability ada di dependency yang bahkan gak kita langsung import (transitive dependency).
Fase SCA (Day 5-7) sekarang lengkap: scan lokal → scan di CI → remediasi. Pipeline kita punya tiga lapis pertahanan (build/test, secret scan, SCA scan) dan semuanya hijau.
Besok lanjut ke Hari 8: SAST Setup pakai Semgrep — bukan scan dependensi lagi, tapi scan kode yang kita tulis sendiri.
Diskusi & Komentar
Artikel Terkait
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.
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.