Selamlar,
21 Ekim'de PyPI ve Docker'a yüklenen zararlı litellm==1.107.0 sürümünü daha önce konuşmuştuk. LiteLLM ekibi saldırının nasıl başladığını adım adım anlatan bir inceleme yayımladı. Başlangıç noktası şaşırtıcı derecede sıradan: Mayıs ayında herkese açık bir repoya yanlışlıkla gönderilen ve hiç iptal edilmeyen tek bir ana anahtar. Burada zinciri halka halka açıyorum.
Konuda anlatılacaklar
- Halka 0: Herkese açık repoya düşen ana anahtar
- Halka 1: Ajan platformundan GitHub token'ına
- Halka 2-3: Geçici branch'lerle sır toplama
- Halka 4-5: Benzer isimli fork'tan zararlı sürüm
- Halka 6-7: İz temizleme
- Python başlangıç kancası tehlikesi
- Çıkarılacak dersler
1. Halka 0: Sızan ana anahtar
LiteLLM'in zaman çizelgesine göre (saatler UTC):
Alıntı:27 Mayıs 18:53 - opencode.json dosyası, Agent Platform ana anahtarını içerecek şekilde herkese açık bir LiteLLM-Labs reposuna gönderildi.Hata hızla fark edildi, commit force-push ile üstüne yazıldı ve anahtarların iptal edilmesi gerektiği belirlendi. Ancak ana anahtarın iptali hiç gerçekleşmedi. Force-push bir sırrı geri almaz; git geçmişi üstüne yazılsa bile sır bir kez dışarı çıktıysa yakılmalıdır.
2. Halka 1: GitHub token'ına geçiş
LiteLLM Agent Platform, kendinden barındırılan bulut ajanlarının GitHub'a PR açabilmesi için deneysel bir projeydi ve bir GitHub kimlik doğrulama token'ıyla yapılandırılmıştı. Bu token:
- Bir servis hesabına bağlı değildi,
- yetkileri daraltılmamıştı,
- organizasyon sahibinin hesabına bağlı bir GitHub CLI OAuth token'ıydı.
3. Halka 2-3: Sır toplama
10 Ekim 22:11-22:12 arası saldırgan, ci-tmp önekli geçici branch'lerde iş akışları çalıştırarak altı sırrı (GH_TOKEN ve RELEASE_PLEASE_TOKEN dahil) bir webhook.site uç noktasına gönderdi, sonra çalışmaları dakikalar içinde sildi. 12 Ekim'de ise çeşitli özel repolarda iş akışları çalıştırıp tüm repo sırlarını aynı uca sızdırdı.
4. Halka 4-5: Zararlı sürüm
21 Ekim sabahı (UTC):
10:08:34 branch korumasını geçersiz kılarak main'e push
10:46:39 staging iş akışı, kaynak benzer isimli "Berri-AI/litellm" fork'una ayarlandı
(gerçek repo: BerriAI/litellm)
11:08:53 üretim yayın hattı başladı
11:39-11:40 yedi adet litellm==1.107.0 wheel PyPI'ya yüklendi
11:46:56 Docker Hub ve GHCR imajları yayımlandı5. Halka 6-7: İz temizleme
11:53-11:54 arası üretim ve staging çalışma kayıtları silindi. 12:06'da bir araştırmacı saldırıyı bildirdi. 13:23 civarı PyPI, 1.107.0'ı karantinaya aldı.
6. Payload: Python başlangıç kancası
Microsoft'un analizine göre zararlı sürümün kritik yanı: bir uygulamanın LiteLLM'i import etmesine bile gerek yoktu. Etkilenen ortamda Python'ı başlatmak, kimlik bilgisi/sır/ortam değişkeni çalan payload'u tetikliyordu. Bu, .pth / sitecustomize tarzı başlangıç kancası riskinin canlı bir örneği.
7. Çıkarılacak dersler
- Sızan sır = yakılacak sır. Force-push veya "üstüne yazdık" asla iptal yerine geçmez. Her sızan anahtarı hemen döndürün (rotate).
- Token'ları daraltın ve servis hesabına bağlayın. Organizasyon sahibinin geniş kapsamlı kişisel token'ı otomasyona verilmez.
- Sürüm onayındaki dört göz ilkesini gevşetmeyin. "Hız için geçici" istisnalar tam da saldırıya davetiye çıkardı.
- Kaynak repo bütünlüğünü doğrulayın. Benzer isimli fork (Berri-AI vs BerriAI) klasik typosquat tuzağı.
- Bağımlılıkları hash ile sabitleyin. pip --require-hashes, npm ci ve imaj digest'leri bu tür bir sürümü kapıda durdurur.
Sonuç
LiteLLM saldırısı, tedarik zinciri güvenliğinin en sık tekrarlanan dersini bir kez daha gösterdi: en zayıf halka çoğu zaman unutulmuş bir anahtar ya da gevşetilmiş bir süreç kuralı. Sizin CI/CD hattınızda sürüm onayı kaç kişinin eline bakıyor?
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
