← Radar

Konu: Güvenlik3 dk okuma

Trivy: Yayına çıkmadan önce imajını ve kodunu bilinen açıklar için tara

Bu neden önemli?

Bir imajın derlenip çalışması, içinde yamalanmış bir kütüphane olduğu anlamına gelmiyor. Taramayı CI'a koymak bunu yayından önce yakalamanın en ucuz yolu. Trivy'nin başına gelenler ise CI'da çalışan her aracın, güvenlik aracı bile olsa, bir saldırı kapısı olabileceğini gösteriyor.

Neyi tarıyor?

Trivy, Aqua Security’nin geliştirdiği açık kaynak bir güvenlik tarayıcısı. Belgelerine göre iki soruya cevap veriyor: Neyi tarayayım ve ne arayayım?

  • Hedefler: Container imajı, dosya sistemi, Git deposu, sanal makine imajı, Kubernetes kümesi ve SBOM (yazılımın içindeki bütün paketlerin listesi).
  • Tarayıcılar: Bilinen açıklar (CVE), hatalı ayarlar (Dockerfile, Kubernetes, Terraform gibi IaC dosyaları), kodda unutulmuş gizli anahtarlar ve lisanslar.

Videoda kurulum bile yok. Trivy’yi bir Docker container’ı olarak çalıştırıp resmî nginx imajını tarıyor. Sonra kasten kötü yazılmış bir Dockerfile’ı tarayıp root kullanıcısıyla çalışma gibi sorunları gösteriyor. Videoya göre Docker Hub’daki imajların büyük çoğunluğunda yüksek ya da kritik seviyede açık var. GitLab’in container taraması da arka planda Trivy kullanıyor.

Açığı nasıl buluyor?

Trivy imajın içindeki paketlerin listesini çıkarıp bir açık veritabanıyla karşılaştırıyor. Burada iki tür paket var:

  • İşletim sistemi paketleri (apt, apk ile gelenler). Trivy bunlar için dağıtımın kendi güvenlik kayıtlarına bakıyor: Debian, Ubuntu, Red Hat, Alpine.
  • Dil paketleri (npm, pip, Maven, Go). Bunlar için ağırlıklı olarak GitHub Advisory Database kullanılıyor.

Önem seviyesi de bu kaynaktan geliyor. Belgelerdeki örnek güzel: Aynı açık NVD’de “HIGH”, Red Hat’te “Low” görünebiliyor, çünkü dağıtım kendi derlemesindeki gerçek etkiyi biliyor.

Sonucu okumak

Her satırda paket, CVE numarası, önem seviyesi, yüklü sürüm ve düzeltilmiş sürüm (fixed version) var. En işe yarayan sütun sonuncusu: Sana “şu sürüme geç” diyor. Düzeltmesi henüz çıkmamış açıkları --ignore-unfixed ile gizleyebilirsin. Bilerek kabul ettiğin bir açığı .trivyignore dosyasına yazarsın. Oraya bir bitiş tarihi (exp:2026-06-01) koymak iyi bir alışkanlık: Kural sonsuza kadar unutulup kalmaz. Açık sayısını baştan azaltmanın bir yolu sertleştirilmiş temel imajlar: Docker Hardened Images yazımız.

CI’da kullanmak

Asıl değer, taramanın pipeline’ı durdurabilmesi. trivy image --severity HIGH,CRITICAL --exit-code 1 benim-imajim gibi bir komut, kritik bir açık bulursa hata koduyla çıkıyor ve derleme duruyor. GitHub Actions için hazır trivy-action var.

Sınırını da bil: Trivy sadece bilinen ve kayda geçmiş açıkları buluyor. Henüz duyurulmamış bir açığı ya da yeni yayımlanmış zararlı bir paketi göremez. axios saldırısındaki gibi sürümler ilk saatlerde hiçbir veritabanında yoktu.

Sonra ne oldu?

Bu videodan on gün sonra Trivy’nin kendisi hedef oldu. Aqua’nın ve GitHub’daki güvenlik bildiriminin (CVE-2026-33634) anlattığı zincir şöyle:

  • 28 Şubat 2026: hackerbot-claw adlı otomatik bir bot, Trivy deposundaki pull_request_target tetikleyicili bir iş akışını kullanıp yetkili bir token çaldı. Depo bir süre gizlendi, v0.27.0 ile v0.69.1 arasındaki GitHub sürüm sayfaları silindi. Aqua 1 Mart’ta anahtarları yeniledi, ama yenileme tek seferde yapılmadı. Saldırgan elindeki erişimi korudu.
  • 19 Mart: Saldırgan trivy-action’ın 77 sürüm etiketinden 76’sını ve setup-trivy’nin 7 etiketinin hepsini zararlı koda yönlendirdi. Ayrıca zararlı bir Trivy v0.69.4 yayımladı. Kod, CI makinesinin belleğinden ve diskinden bulut anahtarlarını, SSH anahtarlarını, token’ları topluyor, şifreleyip aquasecurtiy diye yanlış yazılmış bir alan adına gönderiyordu. Action tarafı yaklaşık 12 saat açık kaldı.
  • 22 Mart: Docker Hub’a ayrıca zararlı 0.69.5 ve 0.69.6 imajları yüklendi.
  • 24 Mart: LiteLLM, PyPI’da yaklaşık 40 dakika kalan iki zararlı sürümün, CI’daki güvenlik taramasında kullandıkları Trivy’den kaynaklandığını düşündüğünü yazdı.

Bildirime göre Action’ı Nisan 2025’ten sonraki bir commit SHA’sına sabitleyenler etkilenmedi, çünkü saldırgan etiketleri taşıdı, commit’leri değiştiremedi. Bu yüzden ders aynı: uses: aquasecurity/trivy-action@v0.34.0 yerine tam commit SHA’sını yaz. Tarayıcıya sadece ihtiyacı olan izinleri ver. Aynı pull_request_target tuzağının birkaç ay sonra nasıl tekrarlandığını TanStack yazımızda anlattık. Trivy bugün aktif: Son sürüm 14 Ekim 2026’da çıkan v0.76.0.

Güncelleme: LiteLLM Ekim’de bu kez Trivy’den bağımsız ikinci bir tedarik zinciri saldırısı yaşadı (LiteLLM 1.107.0 yazısı).

Düşün

  • CI’ında çalışan üçüncü taraf action’ların kaçı etiketle, kaçı SHA ile sabitli?
  • Güvenlik tarayıcın hangi gizli anahtarları görebiliyor? Gerçekten görmesi gerekiyor mu?

Videoyu izle

Tıklayınca video YouTube'dan yüklenir; o ana kadar bu sayfa YouTube'a hiçbir istek göndermez.
Kaynaklar (11, İngilizce)

Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.