PyPI güvenlik ekibinin resmi tedarik zinciri saldırısı olay raporu: LiteLLM·Telnyx kötü amaçlı paket vakası ve savunma yöntemleri
(blog.pypi.org)🔑 Temel özet
Trivy bağımlılık zafiyeti üzerinden API token'ları ele geçirildi ve bu zemin kullanılarak PyPI'da litellm ve telnyx paketlerinin kötü amaçlı sürümleri dağıtıldı. Kötü amaçlı kod, kurulur kurulmaz çalışarak hassas kimlik bilgilerini ve dosyaları topladı, ardından bunları harici bir sunucuya sızdırdı.
⚠️ Bu kötü amaçlı yazılımı özel kılan ne
Önceki PyPI kötü amaçlı paketlerinin çoğu yeni oluşturulmuş paketlerdi (typosquatting vb.). Bu saldırı farklı. Halihazırda yaygın kullanılan açık kaynak paketlere kötü amaçlı kod enjekte etme yöntemini kullanıyor.
Enjeksiyon yolu iki tane:
- Güvenliği zayıf depo, release workflow veya kimlik doğrulamaya sahip açık kaynak projeleri doğrudan hedef almak
- En son sürümü yükleyen geliştirici makinelerinden API token'ları ve anahtarları çalmak
Çalınan PyPI veya GitHub API token'larıyla başka açık kaynak paketleri de ek olarak ihlal eden bir zincirleme saldırı yapısı söz konusu.
📅 Olay zaman çizelgesi
LiteLLM
Kötü amaçlı sürümün erişilebilir olduğu süre boyunca 119.000'den fazla kez indirildi.
PyPI, "kötü amaçlı yazılım bildirimi" özelliği üzerinden 13 bildirim aldı.
| Aşama | Süre |
|---|---|
| Yükleme → ilk bildirim | 1 saat 19 dakika |
| İlk bildirim → karantina | 1 saat 12 dakika |
| Toplam maruz kalma süresi | 2 saat 32 dakika |
LiteLLM haftada yaklaşık 15 ila 20 milyon kez kuruluyor ve dakikada yaklaşık 1.700 kurulum yapılıyor. Bunların yaklaşık %40-50'sinde sürüm sabitlenmemişti ve en son sürüm otomatik olarak alınıyordu.
Telnyx
telnyx paketi, PyPI'nin güvenilir bildirimci havuzu (trusted reporters) sayesinde otomatik olarak karantinaya alındı.
| Aşama | Süre |
|---|---|
| Yükleme → ilk bildirim | 1 saat 45 dakika |
| İlk bildirim → karantina | 1 saat 57 dakika |
| Toplam maruz kalma süresi | 3 saat 42 dakika |
🛡️ Geliştiriciler için güvenlik önerileri
1. Dependency cooldowns
Yakın zamanda yayımlanan paketlerin belirli bir süre boyunca kurulmasını engelleyerek güvenlik araştırmacılarına ve PyPI yöneticilerine müdahale için zaman kazandıran bir stratejidir.
uv — şu anda destekleniyor:
# ~/.config/uv/uv.toml 또는 pyproject.toml
[tool.uv]
exclude-newer = "P3D" # Son 3 gün içinde yayımlanan paketleri hariç tut
pip v26.1 — Nisan içinde desteklenecek:
# ~/.config/pip/pip.conf
[install]
uploaded-prior-to = P3D
> ⚠️ Cooldown her derde deva değildir. Güvenlik yaması gereken durumlarda paketin hemen kurulması gerekir; bu nedenle Dependabot·Renovate gibi zafiyet tarama araçlarıyla birlikte kullanılmalıdır.
2. Bağımlılık kilitleme (Lock files)
Yalnızca sürümleri kaydeden pip freeze bir lock file değildir. Güvenlik için checksum/hash içeren gerçek bir lock file gerekir.
Önerilen araçlar:
uv lockpip-compile --generate-hashespipenv
🔒 Açık kaynak bakımcıları için güvenlik önerileri
1. Release workflow güvenliğini güçlendirin
- Güvensiz tetikleyicileri kullanmayın — GitHub Actions'taki
pull_request_targetözellikle risklidir - Parametreleri ve giriş değerlerini zararsız hale getirin — template injection'ı önlemek için bunları ortam değişkenleri üzerinden geçirin
- Değişken referans kullanmayın — Git etiketi yerine commit SHA kullanın, bağımlılık lock file'larını koruyun
- İnceleme gerektiren dağıtım ayarları yapın — Trusted Publishers + GitHub Environments birleşimiyle dağıtım sırasında ek onay isteyin
GitHub Actions kullanıyorsanız workflow zafiyetlerini denetlemek için Zizmor aracını kullanmanız önerilir.
2. API token yerine Trusted Publishers kullanın
- API token'ları uzun ömürlüdür, bu yüzden çalındıklarında hemen tespit edilmeleri zordur
- Trusted Publishers kısa ömürlü token'lar kullanır; bu nedenle ele geçirilseler bile hemen kullanılmaları gerektiğinden risk daha düşüktür
- Digital Attestations sayesinde, normal release workflow'undan geçmeyen dağıtımlar alt kullanıcılar tarafından tespit edilebilir
3. 2FA'yı zorunlu uygulayın
PyPI, 2024'ten itibaren paket dağıtımı için 2FA'yı zorunlu hale getirdi. Ancak yalnızca PyPI hesabında değil, GitHub, GitLab, e-posta gibi açık kaynak geliştirmeyle ilişkili tüm hesaplarda da 2FA (mümkünse donanım anahtarıyla) uygulanmalıdır.
💰 Bu faaliyeti desteklemek için
PyPI güvenlik faaliyetleri Python Software Foundation (PSF) desteğiyle yürütülüyor. PSF sponsorluk programı, doğrudan bağış veya sponsors@python.org üzerinden iletişime geçebilirsiniz.
> Mike Fiedler ve Seth Larson'ın PyPI güvenlik mühendisi pozisyonları Alpha-Omega tarafından destekleniyor.
1 yorum
Bir MCP sunucusu oluşturup npm’e yüklemeyi denedim; bu olay raporu ise gerçekten ürkütücüydü.
MCP sunucuları da sonuçta doğrudan npm ve PyPI’a yükleniyor ve sürümü sabitlemeden kurulan epey çok durum var; ayrıca ihbar sistemi ya da trusted publisher gibi şeyler de henüz yok. LiteLLM yalnızca biraz daha fazla 2 saat açıkta kalmış olmasına rağmen indirme sayısı o seviyedeyse, bu tarafta bir kez içeri girildiğinde etkisinin oldukça uzun süre kalacağını düşündürüyor.
Claude Code tarafına da baktığımda,
pip installsırasında bu tür koruma ayarlarının düzgün devreye girmediği durumlar olduğunu gördüm; bu yüzden akışta ajan kendi kendine paket kuruyorsa, bunun tam olarak nerede engellenmesi gerektiği belirsizleşiyor.