Konuyu Okuyanlar: 1 Ziyaretçi

LiteLLM Saldırı Zinciri: İptal Edilmeyen Tek Anahtar Nasıl PyPI'ya Uzandı?

LiteLLM Saldırı Zinciri: İptal Edilmeyen Tek Anahtar Nasıl PyPI'ya Uzandı?
[Resim: attachment.php?aid=419]

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
  1. Halka 0: Herkese açık repoya düşen ana anahtar
  2. Halka 1: Ajan platformundan GitHub token'ına
  3. Halka 2-3: Geçici branch'lerle sır toplama
  4. Halka 4-5: Benzer isimli fork'tan zararlı sürüm
  5. Halka 6-7: İz temizleme
  6. Python başlangıç kancası tehlikesi
  7. Çı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ı.
10 Ekim 21:13-21:28 arası saldırgan, iptal edilmeyen ana anahtarla Agent Platform API'sine ulaştı ve 21:27'de ilgili uç nokta çağrısıyla sahibin GitHub CLI token'ını aldı. Bu noktadan sonra tüm repolara sahip seviyesinde erişimi vardı. Önemli ayrıntı: GitHub CLI token'ları 2FA sonrası üretilir ve hassas işlemlerdeki ek 2FA doğrulamasına tabi değildir.

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):
Kod:
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ı
LiteLLM, normalde bir sürümün yetkili bir mühendis tarafından tetiklenip ofisteki fiziksel bir cihaza kilitli özel bir hesapça onaylanması gerektiğini, ancak daha sık sürüm için bu kuralı geçici olarak gevşettiklerini belirtiyor. Saldırgan tam da bu gevşetilmiş kuralı kullandı.

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
  1. 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).
  2. Token'ları daraltın ve servis hesabına bağlayın. Organizasyon sahibinin geniş kapsamlı kişisel token'ı otomasyona verilmez.
  3. 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ı.
  4. Kaynak repo bütünlüğünü doğrulayın. Benzer isimli fork (Berri-AI vs BerriAI) klasik typosquat tuzağı.
  5. 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


Ek DosyalarEkran Görüntüleri
   
Cevapla



Hızlı Menü: