Çalınan GitHub hesaplarıyla yürütülen yeni kampanya, 10 Kasım’dan itibaren on binlerce depoda sahte pull request açtı ve ardından CI iş akışlarına sır avcısı yerleştirdi. Güvenlik incelemelerine göre saldırgan, GitHub Actions üzerinden ya da npm kurulumları sırasında çalışan bu yükle repo içindeki gizli anahtarları ve bulut kimlik bilgilerini topladı. Etkilenen depolarda kayıtlar silindiği için araştırmacılar gerçek etkinin tamamını doğrulayamıyor.
Güvenlik araştırmalarının ortaklaştığı tabloya göre 4.837 ele geçirilmiş hesap, 61.764 ila 61.879 depo arasında test pull request’i gönderdi. Bu denemelerden sonra payload en az 1.806, bazı ölçümlere göre 1.835 depoda çalıştı. Kampanya, public depoları tarayan incelemelerde daha yüksek bir sayı üretse de araştırmacılar gerçek toplamın bundan da fazla olabileceğini söylüyor.
Test pull request’inden gerçek yüklemeye
Saldırı zinciri hep aynı kalıpla ilerledi. İlk adımda, wfx-docs adlı bir daldan açılan ve docs: dependency audit notes başlığını taşıyan pull request, hesabın depoya yazma yetkisi olup olmadığını anlamak için kullanıldı. Bu deneme PR’ları 61 binden fazla depoya ulaştı ve bunların büyük bölümünün hâlâ açık kaldığı görüldü. Aikido’nun teknik analizine göre, bu denemeyi açan hesapların kendisi de ele geçirilmiş kabul edilmeli; payload hiç çalışmasa bile saldırgan bu hesaba erişim elde etmiş demektir.
Başka bir analizde SafeDep araştırmacıları, Salı günü 12:46 UTC ile bugün 04:36 UTC arasında kötü amaçlı commit alan 8.093 depo saydı. Bu sayı, yalnızca stealer’ın çalıştığı depoları değil, kötü amaçlı commit alan tüm depoları kapsıyor. Ekip, aramasını yalnızca public depoların default branch’leriyle sınırladığı için gerçek toplamın daha yüksek olduğunu belirtiyor.
Ardından saldırgan, birden fazla yöntemle kötü amaçlı kodu yerleştirdi. En yaygın yöntem, mevcut bir iş akışına ekleme yapmaktı; 7.309 depoda bu yöntem görüldü. 771 depoda ise chore: add ci helper commit’iyle bir .ci-xxxxxx.sh betiği ve onu tetikleyen bir postinstall kancası eklendi; bu varyant geliştiricinin makinesinde de npm install sırasında çalıştı. Boş bir depoda önce chore: initial commit atılıyor, ardından yeni iş akışı dosyası ekleniyordu. Araştırmacılar bu farklılıkların, saldırının depo ayarları ve hesap izinlerine göre uyarlanabildiğini gösterdiğini aktarıyor.
Her üç yöntem de CI içinde çalışacak şekilde tasarlandı. Paket yöneticisi tarafında ise yükün üç ayrı kanal üzerinden yayıldığı görüldü. Packagist’te digitalelvis/neuronai-studio paketinin v3.14.3 sürümü kötü amaçlı olarak işaretlendi. Go tarafında github.com/vkuznet/gocurl için v0.0.0-20261111095532-8d5aad0cb0da pseudo-sürümü ve github.com/onuragtas/docker-env için v1.0.278 ile v1.0.280 sürümleri de stealer ile ilişkilendirildi. Aynı incelemede wdio-bot hesabıyla imzalanmış 28 WebdriverIO deposu da öne çıktı.
Kampanyanın zaman çizelgesine bakıldığında, saldırganın 10 Kasım’da başladığı ve 12 Kasım 04:36 UTC’ye kadar malzeme göndermeye devam ettiği görülüyor. GitHub aramaları, 12 Kasım 05:04 ile 05:38 UTC arasında da aynı başlıklı yeni denemelerin açıldığını gösterdi. Bu üç denemenin de wfx-docs dallarından geldiği doğrulandı. Araştırmacılar, şirketin kendi GitHub aramasının Çarşamba günü bitmesinden sonra da aynı başlıklı pull request’lerin açılmaya devam ettiğini aktardı.
İncelenen üç denemede dal adı wfx-docs olarak görüldü. Kayıtlara göre daha geniş taramada ayrıca chore/[a-z0-9]{8} biçiminde kısa ömürlü dallar ve ci-check-[0-9]{4} dalları da saldırı izleri arasında yer aldı. Pull request başlığı yine docs: dependency audit notes idi. Commit mesajlarında ci: refresh build cache, chore: add ci helper, chore: add dependency audit workflow, chore: initial commit, ci: restore ve ci: cleanup kalıpları görüldü.
Hangi izler aranıyor, hangi hesaplar riskte
Uzmanlar, etkilenmiş olabilecek depo sahiplerinin commit yazarına ait token’ları, OAuth uygulama izinlerini, SSH anahtarlarını ve oturumlarını iptal etmesini istiyor. İki aşamalı doğrulamanın açılması, deposun okuyabildiği tüm secret ve değişkenlerin döndürülmesi de tavsiye ediliyor. Eğer kötü amaçlı commit’lerden biri üzerinde npm install çalıştırıldıysa, o makinenin de ele geçirilmiş sayılması ve erişim anahtarlarının yenilenmesi gerekiyor.
SafeDep araştırmacıları ayrıca commit yazarının token’ı dışında, OAuth app grant’leri, SSH anahtarları ve oturumların da iptal edilmesini öneriyor. Bir commit çalıştıran herkesin, özellikle de kötü amaçlı commit üzerinde npm install yapanların, makinesini ele geçirilmiş kabul etmesi gerektiğini belirtiyorlar. Bu adımlar, saldırganın depodan aldığı yetkileri toplu biçimde geri almak için sıralanmış durumda.
İncelemeye göre payload, GitHub Actions secrets ve değişkenleri, iş akışının GITHUB_TOKEN değeri, OIDC ve Actions çalışma zamanı token’ları, yapay zekâ servislerine ait anahtarlar ve runner süreçlerinin belleğinde tutulan sırlar dahil olmak üzere erişebildiği her kaynağı toplamaya odaklandı. AWS, Azure, GCP, Kubernetes, npm, PyPI ve SSH için tipik dosya yollarındaki kimlik bilgileri de okunuyor. Self-hosted runner’larda ise instance metadata, Docker konteyner durumu ve systemd birimleri üzerinden ek bilgi çekildiği aktarıldı. Araştırmacılar, özel depolar için de ayar bulunduğunu ve bunun bu ortama da bulaşmış olabileceğini belirtiyor.
Saldırganın hedefi yalnızca CI sırlarını çalmakla sınırlı kalmadı. GitHub OIDC token’ları AWS, GCP ve Azure oturumlarına çevrilebildi; AWS tarafında IAM kullanıcıları için uzun ömürlü access key üretimi de mümkün hale geldi. Bazı adımlar, kimlik bilgileri döndürülse bile ayakta kalacak şekilde tasarlandı. AWS’de role trust policy değiştirilebildi, Azure AD uygulamalarına wfx-ci- önekli federated identity credential eklenebildi. Böylece depodaki iş akışları, depolanmış bir sır olmadan da bulut oturum açma yetkisini koruyabiliyor.
Bu arka kapıları aramak için Entra ID’de wfx-ci-* adlı ve sizin oluşturmadığınız federated credential kayıtları, AWS CloudTrail’de AssumeRoleWithWebIdentity ya da AssumeRole oturumlarının ardından gelen CreateAccessKey veya UpdateAssumeRolePolicy işlemleri, GCP’de GitHub workload identity pool üzerinden gelen GenerateAccessToken ve SignJwt çağrıları, Vault tarafında ise GitHub OIDC issuer kaynaklı JWT oturum açmaları inceleniyor. Araştırmacıların verdiği ipuçlarında ayrıca wfx-loot kalıntıları, wfx-cache girdileri ve WFX-BEGIN adımlarının yokluğu da yer alıyor; çalışma numarasının commit üzerinde görünmemesi payload’ın çalıştığına dair daha güçlü işaret sayılıyor.
Stealer’ın veri çıkarmak için HTTP POST kullandığı adresler arasında 194.150.166[.]244:8080/exfil, 18.143.168[.]96:8080/exfil ve 153.75.82[.]159:8080 yer aldı. SafeDep araştırmacıları, örneklenen 200 payload commit içinde yaklaşık beşte birinin yalnızca Telegram kullandığını da aktardı. Yani veri dışarı gönderimi tek bir kanalla sınırlı kalmadı; bazı örneklerde Telegram sohbeti üzerinden çıkış yapıldı.
Payload, erişebildiği tüm kaynakları toplamaya odaklanırken GitHub Actions secrets ve değişkenleri, workflow’un GITHUB_TOKEN değeri, OIDC ve Actions runtime token’ları, AI servis anahtarları ve runner süreçlerinin belleğindeki sırlar da hedef alındı. Araştırmacılar ayrıca AWS, Azure, GCP, Kubernetes, npm, PyPI ve SSH için tipik dosya yollarındaki kimlik bilgilerini saydı. Self-hosted runner’larda instance metadata ile Docker konteyner durumu ve systemd birimlerinden veri çekilmesi de yükün parçasıydı.
Yük, yalnızca sırları değil depoyu da kopyaladı. Araştırmacılara göre repository’nin kendisi, son 100 commit’i ve son workflow artifact’ları da çıkarıldı. Stealer, GitHub OIDC token’larını AWS, GCP ve Azure oturumlarına dönüştürebiliyor. AWS tarafında ayrıca IAM kullanıcıları için uzun ömürlü access key oluşturma yeteneği de var. Bazı adımlar credential rotation sonrasında da çalışacak biçimde hazırlanmış; AWS role trust policy yeniden yazılabiliyor ve Azure AD uygulamalarına wfx-ci- önekli federated credential eklenebiliyor.
Kampanya, yayın zincirinde de iz bıraktı. En az bir Packagist paketi ve bir Go modülü otomatik yayımlama tetikleyicileri üzerinden etkilenmiş durumda. Etkilenen kullanıcıların en az 50’sinin npm, Go, Packagist, PyPI ya da crates ekosistemlerinde paket yayınladığı görüldü. Ancak araştırmacılar, bunun bir tedarik zinciri yayılımından çok CI sırlarına erişme çabası olduğuna dikkat çekiyor.
Packagist’te digitalelvis/neuronai-studio paketinin v3.14.3 sürümü kötü amaçlı olarak işaretlendi. Kayıtlara göre bu sürüm 12 Kasım Çarşamba günü yayımlandı ve aynı gün içinde malware uyarısı ile listede kaldı. Normal bir composer install bu yükü çalıştırmıyor; fakat paketin vendor dizini içinde npm install çalıştırıldığında stealer devreye giriyor. Araştırmacılar, bu sürümün engellenmesini ve v3.14.2 ya da daha eski bir sürüme sabitlenmesini öneriyor.
Go tarafında github.com/onuragtas/docker-env için v1.0.278 ve v1.0.280 sürümleri işaretlendi. Bu sürümlerde yük, yalnızca bir GitHub Actions iş akışı dosyasında bulunuyor; Go kodu ve yayınlanan ikili dosyalar değişmemiş. Go build süreci workflow dosyalarını çalıştırmadığı için kullanıcılar doğrudan etkilenmemiş olabilir, ancak ilgili sürümlerin kaldırılması tavsiye ediliyor. Benzer şekilde github.com/vkuznet/gocurl paketinde de v0.0.0-20261111095532-8d5aad0cb0da pseudo-sürümü tespit edildi; bu sürümde yük hiç çalışmamış bir workflow içinde duruyor ve yine engellenmesi isteniyor.
Başka bir yayılım izi wdio-bot hesabıyla imzalanmış 28 WebdriverIO deposunda görüldü. Burada herhangi bir paket sürümü etkilenmedi, ancak bot token’ının çalınmış kabul edilmesi gerektiği aktarıldı. Kampanyada kullanılan hesapların, Ekim ayında görülen ve stolen GitHub hesaplarıyla secret-stealing workflow’lar yürüten GhostAction dalgasıyla da çakıştığı bildirildi. Ekim’de vurulan hesapların, bu haftaki etkinlikte kullanılma ihtimali diğer aktif hesaplara göre yaklaşık 1.000 kat daha yüksekti. 100’den fazla depoda yeni stealer, Ekim dalgasından kalan workflow dosyalarının üstüne eklendi; eski dışarı veri gönderme adımı yerinde bırakıldı.
İncelemeyi yapan ekipler, Kasım kampanyasını şu aşamada aynı aktöre atfetmediklerini söylüyor. Gerekçe olarak altyapı, araçlar ve yöntemlerdeki farkı gösteriyorlar. Ayrıca çalınan kimlik bilgilerinin çoğu zaman birden fazla saldırganın eline geçebildiği de not ediliyor.
