deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

PyPI'daki kötü niyetli LiteLLM 1.107.0, her Python sürecinde kimlik avlayıcısı çalıştırdı

SafeDep'un analizine göre PyPI'da yayımlanan LiteLLM 1.107.0 sürümü, bulaşan bir ana makinedeki herhangi bir Python sürecinde çalışan bir kimlik avlayıcı ve saatlik bir arka kapı içeriyordu. PyPI sürümü kaldırdı.

PyPI'daki kötü niyetli LiteLLM 1.107.0, her Python sürecinde kimlik avlayıcısı çalıştırdı

SafeDep'un analizine göre, 21 Ekim 2026'da PyPI'da yayımlanan LiteLLM 1.107.0 sürümü, bir kimlik avlayıcı ve uzaktan kod çalıştırma arka kapısıyla birlikte geldi. Linux, macOS ve Windows için hazırlanan yedi wheel dosyasının tamamı, yükü site-packages içine üç dosya olarak kurdu ve kötü niyetli kod, ana makinede herhangi bir Python süreci başladığında — litellm'i hiç içe aktarmayan süreçler dahil — çalıştı. PyPI sürümü kaldırdı ve yukarı akış GitHub deposu asla bu implantı içermedi.

Kötü niyetli kod ne yaptı

litellm 1.107.0'ı kurmak site-packages içine üç dosya bıraktı; bunlardan ikisini Python, yorumlayıcı başlangıcında otomatik olarak çalıştırıyor. cook.pth, tek satırlık "import cook" ifadesini içeriyordu ve bu ifade avlayıcı olan cook.py'yi yüklüyordu. Python'un tasarım gereği başlangıçta içe aktardığı bir modül olan sitecustomize.py ise arka kapı daemon'unu başlatıyordu.

SafeDep, cook.py'nin yaklaşık 61 KB'lık Python kodunu exec(zlib.decompress(base64...)) katmanının içinde sarmaladığını tespit etti. Çalışmaya başladığında SSH anahtarlarını, AWS, Azure ve Google Cloud kimlik bilgilerini, Kubernetes ve Docker yapılandırmalarını, tarayıcı parolaları ve geçmişini, GPG anahtarlarını ve ortam değişkenlerini — /proc üzerinden okuyarak diğer süreçlerinkiler dahil — topladı. Ayrıca GitLab runner yapılandırmaları, Jenkins kimlik bilgileri ve Vault token'ları gibi CI/CD sırlarının yanı sıra Claude Code, Cursor, Copilot, Gemini CLI ve Codex gibi yapay zekâ geliştirici araçlarının kimlik doğrulama token'larını da ele geçirdi. LiteLLM dağıtımları açısından en yıkıcı etkisi ise DATABASE_URL'yi okuyup LLM sağlayıcı API anahtarlarını barındıran proxy veritabanı tablolarını dökmesiydi.

Sonuçlar rastgele bir AES-256-CBC anahtarıyla şifrelendi; bu anahtar da RSA-OAEP ile sarıldı, bir tar.gz paketine kondu ve www.litellm[.]dev/healthcheck adresine gönderildi. /tmp altındaki bir işaret dosyası, toplama işlemini ana makine başına bir kezle sınırladı.

sitecustomize daemon'u, makine başına yalnızca bir kopyanın çalışmasını sağlayan münhasır bir kilit aldı, fork() ve setsid() ile kendini ayırdı ve ardından her saatte, saldırgan kontrolündeki bir GitHub deposundaki bir dosyadan sunucu adresini okudu, avlayıcının kendi kopyasını (ana makine başına bir kez sınırı olmadan) yeniden çalıştırdı ve o sunucudan codepy adlı bir yük indirip çalıştırdı. Adres düzenlenebilir bir GitHub dosyasında bulunduğundan, bulaşmış ana makineler istenildiği zaman yeniden yönlendirilebiliyordu.

İmplant sürüme nasıl girdi

Kaynak dağıtımındaki tek görünür fark, pyproject.toml dosyasının maturin build bölümüne eklenen tek satırdı — data = "cook" — ve bu satır bir cook/ klasörünü wheel içine kopyalıyor, pip de oradan site-packages'a kuruyordu. sdist'in kendisi cook/ klasörünü içermiyordu ve gerçek yükü gizliyordu. BerriAI/litellm deposundaki hiçbir herkese açık commit bu satırı veya klasörü içermiyor.

Sürüm ayrıca git etiketiyle örtüşmüyordu. SafeDep'a göre v1.107.0 etiketi, pyproject.toml dosyasında 1.108.0 sürümünü bildiren bir commit'e işaret ediyor; yayımlanan sdist ise main'deki daha sonraki bir commit ile beş düzenlenmiş dosya ve cook/ klasörüne karşılık geliyor. Bu düzenlemelerden biri, eşlik eden paketleri önceki sürüm adayıyla aynı değerlere sabitliyordu; bu yüzden rc2 ile yapılan rutin bir bağımlılık karşılaştırması olağan dışı hiçbir şey göstermedi.

Projeye ait pipeline tarafından üretildi

Adli inceleme ayrıntıları, wheel'lerin saldırganın kendi makinesinden değil BerriAI'nin normal sürüm pipeline'ından çıktığına işaret ediyor. Meşru sürümlerle aynı olan maturin 1.9.4 ile derlendiler, derleme sonrası düzenleme içermeyen doğru RECORD girdileri taşıyorlar ve zip zaman damgaları macOS (11:20 UTC), Linux (11:21) ve Windows (11:37) için ayrı yerel derlemeler gösteriyor. Windows wheel'inde, üç implant dosyası dahil tüm 2.804 .py dosyası, Windows'ta satır sonu dönüşümüyle yapılan bir git checkout'un ürettiği desen olan CRLF satır sonlarına sahip.

Ancak 09:30 ile 12:30 UTC arasında gerçekleşen 539 herkese açık GitHub Actions çalışmasının hiçbiri bu sürümü derlemedi veya yayımlamadı ve PyPI'da bu sürüme ait hiçbir provenance attestation bulunmuyor. SafeDep, orta ile yüksek arası bir güvenle, projenin özel sürüm pipeline'ının bu wheel'leri saldırgan tarafından değiştirilmiş git kaynağından derlediğini değerlendiriyor — bu, büyük olasılıkla ele geçirilmiş bir maintainer veya bot kimlik bilgisi, özel bir dal veya yansı ya da pipeline'ın derleme kaynağı olan referansın manipüle edilmesi yoluyla gerçekleşmiş olabilir. Saldırgan makinelerinden kullanılan çalınmış bir PyPI token'ı kanıtlarla daha az örtüşüyor; bu sorunu yalnızca BerRIAI'nin pipeline günlükleri çözabilir.

Yaklaşık 13:40 UTC'de, yüklemeden kabaca iki saat sonra, sürüm PyPI'dan kayboldu ve saldırganın GitHub hesabı silindi. Daemon artık bir sunucu adresi bulamıyor ve hiçbir şey yapmıyor; ancak daha önce bulaşmış ana makineler ikinci aşama kodu çoktan almış olabilir. SafeDep sunucu adresini kurtaramadı.

Neden önemli

Olay, üç rahatsız edici ders içeren ciddi bir tedarik zinciri ihlalidir. Birincisi, .pth ve sitecustomize teknikleri paketin güven sınırını aşıyor: CI runner'ında veya geliştirici dizüstü bilgisayarındaki tek bir kötü wheel, yalnızca LiteLLM'inkileri değil, ana makinedeki herhangi bir Python sürecinin görebildiği her sırrı açığa çıkarıyor. İkincisi, hedef listesi — bulut kimlik bilgileri, CI/CD sırları, yapay zekâ aracı token'ları ve LiteLLM'ın proxy veritabanındaki LLM sağlayıcı anahtarları — saldırganların yapay zekâ ağ geçitlerini birincil kimlik bilgisi deposu olarak gördüğünü gösteriyor. Üçüncüsü, saldırı yaygın inceleme uygulamalarını alt ediyor: önceki sürüm adayıyla yapılan bağımlılık karşılaştırması temizdi ve provenance attestation ya da herkese açık derleme günlükleri olmadan özel bir pipeline içindeki oynama neredeyse görünmezdir. SafeDep, 1.106.2, 1.107.0rc1 ve 1.107.0rc2 sürümlerinin temiz olduğunu doğruladı; bu yüzden 1.107.0'ı indiren herkes onu kaldırmalı ve SafeDep'un yayımladığı ihlal göstergelerini kontrol etmeli.

  • #supply-chain
  • #security
  • #pypi
  • #python
  • #litellm

İlgili yazılar