← Radar

Konu: Güvenlik3 dk okuma

LiteLLM 1.107.0: AI uygulamalarının model kütüphanesi PyPI'da anahtar hırsızına dönüştü

Bu neden önemli?

LiteLLM, uygulamanın bütün model sağlayıcılarına giden anahtarları tek yerde tutan bir kütüphane. Saldırganlar artık tam bu anahtarların peşinde: Aynı hafta Railway ve OpenCode da AI anahtarlarını hedef alan saldırılar yaşadı. Ayrıca bu, LiteLLM'in bu yılki ikinci tedarik zinciri vakası.

Ne oldu?

LiteLLM, Python’da OpenAI, Anthropic, Google gibi onlarca model sağlayıcısına tek bir arayüzle bağlanmanı sağlayan bir kütüphane. Haftada yaklaşık 23 milyon kez indiriliyor. Birçok şirket onu “AI gateway” olarak, yani bütün model anahtarlarının durduğu bir ara sunucu olarak da çalıştırıyor.

21 Ekim 2026’da PyPI’a litellm 1.107.0 çıktı. Yedi wheel dosyasının hepsi zararlıydı. PyPI’da 11:39 ile 13:23 (UTC) arasında kaldı. Docker Hub ve GHCR’daki v1.107.0, latest, main-latest ve main-stable etiketleri de 11:46’dan itibaren zararlı imajı gösterdi: GHCR’da 13:51’e, Docker Hub’da 14:20’ye kadar. İlginç olan şu: GitHub’daki resmi v1.107.0 etiketi temiz. Paket, tire işaretiyle yazılmış sahte bir depodan (Berri-AI/litellm) derlenmişti.

Zararlı kod ne yapıyordu?

Paket site-packages’a üç dosya bırakıyordu: cook.pth, cook.py ve sitecustomize.py. Python, .pth dosyalarını ve sitecustomize.py’yi her açılışta kendiliğinden çalıştırıyor. Yani import litellm yazmana bile gerek yoktu. O ortamda çalışan her Python komutu, pip dahil, zararlı kodu tekrar tetikliyordu.

  • Hırsız: Bulut anahtarlarını (AWS, GCP, Azure), SSH ve GPG anahtarlarını, .env dosyalarını, Git, npm ve PyPI token’larını, tarayıcı şifrelerini topluyordu. Claude Code, Cursor, Codex gibi kodlama araçlarının ayarlarını ve LiteLLM proxy veritabanındaki sağlayıcı anahtarlarını da alıyordu. Hepsini şifreleyip litellm.dev adlı sahte bir alan adına gönderiyordu.
  • Yükleyici: Arka planda saatte bir GitHub’daki bir dosyaya bakıp oradan yeni Python kodu indirip çalıştıran bir süreç bırakıyordu. Datadog, bu ikinci aşamada gerçek bir yük görmediğini yazıyor.

Saldırgan nasıl girdi?

LiteLLM’in kendi kök neden analizi uzun bir zincir anlatıyor. Mayıs’ta bir ana anahtar (master key) yanlışlıkla herkese açık bir depoya commit’lenmiş. Commit silinmiş ama anahtar iptal edilmemiş. 10 Ekim’de saldırgan bu anahtarla iç bir servise girip bir organizasyon sahibinin GitHub CLI token’ını almış. Sonra CI’da geçici dallarda iş akışları çalıştırıp iki geliştiricinin daha token’ını sızdırmış. 21 Ekim’de dal korumasını kapatmış, sürüm iş akışını sahte depoya yönlendirmiş ve onay kapısını ikinci bir token’la geçmiş. Kayıtları da silmiş.

Bu, LiteLLM’in bu yılki ikinci vakası. Mart’taki 1.82.7 ve 1.82.8’i Trivy yazımızda anlatmıştık. Arada bağlantı olduğu gösterilmedi.

Etkilendin mi?

  • pip show litellm 1.107.0 diyorsa ortamı ele geçirilmiş say. Önce pip çalıştırma, o da zararlıyı tetikler.
  • Site-packages’ta cook.pth, cook.py, litellm-1.107.0.dist-info ve /tmp/remote_code_loader.lock dosyasını ara. Bulamaman temiz olduğunu kanıtlamaz.
  • Dosyaları sil, arka plan sürecini öldür. En iyisi ortamı ya da imajı sıfırdan kur, litellm==1.106.2’ye sabitle.
  • O makinenin erişebildiği her şeyi değiştir: bulut rolleri, sağlayıcı anahtarları, LiteLLM master ve sanal anahtarları, veritabanı şifresi.

Neden AI anahtarları?

Çalınan bir model anahtarı doğrudan para demek. Saldırgan senin hesabına binlerce dolarlık model çağrısı yapabiliyor ya da anahtarı satabiliyor. Bir modelin cevaplarını toplu toplayıp başka bir modeli eğitmek (distillation) için de kullanılıyor. Aynı hafta Railway, saldırganın AI sağlayıcı anahtarları için şifreli ortam değişkenlerinin bir kısmını çözdüğünü ve dağıtımları durdurduğunu açıkladı. OpenCode Console da kayıtlı sağlayıcı anahtarlarının sızmış olabileceğini duyurdu ve bunu büyük çaplı bir distillation saldırısına bağladı.

Hızlı mı, yavaş mı güncelleyeceksin?

Videonun sorusu güzel: Sıfırıncı gün açığına yakalanmayacak kadar hızlı, tedarik zinciri saldırısına yakalanmayacak kadar yavaş güncellemek. Pratikte:

  • Sabitle ve kilitle: Tam sürüm yaz, uv.lock gibi hash’li bir kilit dosyası kullan. Docker’da latest yerine digest kullan.
  • Yeni sürümü beklet: uv’de exclude-newer = "7 days", pip’te --uploaded-prior-to P3D birkaç günlük sürümleri dışarıda bırakıyor. Bu zararlı sürüm iki saat bile dayanmadı.
  • İstisnayı bilinçli yap: PHP2Shell gibi bir güvenlik yaması geldiğinde o paketi elle, hemen güncelle.

npm tarafındaki benzer ayarlar bu yazıda.

Düşün

  • Projende yeni bir sürüm yayımlandıktan kaç dakika sonra kurulabiliyor?
  • Bir makine ele geçirilse hangi anahtarları değiştirmen gerekir? Listesi elinde var mı?

Videoyu izle

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

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