
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
Hari 6: Trivy SCA Quality Gate, Build Gagal Saat Ada CVE
Next ArticleHari 8: Semgrep SAST Scan Temukan Kode Tidak Aman
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 8: Semgrep SAST Scan Temukan Kode Tidak Aman
Hari kedelapan 60 hari DevSecOps! Install Semgrep, buat kode insecure (MD5), dan scan ketemu 2 finding — MD5 weak hash dan HTTP server tanpa TLS.
Hari 10: MD5 ke Bcrypt, Pipeline Hijau Lagi
Hari kesepuluh 60 hari DevSecOps! Fix SAST findings — ganti MD5 ke bcrypt, hapus custom rule HTTP TLS, dan pipeline CI kembali hijau setelah 4 job semua pass.