- Resmî GitHub Action, etiketlerin zorla güncellenmesi yoluyla manipüle edilerek kötü amaçlı kodun dağıtıldığı bir tedarik zinciri saldırısına uğradı
- Saldırganlar, 76 etiketin 75’ini kötü amaçlı commit ile değiştirdi; yaklaşık 10 binden fazla workflow etkilendi
- Manipüle edilen betik, gizli bilgi toplama·şifreleme·sızdırma olmak üzere 3 aşamada çalışıyor ve TeamPCP Cloud stealer kodunu içeriyor
- Enfekte etiketler hâlâ aktif; yalnızca @0.35.0 veya belirli commit SHA güvenli kabul ediliyor
- Tüm kimlik bilgilerinin değiştirilmesi ve commit SHA sabitleme kullanılması zorunlu; Docker Hub imajlarında da aynı kirlenme doğrulandı
Trivy GitHub Actions tedarik zinciri saldırısına genel bakış
- Trivy’nin resmî GitHub Action’ı (
aquasecurity/trivy-action), saldırganlar tarafından etiketlerin zorla güncellenmesi (force-push) yöntemiyle manipüle edilerek kötü amaçlı kodun dağıtıldığı bir olay yaşandı
- Saldırganlar, 76 sürüm etiketinden 75’ini kötü amaçlı commit ile değiştirdi ve bunun CI/CD pipeline’larında otomatik çalışmasını sağladı
- Yaklaşık 10.000’den fazla GitHub workflow dosyası bu action’a referans verdiği için etki alanı oldukça geniş
- Enfekte etiketler hâlâ aktif ve @0.35.0 tek güvenli sürüm olarak doğrulandı
- Socket, 19:15 UTC’den itibaren gerçek zamanlı olarak 182 kötü amaçlı GitHub Action olayını tespit etti ve bunları Backdoor, Infostealer ve Reconnaissance türlerinde sınıflandırdı
Saldırının nedeni ve ilerleyiş biçimi
- Trivy bakımcılarına göre bu saldırı, yazma yetkisine sahip kimlik bilgilerinin ele geçirilmesi nedeniyle gerçekleşti
- Mart başında yaşanan önceki ihlalde CI ortamındaki gizli bilgiler sızdırıldı ve rotasyon süreci eksik kaldığı için bazı yeni kimlik bilgileri saldırganların elinde kaldı
- Saldırganlar bu kimlik bilgilerini kullanarak, GitHub’ın kendisinde bir zafiyet olmadan kimliği doğrulanmış etiket güncellemeleri yaptı
- Saldırganlar branch push veya release oluşturmak yerine, mevcut etiketlerin üzerine zorla yeni commit yazdı
- Her etiket, meşru görünmesi için orijinal commit’in meta verilerini (yazar, e-posta, zaman damgası, commit mesajı) kopyalayacak şekilde sahte olarak üretildi
- Ancak orijinal commit GPG ile imzalıyken saldırganın commit’lerinde imza yoktu ve parent commit tarihi 2026 olarak tutarsızdı
- GitHub’daki Immutable Release işareti bulunsa bile, saldırganın önce kötü amaçlı durumda yayımlayıp sonra kilitlemiş olması mümkün
- Bu nedenle “Immutable” rozetine güvenilmemeli; güvenli tüketim için tek yöntem commit SHA sabitleme (pinning)
Etiket manipülasyonunun yapısı
- Saldırganlar,
master branch’inin en son commit’i (57a97c7e) temel alınarak yeni commit’ler oluşturdu
- Yalnızca
entrypoint.sh dosyası kötü amaçlı sürümle değiştirildi, diğer dosyalar aynı bırakıldı
- Her etiket, orijinal PR numarasını, commit mesajını ve yazar bilgilerini aynen kopyalayarak sahte biçimde yeniden üretildi
- GitHub release sayfasında “0 commits to master since this release” ifadesi görünüyorsa, bu manipüle edilmiş etiketin görsel göstergesi olabilir
0.35.0 etiketinin manipüle edilmemesinin nedeni, zaten master HEAD’ini işaret ediyor olmasıydı
Kötü amaçlı payload yapısı
- Manipüle edilen
entrypoint.sh toplam 204 satırdan oluşuyor; 4~105. satırlar Infostealer kodunu, sonrasında ise normal Trivy tarama kodunu içeriyor
- Kötü amaçlı kod üç aşamadan oluşuyor
- 1. aşama: Toplama (Collection) — runner süreç belleğinden ve dosya sisteminden gizli bilgileri çıkarma
- 2. aşama: Şifreleme (Encryption) — toplanan verileri AES-256-CBC ve RSA-4096 ile şifreleme
- 3. aşama: Sızdırma (Exfiltration) — verileri saldırgan kontrollü domaine veya kurbanın GitHub hesabına gönderme
-
1. aşama: Gizli bilgi toplama
- GitHub Actions runner süreçlerinin (
Runner.Worker, Runner.Listener, runsvc, run.sh) ortam değişkenleri /proc/<pid>/environ üzerinden okunuyor ve env, ssh anahtar sözcüklerini içeren girdiler ayıklanıyor
- GitHub tarafından barındırılan runner’larda Python tabanlı bellek dökümü betiği
sudo ile çalıştırılıyor ve Runner.Worker süreç belleğinde "isSecret":true deseni aranıyor
- Self-hosted runner’larda, TeamPCP Cloud stealer olarak tanımlanan dosya sistemi kimlik bilgisi toplayıcısı çalıştırılıyor
- SSH anahtarları, AWS/GCP/Azure kimlik bilgileri, Kubernetes token’ları, Docker yapılandırmaları, DB parolaları, ortam dosyaları, TLS anahtarları, VPN yapılandırmaları, Webhook URL’leri, cüzdan anahtarları gibi çok geniş bir hedef kümesini kapsıyor
-
2. aşama: Şifreleme
openssl rand ile 32 baytlık bir oturum anahtarı oluşturuluyor, ardından veriler AES-256-CBC ile şifreleniyor
- Oturum anahtarı, RSA-4096 açık anahtarıyla OAEP padding uygulanarak şifreleniyor
- Şifrelenmiş veriler (
payload.enc) ve oturum anahtarı (session.key.enc) tpcp.tar.gz içine paketleniyor
-
3. aşama: Veri sızdırma
- Birincil kanal:
https://scan[.]aquasecurtiy[.]org adresine HTTPS POST gönderimi (aquasecurity yazım hatalı domain kullanılıyor)
- İkincil kanal: Başarısız olursa kurbanın GitHub Personal Access Token’ı kullanılarak
tpcp-docs adlı herkese açık bir depo oluşturuluyor
tpcp.tar.gz, release varlığı olarak yükleniyor → saldırgan GitHub aramasıyla bu depoyu bularak veriyi topluyor
- GitHub altyapısı kullanılarak güvenlik duvarı atlatılmaya çalışılıyor, bu da tespit edilmeden kalma olasılığını artırıyor
- Son olarak geçici dosyalar silinerek izler en aza indiriliyor
Saldırganlar ve arka plan
- Kötü amaçlı kod içindeki yorumlarda “TeamPCP Cloud stealer” ifadesi açıkça yer alıyor
- TeamPCP (DeadCatx3, PCPcat, ShellForce), cloud-native ortamları hedef alan bir saldırı grubu olarak biliniyor; Docker API, Kubernetes, Redis ve Ray dashboard zafiyetlerini istismar ettiği vakalar bulunuyor
- 2026 Şubat’ında Flare ve The Hacker News tarafından fidye yazılımı, veri hırsızlığı ve kripto para madenciliği kampanyaları ile ilişkilendirildiği bildirildi
- Solana doğrulayıcı anahtarları ve kripto para cüzdanlarını toplama işlevi, finansal motivasyonla uyumlu görünüyor
Müdahale ve öneriler
- Tüm Trivy Action sürüm etiketlerinin kullanımı durdurulmalı; yalnızca commit SHA
57a97c7e7821a5776cebc9bb87c984fa69cba8f1 veya 0.35.0 etiketi kullanılmalı
- Enfekte pipeline’lar tam gizli bilgi sızıntısı olarak değerlendirilmelidir; tüm bulut kimlik bilgileri, SSH anahtarları, API token’ları, DB parolaları ve Docker token’ları derhâl değiştirilmelidir
- GitHub organizasyonunda
tpcp-docs deposunun varlığı kontrol edilmeli ve 19 Mart 19:00 UTC sonrasında çalıştırılan trivy-action loglarının incelenmesi önerilir
İhlal göstergeleri (IOCs)
- Ağ göstergesi:
scan[.]aquasecurtiy[.]org
- Dosya hash’i:
18a24f83e807479438dcab7a1804c51a00dafc1d526698a66e0640d1e5dd671a (entrypoint.sh)
- Enfekte GitHub Actions:
aquasecurity/trivy-action@0.0.1 ~ @0.34.2 arasındaki tüm sürümler dahil (toplam 75 etiket)
Ek güncelleme (22 Mart)
- Docker Hub’da da Trivy imajlarının (
0.69.4, 0.69.5, 0.69.6, latest) aynı Infostealer payload ile kirletildiği doğrulandı
latest etiketi kötü amaçlı imaja işaret edecek şekilde ayarlandığı için maruz kalma süresi boyunca kullanıcılara dağıtıldı
- İlgili ayrıntılar, Socket’in ayrı raporu “Trivy Docker Images Compromised” içinde bulunabilir
1 yorum
Hacker News görüşleri
GitHub'ın Actions için değiştirilemez sürümlendirmeyi (immutable versioning) neden zorunlu kılmadığını merak ediyorum
Güvenlik rehberi commit SHA'ya sabitlemeyi (
pin) öneriyor ama hiç sabitlemeden Action yayımlamayı baştan engelleseler bu tür sorunlar azalabilirmiş gibi geliyorGüvenlik ekibi açısından sabitlenmiş sürümler daha güvenli, ama aynı zamanda güvenlik güncellemelerinin otomatik alınmaması da riskli
Sonuçta üretkenliği bozmadan ikisini birden sağlayan bir çözüme ihtiyaç var
Buna “Pinning paradoksu” demek isterim
Yine de bir gün bunu değiştirme işine başlamak gerekecek
Güncellemelere izin vermek aslında güvenliği artırabilir
Bu, statik bağlantı vs dinamik bağlantı tartışmasına benzer bir mesele
Ayrıca Trivy Action zaten en güncel sürümü alacak şekilde tasarlanmıştı
Bu olay, “tedarik zinciri güvenliği (supply chain security)” ürünlerinin pratikte korumaya çalıştıkları yığın kadar kırılgan olabileceğini gösteren bir uyarı
Özellikle “her yerde çalışın” tarzı güvenlik araçları, tek bir saldırıyla çok sayıda kullanıcıyı aynı anda riske atan yeni bir saldırı vektörü sunuyor
İlk başta Trivy'nin kimlik bilgisi rotasyonunu düzgün yapmadığını sanmıştım
Ama onların açıklamasına göre “atomik olmayan (non-atomic) rotasyon sürecinde saldırgan yeni token'ı öğrenmiş olabilir”
GitHub token'ı oluşturulduktan sonra tekrar göstermiyor, ama kullanılan kimlik doğrulama yöntemine göre durum değişebilir
Yeni bir GitHub organizasyonu oluşturur oluşturmaz isim ele geçirilmiş ve GitHub'dan atomik oluşturma işlemi talep etmek zorunda kalmış
“Açıkları taramalısın, açığın kendisi olmamalısın” sözü bu olay için tam yerine oturuyor
İlgili bir olay olarak Trivy tedarik zincirinin geçici ihlali vardı
22 Mart'ta saldırgan, ele geçirilmiş kimlik bilgileriyle kötü amaçlı Trivy v0.69.5 ve v0.69.6 DockerHub imajları yayımladı
(güvenlik duyurusu bağlantısı)
19 Mart ve 22 Mart'ta iki ayrı olay yaşandı ve saldırganın, iki kez yapılan kimlik bilgisi rotasyonuna rağmen erişimi sürdürdüğü anlaşılıyor
“Son 2 hafta berbat geçti”
Trivy'nin ele geçirilmesi yüzünden çok sayıda güvenlik raporu ve toplantısıyla uğraşmak zorunda kalmışlar
Buradaki ders şu: “güvenlik yazılımı yapmak, mutlaka yetkin olduğun anlamına gelmez”
Bizim güvenlik ekibimiz de her ay yeni bir tarayıcı getirmeye çalışıyor ama onların istediği geniş erişim izinlerini versek şimdiye kadar muhtemelen defalarca ihlal edilmiştik
setup-trivyAction'ı ana dalı olduğu gibi klonlayıp shell script çalıştırıyorduYani tüm CI iş akışlarında keyfi kod çalıştırma mümkündü
Aqua bu ayın başında ihlal edildi, iki kez izolasyon başarısızlığı yaşandı ve sonunda Docker Hub hesabı da ele geçirildi
Artık dış uzmanlardan yardım almaları gerektiğini düşünüyorum
Çoğu sadece gürültülü rapor üreticisi ve saldırgan içeri girdiğinde hiçbir savunma sağlayamıyor
Yeni bir tarayıcı, izole bir sandbox içinde yalnızca salt okunur verilere erişebilmeli ve yeterince doğrulanana kadar üretim izinleri almamalı
Aksi halde bu, gizli anahtarları pastebin'e koymaktan farksız
“Hızlı hareket et ve her şeyi kır” türü bir güvenlik kültürü oluşmuş durumda
Bu yüzden düşük kaliteli güvenlik yazılımlarını bile mecburen devreye alma kültürü oluşuyor
Bence Trivy'nin kendisi kötü değil ve bizim şirket de kullanıyor
Ama biz Nix ile sürümü sabitleyip Actions iş akışlarını kendimiz yazdığımız için bu ihlalden etkilenmedik
Saldırgan, kimliği doğrulanmış durumdayken etiketi zorla güncelleyebiliyordu (force-update)
GitHub'ın eski ayarlarından “etiketin üzerine yazmayı yasakla” seçeneği açık olsaydı bu engellenebilirdi
Bu tür olaylar tekrarlandıkça Software Building Code benzeri standartlara ihtiyaç olduğu düşüncesi güçleniyor
2026'da bunun için daha kaç gerekçe çıkacağını merak ediyorum