Wiz Research, 25 Ekim'de 15 Eylül'den beri izlediği bir kampanyayı yayımladı: çalınmış bir GitHub token'ını alıp o tokenın erişebildiği her depoya bir iş akışı yerleştiren otomatik bir araç. İş akışı, deponun sırlarını kendi workflow log'una yazdırıyor. Araç ardından log'u GitHub API'si üzerinden indiriyor ve çalışmayı saniyeler içinde siliyor. İstekleri `gheist` kullanıcı aracısını taşıyor; isim buradan geliyor.
Bilanço: 850'den fazla ele geçirilmiş hesapta 13.500'den fazla yerleştirilmiş branch — kişisel projelerden kurumsal şirketlerin özel depolarına kadar. Bu hesapların kabaca üçte ikisi 24 Ekim itibarıyla GitHub'da artık yoktu; Wiz bunu kampanyayı bildirdikten sonraki müdahale olarak okuyor.
Saldırı sıkıcı ve asıl mesele bu
Araç her depo için `ci-sync-` ve altı rastgele karakterden oluşan bir branch açıp `.github/workflows/sync-check.yml` dosyasını `ci: sync config` mesajıyla commit'liyor. Commit imzasız ve token sahibi adına görünüyor. Push iş akışını tetikliyor, gerisini iş akışı hallediyor.
Üç ayrıntı bunu işe yarar kılıyor. GitHub log'larda sır değerlerini yalnızca birebir göründüklerinde maskeliyor; base32 ile kodlanmış bir sır hiçbir kalıba uymadığı için tam olarak basılıyor. `permissions: {}` kısıtı işin `GITHUB_TOKEN`'ını sınırlıyor — saldırganın ona ihtiyacı yok — ama `secrets` bağlamını açık bırakıyor. Ve depoda dağıtım ortamları varsa araç bunları `environment: ${{ matrix.environment }}` içeren bir job matrisinde listeliyor; böylece genellikle üretim kimlik bilgilerini tutan ortama özgü sırlar da basılıyor.
Üzerinde durulması gereken ayrıntı çıkış yolu. Sırlar GitHub'ın kendi API'sinden çıkıyor. Saldırgan alan adı yok, dışa giden bağlantı yok, ağ kontrolünün engelleyebileceği bir şey yok.
GitHub'ın güvenlik ağı tam da kapsadığı yerde çalıştı
GitHub, 28 Temmuz 2026'dan beri potansiyel olarak kötü niyetli iş akışı çalışmalarını herkese açık depolarda bir işbirlikçi onaylayana kadar bekletiyor. Bu kontrol işe yaradı: Wiz'in incelediği herkese açık Gheist çalışması, self-hosted iş dahil tüm varyantlarda `action_required` durumunda bekledi; yükler hiç çalışmadı.
Ancak bu bekleme özel depolarda ve GitHub Enterprise Server'da geçerli değil. Orada denetim kayıtları `ci-sync-*` branch'lerinde tamamlanan ve ardından `gheist` kullanıcı aracısı tarafından silinen çalışmalar gösteriyor. CloudTrail, etkilenen kuruluşların kendi iş akışlarının bu branch'lerde çalışıp AWS rollerini üstlendiğini gösteriyor; yani Actions onay olmadan yürütüldü. Kurumsal ortamlarda Wiz ayrıca aracın dakikalar içinde birkaç kullanıcının ve otomasyon hesabının token'larını dolaştığını, özel depoları klonladığını ve saatler sonra aynı kuruluşun bulut kimlik bilgileriyle AWS Secrets Manager'ı saydığını gördü.
Asıl bulgu bu. Platformun tam olarak bu saldırı sınıfına karşı en etkili savunması, en değerli sırların durduğu depolar hariç her yere uygulandı.
Araçlar gözümüzün önünde gelişti
İki varyant paralel çalıştı. Tool A onaltılık branch soneki ve sade yükü kullandı. Tool B base36 kullandı, 28 Eylül'deki ilk çalışmasından saatler sonra `timeout-minutes: 6` ve ortam matrisini ekledi ve yükü depoya göre uyarladı. 19 Ekim'de dökümlerin arasına base32 bir ayırıcı (`LAFA====`) koydu — muhtemelen operatörün log ayrıştırıcısı için — ve saatler sonra `runs-on: self-hosted` ile ikinci bir iş, `sync-host`, gönderdi; görünüşe göre yalnızca kayıtlı self-hosted runner'ı olan depolara.
Bu iş avlanıyor: Anthropic, Hugging Face, Groq ve NVIDIA gibi yapay zekâ sağlayıcılarının anahtarları dahil 31 token formatı; özel anahtarlar, `.env` dosyaları, Terraform state ve shell geçmişi; `/proc/*/environ` üzerinden her sürecin ortamı; ve Docker soketi üzerinden host'un kök dosya sisteminin bağlandığı bir konteyner. Aynı zamanda hatalı: yanlış runner anahtar dosyası, bozuk URL kimlik bilgisi regex'i, GCP veya Azure token'ı yok. Saldırganların her iyileştirmesi yetkinlik değil.
Tek hesap, çok kampanya
Ele geçirilmiş hesaplar ortak mülk. 6 Ekim'de bu hesapların 391'i yaklaşık 1.461 depoyu korsan yazılım yemlerine çevirdi; bunların 166'sı Gheist faaliyetinde hiç görünmüyor, yani çalınmış token havuzu bu kampanyanın ayak izinden büyük. 18 Ekim'de 25 Gheist hesabı dokuz dakika içinde birer "Windows RDP Runner" deposu açtı; görünüşe göre Actions'ı bedava hesaplama gücü olarak kullanmak için. Üç kurbanda Kuzey Kore bağlantılı PolinRider zararlısının izleri görüldü; derleme yapılandırmalarını yeniden yazıyordu. Wiz'in izleyebildiği kimlik bilgisi kaynakları tabloya uyuyor: infostealer log'ları ve Mart'taki Trivy olayı gibi önceki tedarik zinciri ihlallerinden sızan token'lar.
Savunucular şimdi ne yapmalı
Avla: yalnızca yeni bir `.github/workflows/sync-check.yml` ekleyen ve `ci: sync config` mesajını taşıyan `ci-sync-` artı altı karakterlik branch'ler. Denetim kayıtlarında: tamamlandıktan sonra bir dakika içinde silinen `ci-sync-*` çalışmaları. En iyi sinyal hiç GitHub log'u gerektirmiyor: iş akışlarınız OIDC kullanıyorsa, öznesi `ci-sync-` branch'i içeren rol üstlenmeleri için bulut denetim kayıtlarına bakın.
Etkilenen bir depodan erişilebilen her depo, kuruluş ve ortam sırrını döndürün — çalışmayı veya branch'i silmek ifşayı geri almaz. Commit'leri gönderen token'ları iptal edin ve sahiplerinin cihazlarını infostealer için kontrol edin. Bir `ci-sync` branch'i self-hosted runner'da çalıştıysa host'u ve instance rolünü ele geçirilmiş sayın. Bekletilen `sync-check` çalışmalarını onaylamayın.
Sertleştir: üretim sırları olan ortamlarda gözden geçiren zorunluluğu, OIDC güven politikalarını korumalı branch ve ortamlarla sınırlama, kişisel erişim token'ları yerine GitHub Apps veya kısa ömürlü ince taneli token'lar, self-hosted runner'ları Docker soketi ve sınırsız metadata erişimi olmayan geçici host'lar olarak çalıştırma.
Tek bir tasarım kararı — onay beklemesinin yalnızca herkese açık depoları kapsaması — bu kampanyanın nerede zarar verdiğini belirledi. Böyle kararlar, biri üzerine iş kurana kadar görünmez.




