Hari 7: Patch CVE di Go API, Pipeline Hijau Lagi
4 min read

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.

devsecops
trivy
sca
golang
cve
remediation
60-days-challenge
Share

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:

  1. Library deprecated (jwt-go) → ganti total ke library baru yang masih maintained
  2. 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.

Repo: github.com/stayrelevantid/chalange-devsecops

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait