Abusing Github Actions
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)
Bu sayfada şunları bulacaksınız:
Bir saldırganın bir Github Action'a erişmeyi başardığında tüm etkilerin özeti
Bir action'a erişim elde etmenin farklı yolları:
Action'ı oluşturmak için izinlere sahip olmak
Pull request ile ilgili tetikleyicileri kötüye kullanmak
Diğer dış erişim tekniklerini kötüye kullanmak
Zaten ele geçirilmiş bir repodan pivotlama
Son olarak, içeriden bir action'ı kötüye kullanma sonrası teknikleri hakkında bir bölüm (belirtilen etkileri yaratmak için)
Github Actions hakkında temel bilgileri kontrol edin.
Eğer bir depo içinde Github Actions'da rastgele kod çalıştırabiliyorsanız, şunları yapabilirsiniz:
Pipeline'a monte edilmiş gizli bilgileri çalmak ve pipeline'ın ayrıcalıklarını kötüye kullanarak AWS ve GCP gibi dış platformlara yetkisiz erişim sağlamak.
Dağıtımları tehlikeye atmak ve diğer artifaktları.
Eğer pipeline varlıkları dağıtıyor veya depoluyorsa, nihai ürünü değiştirebilir ve bir tedarik zinciri saldırısına olanak tanıyabilirsiniz.
Özel işçilerde kod çalıştırmak için hesaplama gücünü kötüye kullanmak ve diğer sistemlere pivotlamak.
GITHUB_TOKEN
ile ilişkili izinlere bağlı olarak depo kodunu üzerine yazmak.
Bu "gizli" ( ${{ secrets.GITHUB_TOKEN }}
ve ${{ github.token }}
'den gelen) admin bu seçeneği etkinleştirdiğinde verilir:
Bu token, bir Github Uygulaması'nın kullanacağı aynı token'dır, böylece aynı uç noktalara erişebilir: https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps
Github, depolararası erişime izin veren bir akış yayınlamalıdır, böylece bir repo GITHUB_TOKEN
kullanarak diğer iç reposuna erişebilir.
Bu token'ın olası izinlerini burada görebilirsiniz: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
Token'ın işlem tamamlandıktan sonra süresinin dolduğunu unutmayın.
Bu token'lar şu şekilde görünür: ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7
Bu token ile yapabileceğiniz bazı ilginç şeyler:
Birçok durumda Github Actions ortamlarında veya gizliliklerde github kullanıcı token'larını bulabileceğinizi unutmayın. Bu token'lar, depo ve organizasyon üzerinde daha fazla ayrıcalık sağlayabilir.
Diğer kullanıcıların depolarında bir Github Token'ına verilen izinleri logları kontrol ederek kontrol etmek mümkündür:
Bu, Github eylemlerini tehlikeye atmanın en kolay yolu olacaktır, çünkü bu durum organizasyonda yeni bir depo oluşturma erişiminiz olduğunu veya bir depoda yazma yetkisine sahip olduğunuzu varsayar.
Bu senaryoda iseniz, İstismar Sonrası Teknikler bölümüne göz atabilirsiniz.
Bir organizasyonun üyeleri yeni depolar oluşturabiliyorsa ve siz github eylemlerini çalıştırabiliyorsanız, yeni bir depo oluşturup organizasyon seviyesinde ayarlanan gizli bilgileri çalabilirsiniz.
Eğer zaten bir Github Action yapılandırılmış bir depoda yeni bir dal oluşturabiliyorsanız, onu değiştirebilir, içeriği yükleyebilir ve ardından o eylemi yeni daldan çalıştırabilirsiniz. Bu şekilde depo ve organizasyon seviyesindeki gizli bilgileri dışarı aktarabilirsiniz (ancak bunların nasıl adlandırıldığını bilmeniz gerekir).
Değiştirilen eylemi manuel olarak, bir PR oluşturulduğunda veya bazı kodlar itildiğinde çalıştırılabilir hale getirebilirsiniz (ne kadar dikkat çekici olmak istediğinize bağlı olarak):
Bir saldırganın başka bir depodaki Github Action'ı çalıştırmasına izin verebilecek farklı tetikleyiciler vardır. Eğer bu tetiklenebilir eylemler kötü yapılandırılmışsa, bir saldırgan bunları tehlikeye atabilir.
pull_request
pull_request
iş akışı tetikleyicisi, bazı istisnalarla birlikte her seferinde bir pull request alındığında iş akışını çalıştırır: varsayılan olarak, eğer bu ilk kez iş birliği yapıyorsanız, bazı bakıcıların iş akışının çalışmasını onaylaması gerekecektir:
Varsayılan kısıtlama ilk kez katkıda bulunanlar içindir, geçerli bir hata/yazım hatasını düzeltmek için katkıda bulunabilir ve ardından yeni pull_request
ayrıcalıklarınızı kötüye kullanmak için başka PR'lar gönderebilirsiniz.
Bunu test ettim ve çalışmıyor: Başka bir seçenek, projeye katkıda bulunan birinin adını taşıyan bir hesap oluşturmak ve hesabını silmek olurdu.
Ayrıca, varsayılan olarak yazma izinlerini ve gizli verilere erişimi hedef depoya engeller, belgelere göre:
GITHUB_TOKEN
hariç, gizli veriler bir iş akışı forklanmış bir depodan tetiklendiğinde çalıştırıcıya geçmez.GITHUB_TOKEN
'ın yalnızca okuma izinleri vardır, forklanmış depolardan gelen pull request'lerde.
Bir saldırgan, Github Action'ın tanımını değiştirerek keyfi şeyler çalıştırabilir ve keyfi eylemler ekleyebilir. Ancak, belirtilen kısıtlamalar nedeniyle gizli verileri çalamaz veya depoyu üzerine yazamaz.
Evet, eğer saldırgan PR'de tetiklenecek github action'ı değiştirirse, onun Github Action'ı kullanılacak ve orijinal depodaki değil!
Saldırgan ayrıca çalıştırılan kodu kontrol ettiğinden, GITHUB_TOKEN
üzerinde gizli veriler veya yazma izinleri olmasa bile, bir saldırgan örneğin kötü niyetli belgeler yükleyebilir.
pull_request_target
pull_request_target
iş akışı tetikleyicisi, hedef depoya yazma iznine ve gizli verilere erişime sahiptir (ve izin istemez).
pull_request_target
iş akışı tetikleyicisinin temel bağlamda çalıştığını ve PR tarafından verilen bağlamda çalışmadığını unutmayın (güvenilmeyen kodu çalıştırmamak için). pull_request_target
hakkında daha fazla bilgi için belgelere bakın.
Ayrıca, bu özel tehlikeli kullanım hakkında daha fazla bilgi için bu github blog yazısını kontrol edin.
Çalıştırılan iş akışının temelde tanımlandığı ve PR'de değil gibi görünmesi, pull_request_target
kullanımının güvenli olduğu anlamına gelmez, ancak güvenli olmadığı birkaç durum vardır.
Ve bu, gizli verilere erişim sağlayacaktır.
workflow_run
workflow_run tetikleyicisi, bir iş akışının tamamlandığında
, istek yapıldığında
veya devam ederken
başka bir iş akışından çalıştırılmasına izin verir.
Bu örnekte, bir iş akışı, ayrı "Testleri Çalıştır" iş akışı tamamlandıktan sonra çalışacak şekilde yapılandırılmıştır:
Ayrıca, belgelerde belirtildiği gibi: workflow_run
olayıyla başlatılan iş akışı, önceki iş akışı çalıştırılmamış olsa bile gizli bilgilere erişebilir ve token yazabilir.
Bu tür bir iş akışı, pull_request
veya pull_request_target
aracılığıyla bir dış kullanıcı tarafından tetiklenebilen bir iş akışına bağlıysa saldırıya uğrayabilir. Birkaç savunmasız örnek bu blogdabulunabilir. İlk örnek, workflow_run
tetiklenen iş akışının saldırganın kodunu indirmesidir: ${{ github.event.pull_request.head.sha }}
İkinci örnek, güvenilmeyen koddan workflow_run
iş akışına bir artifact geçirerek ve bu artifact'ın içeriğini RCE'ye karşı savunmasız hale getirecek bir şekilde kullanmaktır.
workflow_call
TODO
TODO: pull_request
'dan çalıştırıldığında kullanılan/indirilen kodun orijinalden mi yoksa forked PR'dan mı olduğunu kontrol et
Bir dış saldırganın bir github iş akışını çalıştırmasını sağlamak için tüm yolları belirttik, şimdi bu çalıştırmaların kötü yapılandırıldığında nasıl kötüye kullanılabileceğine bakalım:
pull_request
durumunda, iş akışı PR'nin bağlamında çalıştırılacak (yani kötü niyetli PR kodunu çalıştıracak), ancak birinin önce bunu yetkilendirmesi gerekiyor ve bazı kısıtlamalarla çalışacak.
pull_request_target
veya workflow_run
kullanan bir iş akışında, pull_request_target
veya pull_request
üzerinden tetiklenebilen bir iş akışına bağlıysa, orijinal repo kodu çalıştırılacak, bu nedenle saldırgan çalıştırılan kodu kontrol edemez.
Ancak, eğer action açık bir PR checkout'a sahipse ve PR'den kod alıyorsa (veya temelden değilse), saldırganın kontrolündeki kodu kullanacaktır. Örneğin (PR kodunun indirildiği 12. satıra bakın):
Potansiyel olarak güvenilmeyen kod, npm install
veya npm build
sırasında çalıştırılmaktadır çünkü derleme betikleri ve referans verilen paketler PR yazarının kontrolündedir.
Savunmasız eylemleri aramak için bir github dork'u: event.pull_request pull_request_target extension:yml
ancak, eylem güvensiz bir şekilde yapılandırılmış olsa bile, işlerin güvenli bir şekilde çalıştırılması için farklı yollar vardır (örneğin, PR'yi oluşturan aktör hakkında koşullu ifadeler kullanmak).
Belirli github bağlamları olduğunu unutmayın, bunların değerleri PR'yi oluşturan kullanıcı tarafından kontrol edilmektedir. Eğer github action bu verileri herhangi bir şeyi çalıştırmak için kullanıyorsa, bu keyfi kod çalıştırmaya yol açabilir:
Gh Actions - Context Script InjectionsBelgelerden: Bir iş akışı işinde herhangi bir sonraki adımda bir ortam değişkenini kullanılabilir hale getirmek için ortam değişkenini tanımlayarak veya güncelleyerek ve bunu GITHUB_ENV
ortam dosyasına yazarak yapabilirsiniz.
Eğer bir saldırgan bu env değişkeninin içine herhangi bir değeri enjekte edebilirse, LD_PRELOAD veya NODE_OPTIONS gibi sonraki adımlarda kod çalıştırabilecek env değişkenlerini enjekte edebilir.
Örneğin (bu ve bu), GITHUB_ENV
env değişkeninin içeriğini depolamak için yüklenen bir artifact'a güvenen bir iş akışını hayal edin. Bir saldırgan bunu tehlikeye atmak için şöyle bir şey yükleyebilir:
bu blog yazısında belirtildiği gibi, bu Github Action farklı iş akışlarından ve hatta depolardan artifact'lara erişim sağlar.
Sorun şu ki, eğer path
parametresi ayarlanmamışsa, artifact mevcut dizine çıkarılır ve daha sonra iş akışında kullanılabilecek veya çalıştırılabilecek dosyaları geçersiz kılabilir. Bu nedenle, eğer Artifact savunmasızsa, bir saldırgan bunu diğer iş akışlarını tehlikeye atmak için kötüye kullanabilir.
Savunmasız iş akışı örneği:
Bu iş akışı ile saldırıya uğrayabilir:
Eğer bir hesap adını değiştirirse, başka bir kullanıcı bir süre sonra o isimle bir hesap kaydedebilir. Eğer bir depo isim değişikliğinden önce 100 yıldızdan azsa, Github, aynı isimle yeni kayıtlı kullanıcının silinmiş olanla aynı isimde bir depo oluşturmasına izin verecektir.
Yani eğer bir işlem, var olmayan bir hesaptan bir depoyu kullanıyorsa, bir saldırganın o hesabı oluşturup işlemi tehlikeye atması hala mümkün olabilir.
Eğer diğer depolar bu kullanıcı depolarından bağımlılıklar kullanıyorsa, bir saldırgan bunları ele geçirebilir. İşte daha kapsamlı bir açıklama: https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/
Bu bölümde, ilk depoda bir tür erişimimiz olduğunu varsayarak bir depodan diğerine geçiş yapmamızı sağlayacak tekniklerden bahsedeceğiz (önceki bölüme bakın).
Bir önbellek, aynı dalda çalışma çalışmaları arasında korunur. Bu, bir saldırganın bir paketi tehlikeye atması durumunda, bu paketin önbellekte saklanacağı ve daha ayrıcalıklı bir iş akışı tarafından indirilip çalıştırılacağı anlamına gelir; bu durumda o iş akışını da tehlikeye atabilecektir.
GH Actions - Cache Poisoningİş akışları, diğer iş akışlarından ve hatta depolardan artefaktlar kullanabilir; eğer bir saldırgan, başka bir iş akışı tarafından daha sonra kullanılan bir artefaktı yükleyen Github Action'ı tehlikeye atmayı başarırsa, o zaman diğer iş akışlarını da tehlikeye atabilir:
Gh Actions - Artifact PoisoningAşağıdaki sayfalara göz atın:
AWS - Federation AbuseGCP - Federation AbuseEğer bir betiğe içerik enjekte ediyorsanız, gizli bilgilere nasıl erişebileceğinizi bilmek ilginçtir:
Eğer gizli bilgi veya token bir çevre değişkenine ayarlandıysa, printenv
kullanarak çevre üzerinden doğrudan erişilebilir.
Eğer gizli bilgi bir ifadede doğrudan kullanılıyorsa, oluşturulan shell scripti diskte saklanır ve erişilebilir.
cat /home/runner/work/_temp/*
Özel bir eylem için, risk, programın argümandan elde ettiği gizli bilgiyi nasıl kullandığına bağlı olarak değişebilir:
Github Actions'ın hangi non-github altyapısında çalıştırıldığını bulmanın yolu, Github Action yapılandırma yaml'ında runs-on: self-hosted
aramaktır.
Kendinden barındırılan çalıştırıcılar, ekstra hassas bilgilere erişim sağlayabilir, diğer ağ sistemlerine (ağda savunmasız uç noktalar mı? meta veri servisi?) veya, izolasyon altında ve yok edilse bile, birden fazla eylem aynı anda çalıştırılabilir ve kötü niyetli olanı diğerinin gizli bilgilerini çalabilir.
Kendinden barındırılan çalıştırıcılarda, herhangi bir adımda iş akışlarının tüm gizli bilgilerini içerecek olan _Runner.Listener_** sürecinden gizli bilgileri elde etmek de mümkündür; belleğini dökerek:
Daha fazla bilgi için bu gönderiyi kontrol edin.
Github içinde bir Docker görüntüsü oluşturup depolayacak Github eylemleri yapmak mümkündür. Aşağıdaki genişletilebilir örnekte bir örnek bulabilirsiniz:
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)