PyPI Üzerindeki Ele Geçirilmiş LiteLLM 1.107.0 Sürümü Kimlik Bilgisi Hırsızı ve Arka Kapı Yükler
Kaynak: Hacker News
İçindekiler 3 başlık
PyPI üzerindeki LiteLLM 1.107.0 sürümü, bir kimlik bilgisi hırsızı (credential stealer) ve uzaktan kod yürütme arka kapısı (backdoor) barındırmaktadır. Linux, macOS ve Windows için sunulan yedi wheel paketinin tamamı, bu zararlı bileşenleri site-packages dizinine üç dosya olarak yükler. Bu dosyalar, litellm paketini hiç içe aktarmayan (import etmeyen) süreçler dahil olmak üzere, ana bilgisayarda herhangi bir Python süreci başladığında otomatik olarak çalışır.
Orijinal GitHub kaynak kodunda bu zararlı dosyalar yer almamaktadır ve PyPI ilgili sürümü yayından kaldırmıştır. 1.106.2, 1.107.0rc1 ve 1.107.0rc2 sürümleri temizdir. Ayrıca 1.107.0 sürümünün sabitlediği eşlikçi paketler olan litellm-proxy-extras==0.4.110 ve litellm-enterprise==0.1.78 paketlerinde de herhangi bir güvenlik sorunu bulunmamaktadır.
Saldırı Ne Yapıyor?#
litellm==1.107.0 kurulumu site-packages içerisine üç dosya yerleştirir ve Python her başladığında bunlardan ikisini otomatik olarak yükler:
cook.pth, bir kimlik bilgisi hırsızı olancook.pydosyasını içe aktarır. SSH anahtarlarını, bulut kimlik bilgilerini, CI/CD sırlarını, yapay zeka aracı token'larını, tarayıcı şifrelerini ve LiteLLM proxy veritabanındaki LLM sağlayıcı anahtarlarını toplar. Verileri şifreleyerekwww.litellm[.]devadresine gönderir.sitecustomize.py, arka planda çalışan bir servis (daemon) başlatır. Bu servis her saat başı bir GitHub dosyasından sunucu adresi okur, kimlik bilgisi hırsızını tekrar çalıştırır ve ilgili sunucudan kod indirip yürütür.
Geliştiriciler İçin Pratik Çıkarım: Python'da .pth dosyaları ve sitecustomize.py mekanizması, hiçbir kod satırı çalıştırılmasa bile yorumlayıcı başlangıcında devreye girer. Bu nedenle AI geliştirme ortamlarında paket güncellemelerini doğrudan üretim veya yerel makinelere kurmak yerine izole container ortamlarında ve sabitlenmiş (pinned) güvenli sürümlerle yönetmek kritik önem taşır.
Zararlı İmplant Sürüme Nasıl Girdi?#
1.107.0 kaynak dağıtımındaki (sdist) pyproject.toml dosyası, maturin derleme bölümünde fazladan bir satır içerir:
[tool.maturin]
python-source = "."
data = "cook" # <-- enjekte edilen satır
python-packages = ["litellm_cli"] # meşru (upstream'de mevcut)
Maturin'deki data = "cook" ayarı, wheel paketi içerisindeki litellm-1.107.0.data/purelib/ dizinine bir cook/ klasörü kopyalar ve pip bu klasörü doğrudan site-packages içine yükler. Kaynak dağıtımda (sdist) cook/ klasörü yer almadığı için görünürdeki tek değişiklik bu satırdır. BerriAI/litellm deposundaki hiçbir açık commit data = "cook" satırını veya cook/ klasörünü içermez.
Wheel paketinin RECORD dosyası eklenen üç zararlı dosyayı listeler:
litellm-1.107.0.data/purelib/cook.pth(12 bayt —"import cook")litellm-1.107.0.data/purelib/cook.py(22.252 bayt —exec(zlib.decompress(b64decode(...))))litellm-1.107.0.data/purelib/sitecustomize.py(25.509 bayt — yükleyici/arka kapı ve gömülü hırsız)
Sürüm Kendi Etiketiyle Eşleşmiyor#
GitHub üzerindeki v1.107.0 etiketi 66c8f5b (06:59 UTC) commit'ini işaret etmektedir ve bu noktadaki pyproject.toml dosyasında version = "1.108.0" yazmaktadır. SafeDep, sdist içindeki her dosyayı blob hash değerleriyle git ağaçlarıyla karşılaştırmıştır. Sonuç olarak sdist paketinin daha sonraki bir main commit'i olan a8113b0 (08:50 UTC) ile eşleştiği, buna ek olarak beş düzenlenmiş dosya ve cook/ klasörünü içerdiği görülmüştür. Düzenlenen dosyalardan dördü readme = "README.md" satırı eklenen Cargo.toml dosyalarıdır (meşru 1.106.2 ve rc2 sürümlerinde de aynı düzenleme vardır). Beşinci dosya ise sürüm numarasının 1.108.0'dan 1.107.0'a düşürüldüğü ve bağımlılıkların değiştirildiği pyproject.toml dosyasıdır.
Pratik Çıkarım: Açık kaynaklı bir paketin GitHub kaynak kodu ile PyPI üzerindeki derlenmiş (wheel) paketi her zaman birebir aynı olmayabilir. Tedarik zinciri güvenliği için paketlerin yalnızca kaynak koduna değil, yayınlanan artifact'lerin bütünlüğüne ve hash doğrulamalarına da dikkat edilmelidir.
Orijinal makaleye buradan ulaşabilirsiniz.
Bu konuyu derinlemesine öğrenmek isterseniz: AI Tedarik Zinciri Güvenliği modülüne göz atın.
Kaynak ve atıf
Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:
- safedep.io/litellm-pypi-compromise-credential-stealer-backdoor