LiteLLM'e Zararlı Kod Bulaştı: Yapay Zeka Tedarik Zinciri Saldırısı Projelerin İçin Ne Anlama Geliyor?
Arka kapılı LiteLLM 1.107.0, PyPI ve Docker Hub'a ulaştı ve Python her açıldığında bulut ve yapay zeka anahtarlarını çaldı. Ne oldu, sistemlerini nasıl kontrol edersin ve bir dahaki sefere hasarı sınırlayan beş alışkanlık.

21 Ekim 2026'da, ekiplerin OpenAI, Anthropic, Bedrock ve onlarca model sağlayıcısına tek bir kapıdan bağlanmak için kullandığı popüler Python kütüphanesi LiteLLM'in zararlı bir sürümü PyPI ve Docker Hub'da yayınlandı. 1.107.0 sürümü sıradan bir güncelleme gibi görünüyordu. Aslında bir kimlik bilgisi hırsızıydı.
Zararlı sürüm yaklaşık iki saat yayında kaldı, ama Wiz'in tespitine göre bu sürede yaklaşık 49.000 kez indirildi. Üstelik bu, LiteLLM'in yayın sürecinin bu yıl ikinci kez ele geçirilmesi. LLM'lerle bir şey geliştiriyorsan, bu olaya on dakika ayırmaya değer.
Ne oldu?
LiteLLM'in kendi olay raporuna göre yayın hattı (release pipeline) ele geçirildi ve yayınlanan 1.107.0 paketleri derlenmiş zararlı yazılım içeriyordu. GitHub'daki kaynak kod etiketi temizdi; zehirlenen yalnızca derlenmiş paketlerdi. StepSecurity, paketlerin gerçek depo yerine ona benzeyen sahte bir GitHub deposundan derlendiğini tespit etti.
Etkilenenler:
- PyPI'daki yedi
litellm==1.107.0paketinin (wheel) hepsi v1.107.0Docker imajları ve o sürüme işaret ettikleri süre boyuncalatest,main-latestvemain-stableetiketleri
Etkilenmeyenler: 1.106.2, 1.107.0rc1 ve 1.107.0rc2.
Neden bu kadar tehlikeliydi: import edilmeden çalışıyordu
Çoğumuz zararlı bir paketin ancak kodumuz onu import ettiğinde zarar verebileceğini düşünürüz. Bu paket beklemedi. Her paket site-packages klasörüne üç dosya bırakıyordu: cook.pth, cook.py ve sitecustomize.py. Python, .pth dosyalarını ve sitecustomize'ı yorumlayıcı her başladığında çalıştırır. Yani o ortamdaki her Python süreci zararlı kodu çalıştırdı: uygulaman, testlerin, tek seferlik bir betik, hatta pip'in kendisi bile.
Microsoft ve Datadog sonrasını şöyle anlatıyor: makinedeki bulut ve yapay zeka kimlik bilgilerini topluyor, ardından her saat uzaktan kod indirip çalıştıran bir yükleyici kuruyordu. Bir yapay zeka geçidinin (gateway) çalıştığı makine, bunun için akla gelebilecek en kötü yer: bu makineler zaten şirketin kullandığı bütün model sağlayıcılarının API anahtarlarını tutmak için var.
Sistemlerini şimdi kontrol et
- Bul. Her ortamda ve imajda
pip show litellmçalıştır; lock dosyalarında ve CI loglarında1.107.0ara. Docker sunucularında yukarıdaki etiketleri kontrol et. - Kaldır.
site-packagesiçindencook.pth,cook.pyve beklenmeyen birsitecustomize.pyvarsa sil, ardındanlitellm==1.106.2sürümüne sabitle. Ortamı ya da imajı sıfırdan kurmak, temizlemeye çalışmaktan daha güvenli. - O makinenin okuyabildiği her sırrı yenile ve bunu başka, temiz bir makineden yap: model sağlayıcı anahtarları, bulut kimlik bilgileri, veritabanı şifreleri, CI token'ları.
- Kullanımı denetle: 21 Ekim'den itibaren bu kimlik bilgileriyle yapılan işlemlere bak. Olağandışı API harcaması, yeni açılmış bulut kaynakları, bilinmeyen adreslerden girişler.
Bir dahaki sefere hasarı sınırlayan beş alışkanlık
Kurduğun her paketi tek tek denetleyemezsin. Ama zehirli tek bir sürümün canlıya ulaşmasını zorlaştırabilir, ulaşsa bile çalacak pek bir şey bulamamasını sağlayabilirsin.
1. Sürümleri tam sabitle ve lock dosyasından kur
litellm>=1.100 gibi bir aralık ya da latest imaj etiketi, beş dakika önce ne yayınlandıysa onu kabul ediyorsun demek. Sürümleri tam sabitle: requirements.txt'te ==, repoya eklenmiş bir package-lock.json ile npm ci, etiket yerine imaj özeti (digest). Böylece sen değiştirmedikçe hiçbir şey değişmez.
2. Sadece sürümü değil, özeti (hash) de sabitle
Sürüm numarası bir isimdir; hash ise içeriğin kendisi. pip install --require-hashes ile (ya da pip-tools, uv veya Poetry'nin lock dosyalarıyla) kurulum aracı, hash'i senin incelediğinle eşleşmeyen bir dosyayı reddeder. Hash sabitlemek, 1.107.0'a bilerek yükselten birini durdurmazdı; ama zaten güvendiğin dosyaların sessizce değiştirilmesini durdurur.
3. Yeni sürümleri almadan önce biraz beklet
Zehirli sürümlerin çoğu saatler ya da günler içinde fark edilir. Yeni sürümleri projelerine almadan önce kısa bir bekleme süresi koymak sana neredeyse hiçbir şeye mal olmaz ve bu olayı tamamen atlatırdı. Dependabot'un cooldown ayarı ve uv'nin exclude-newer ayarı tam olarak bunu yapıyor. Kendi projelerimde Dependabot ayda bir, gruplanmış güncelleme PR'ları açıyor ve her PR merge edilmeden önce build'den geçmek zorunda. Böylece bu sabah yayınlanan bir sürüm bu öğleden sonra canlıya çıkmıyor.
4. Her makineye sadece ihtiyacı olan anahtarları ver
Zararlı yazılım bulabildiği her şeyi çaldı. Her sağlayıcı için tek bir ortak ana anahtar tutan ve ortamında bulut yönetici yetkileri de bulunan bir yapay zeka geçidi, her şeyi tek seferde teslim eder. Her ortam ve servis için ayrı anahtar kullan, sağlayıcının izin verdiği kadar dar yetkilendir, harcama limiti koy ve build makinelerinde canlı ortam sırları tutma.
5. Hiç değişmemesi gerekenleri izle
Bir ortamda yeni beliren .pth ya da sitecustomize.py dosyaları, bir build işinden beklenmedik dış bağlantılar, birden derlenmiş kod getirmeye başlayan bir bağımlılık: bunları izlemek ucuz ve neredeyse hiçbiri masum değil. Socket, StepSecurity'nin Harden-Runner'ı ya da CI'da basit bir çıkış (egress) izin listesi tam olarak bu tür davranışları yakalar.
Büyük resim
Yapay zeka araçları, yazılım tedarik zincirindeki en cazip hedeflerden biri haline geldi. Kütüphaneler genç ve hızlı değişiyor, ekipler onları aceleyle kuruyor ve hepsi şirketin en değerli sırlarının yanında çalışıyor. Bu tablo yakında değişmeyecek. İyi haber şu: yukarıdaki alışkanlıkların hiçbiri yapay zekaya özel ya da pahalı değil. Hepsi her projeyi koruyan sıkıcı ama etkili bağımlılık hijyeni; sadece yığının en hızlı değişen kısmına uygulanıyor.
Kaynaklar
- LiteLLM: Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised
- LiteLLM: The attack chain behind the v1.107.0 release
- Microsoft Security: Inside the LiteLLM 1.107.0 supply chain compromise
- Datadog Security Labs: LiteLLM supply chain compromise
- Wiz: LiteLLM Compromised, Steals Credentials
- StepSecurity: litellm 1.107.0 Compromised on PyPI

