Selamlar,
Yapay zeka uygulaması geliştiren herkesin yakından tanıdığı LiteLLM, 21 Ekim 2026'da ciddi bir tedarik zinciri saldırısına uğradı. LiteLLM; OpenAI, Anthropic, Google gibi sağlayıcıların önünde duran bir Python kütüphanesi ve proxy. Bu yüzden çalıştığı makinelerde genellikle çok sayıda sağlayıcı API anahtarı bulunur. Saldırganlar tam da bunu hedefledi: litellm==1.107.0 sürümü PyPI'ye ve resmi Docker imajlarına kimlik bilgisi çalan bir zararlı ve saatlik uzaktan kod yükleyiciyle birlikte yayınlandı.
Konuda anlatılacaklar
- Hangi paketler ve hangi zaman aralığı etkilendi?
- Zararlı nasıl çalışıyor: .pth ve sitecustomize hilesi
- Saldırganlar sürüm hattını nasıl ele geçirdi?
- Etkilendiyseniz yapmanız gerekenler (sıralama önemli)
- YZ altyapıları için çıkarılacak dersler
Etkilenen artefaktlar
LiteLLM'in resmi olay sayfasına göre:
- PyPI: litellm==1.107.0, yedi wheel'in tamamı; 11:39:51 - 13:23 UTC arası yayında kaldı.
- Docker Hub: v1.107.0, latest, main-latest ve main-stable etiketleri 11:46:56 - 14:20 UTC arasında zararlı imaj index'ine işaret etti.
- GHCR: Aynı etiketler 13:51 UTC'ye kadar etkilendi; litellm-database ve litellm-non_root imajları dahil.
Zararlı nasıl çalışıyor?
OSV kaydı (MAL-2026-2144) ve AISLE'nin analizine göre her wheel'e üç ekstra dosya eklenmiş: cook.pth, cook.py ve sitecustomize.py. Bunlar wheel içindeki .data/purelib/ dizininde durduğu için pip bunları doğrudan site-packages köküne kopyalıyor.
Kritik nokta şu: Python, site-packages içindeki .pth dosyalarında "import" ile başlayan satırları her yorumlayıcı başlangıcında çalıştırır; sitecustomize modülü de her başlangıçta otomatik içe aktarılır. Yani litellm'i hiç import etmeseniz bile, o ortamda Python'un her açılışı zararlıyı tetikler.
- cook.py: AISLE'ye göre zlib + base64 ile paketlenmiş yaklaşık 60 KB'lık bir hırsız. Tarayıcı parolaları ve geçmişi, SSH/GPG/TLS anahtarları, kabuk geçmişi, AWS/GCP/Azure kimlik bilgileri ve bulut metadata servisi, Kubernetes token'ları, CI/CD sırları, YZ geliştirici araçlarının yapılandırmaları ve tüm ortam değişkenleri hedefte. Veri şifrelenip benzer görünümlü bir alan adına (litellm.dev; gerçek proje litellm.ai kullanıyor) gönderiliyor.
- sitecustomize.py: Arka plana çatallanan, kilit dosyası ile tek kopya çalışan ve her saat GitHub'daki bir dosyadan alan adı okuyup oradan kod indirip çalıştıran bir yükleyici. AISLE incelediğinde liste boştu; yani saldırgan istediği an tek dosya düzenlemesiyle tüm enfekte makinelere kod gönderebilecek durumdaydı.
Sürüm hattı nasıl ele geçirildi?
LiteLLM'in açıklamasına göre saldırganın elinde üç geliştiriciye ait GitHub CLI OAuth token'ı vardı. Bunlardan biri organizasyon sahiplerinden birine aitti. Saldırgan bu token ile branch korumasını aşıp release workflow'unu benzer isimli bir depoya (Berri-AI/litellm, gerçek depo BerriAI/litellm) yönlendirdi, ikinci hesapla production onayını verdi, üçüncü hesapla da workflow kayıtlarını sildi.
Token'ların nasıl ele geçtiğine dair şirketin şu anki değerlendirmesi dikkat çekici: İnternete açık dahili bir LiteLLM kurulumunda beklenmeyen bir kullanıcı hesabı bulundu; belirli durumlarda bir YZ kodlama asistanının yanıt gövdesine GitHub CLI token'ını gömdüğü ve yanıtlar loglandığında bu token'ların LiteLLM loglarına düştüğü gözlemlendi. Saldırganın bu loglardan token'ları aldığı düşünülüyor; ilk erişim yöntemi henüz doğrulanmadı.
Etkilendiyseniz: sıralama önemli
LiteLLM'in yayınladığı adımlar, önce pip çalıştırmamanızı söylüyor; çünkü pip de bir Python başlangıcı ve zararlıyı yeniden tetikler.
- Kabuktan, etkilenen her site-packages içinden cook.pth, cook.py, sitecustomize.py ve ilgili __pycache__ dosyalarını silin.
- /tmp/remote_code_loader.lock dosyasını tutan arka plan Python sürecini sonlandırın.
- litellm==1.106.2 ile yeniden kurun; tercihen sanal ortamı veya imajı sıfırdan oluşturun.
- Makinenin erişebildiği her şeyi döndürün: instance/task IAM rolü, proxy veritabanındaki tüm sağlayıcı anahtarları, master ve virtual key'ler, DATABASE_URL parolası, süreç ortamındaki tüm sırlar.
- AWS'de CloudTrail'de kurulum zamanı civarında GetCallerIdentity çağrılarına ve rol kimlik bilgilerinin dış ağlardan kullanımına bakın.
# Kendi ortamınızda hızlı kontrol (Python'u başlatmadan dosya araması)
find / -path /proc -prune -o \( -name "cook.pth" -o -name "cook.py" -o -name "litellm-1.107.0.dist-info" \) -print 2>/dev/null
ls -la /tmp/remote_code_loader.lock /tmp/.pc_once_* 2>/dev/null
# Konteyner: çalışan imajın digest'i
docker inspect --format '{{index .RepoDigests 0}}' <konteyner_adi>YZ altyapıları için dersler
- Üretimde asla floating "latest" etiketi kullanmayın; imajı digest ile, Python paketlerini hash ile sabitleyin.
- YZ gateway'leri bir "anahtar kasası" gibi davranır; ağ erişimini, log içeriğini ve yönetici hesaplarını buna göre koruyun.
- Geliştirici makinelerindeki gh token'larını düzenli gözden geçirin; YZ asistanlarının yanıtlarının loglandığı yerlerde sır sızıntısı riskini hesaba katın.
Siz YZ gateway'i olarak LiteLLM ya da benzeri bir proxy kullanıyor musunuz? Sürüm sabitleme politikanız nasıl, yorumlarda konuşalım.
Yasal uyarı
Bu yazı bilgilendirme ve savunma amaçlıdır. Anlatılan kontrolleri yalnızca kendi sistemlerinizde veya yazılı izinle yapın. İzinsiz erişim, tarama ve sömürü girişimleri TCK 243-245 kapsamında suçtur. TurkTeam white-hat bir topluluktur; çalıntı veri, hesap, combo/log paylaşımı ve hack hizmeti talepleri forum kurallarına aykırıdır.
Kaynaklar
