Pentesting CI/CD Methodology
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
VCS, Versiyon Kontrol Sistemi anlamına gelir, bu sistemler geliştiricilerin kaynak kodlarını yönetmelerine olanak tanır. En yaygın olanı git'tir ve genellikle şirketlerin aşağıdaki platformlardan birinde kullandığını göreceksiniz:
Github
Gitlab
Bitbucket
Gitea
Bulut sağlayıcıları (kendi VCS platformlarını sunarlar)
CI/CD boru hatları, geliştiricilerin çeşitli amaçlar için kodun yürütülmesini otomatikleştirmelerine olanak tanır; bunlar arasında uygulamaları oluşturma, test etme ve dağıtma yer alır. Bu otomatik iş akışları, belirli eylemler (örneğin, kod itmeleri, çekme istekleri veya planlı görevler) tarafından tetiklenir. Geliştirme sürecinden üretime geçişi kolaylaştırmak için faydalıdırlar.
Ancak, bu sistemlerin bir yerde yürütülmesi gerekir ve genellikle kod dağıtmak veya hassas bilgilere erişmek için ayrıcalıklı kimlik bilgileri ile çalışır.
Bazı VCS platformları bu bölüm için boru hatları oluşturulmasına izin verse de, yalnızca kaynak kodunun kontrolüne yönelik potansiyel saldırıları analiz edeceğiz.
Projenizin kaynak kodunu içeren platformlar hassas bilgiler içerir ve insanlar bu platformda verilen izinlerle çok dikkatli olmalıdır. Saldırganların istismar edebileceği bazı yaygın sorunlar şunlardır:
Sızıntılar: Kodunuzda, taahhütlerde sızıntılar varsa ve saldırgan repo'ya erişebiliyorsa (çünkü kamuya açıktır veya erişimi vardır), sızıntıları keşfedebilir.
Erişim: Eğer bir saldırgan VCS platformunda bir hesaba erişim sağlayabiliyorsa, daha fazla görünürlük ve izin kazanabilir.
Kayıt: Bazı platformlar yalnızca dış kullanıcıların bir hesap oluşturmasına izin verir.
SSO: Bazı platformlar kullanıcıların kayıt olmasına izin vermez, ancak geçerli bir SSO ile erişim sağlamalarına izin verir (bu nedenle bir saldırgan örneğin github hesabını kullanarak girebilir).
Kimlik Bilgileri: Kullanıcı adı+Şifre, kişisel tokenlar, ssh anahtarları, Oauth tokenları, çerezler... bir kullanıcının bir repo'ya erişmek için çalabileceği çeşitli token türleri vardır.
Webhooks: VCS platformları webhook'lar oluşturulmasına izin verir. Eğer bunlar görünmeyen gizli anahtarlarla korunmuyorsa, bir saldırgan bunları istismar edebilir.
Eğer gizli bir anahtar yoksa, saldırgan üçüncü taraf platformun webhook'unu istismar edebilir.
Eğer gizli anahtar URL'de ise, aynı şey olur ve saldırgan da gizli anahtara sahip olur.
Kodun tehlikeye atılması: Eğer kötü niyetli bir aktörün repo'lar üzerinde bir tür yazma erişimi varsa, kötü niyetli kod enjekte etmeye çalışabilir. Başarılı olmak için dal korumalarını aşması gerekebilir. Bu eylemler farklı hedeflerle gerçekleştirilebilir:
Ana dalı tehlikeye atarak üretimi tehlikeye atmak.
Ana (veya diğer dalları) tehlikeye atarak geliştirici makinelerini tehlikeye atmak (çünkü genellikle test, terraform veya diğer şeyleri kendi makinelerinde repo içinde çalıştırırlar).
Boru hattını tehlikeye atmak (bir sonraki bölüme bakın).
Bir boru hattını tanımlamanın en yaygın yolu, boru hattının inşa edildiği repo'da barındırılan bir CI yapılandırma dosyası kullanmaktır. Bu dosya, yürütülen işlerin sırasını, akışı etkileyen koşulları ve yapı ortamı ayarlarını tanımlar. Bu dosyalar genellikle tutarlı bir isim ve formata sahiptir, örneğin — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI) ve .github/workflows altında bulunan GitHub Actions YAML dosyaları. Tetiklendiğinde, boru hattı işi seçilen kaynaktan kodu çeker (örneğin, taahhüt / dal) ve CI yapılandırma dosyasında belirtilen komutları o kod üzerinde çalıştırır.
Bu nedenle, saldırganın nihai hedefi, bir şekilde bu yapılandırma dosyalarını veya yürüttükleri komutları tehlikeye atmaktır.
Zehirli Boru Hattı Yürütmesi (PPE) yolu, bir SCM reposundaki izinleri istismar ederek bir CI boru hattını manipüle etmek ve zararlı komutlar yürütmek için kullanılır. Gerekli izinlere sahip kullanıcılar, CI yapılandırma dosyalarını veya boru hattı işinde kullanılan diğer dosyaları kötü niyetli komutlar içerecek şekilde değiştirebilir. Bu, CI boru hattını "zehirler" ve bu kötü niyetli komutların yürütülmesine yol açar.
Kötü niyetli bir aktörün PPE saldırısını başarılı bir şekilde gerçekleştirebilmesi için:
VCS platformuna yazma erişimine sahip olması gerekir, çünkü genellikle boru hatları bir itme veya çekme isteği gerçekleştirildiğinde tetiklenir. (Erişim elde etme yollarının bir özeti için VCS pentesting metodolojisine bakın).
Bazen bir dış PR'nın "yazma erişimi" olarak sayıldığını unutmayın.
Yazma izinlerine sahip olsa bile, CI yapılandırma dosyasını veya yapılandırmanın dayandığı diğer dosyaları değiştirebileceğinden emin olması gerekir.
Bunun için, dal korumalarını aşabilmesi gerekebilir.
Üç PPE çeşidi vardır:
D-PPE: Doğrudan PPE saldırısı, aktörün yürütülecek CI yapılandırma dosyasını değiştirdiği durumdur.
I-DDE: Dolaylı PPE saldırısı, aktörün yürütülecek CI yapılandırma dosyasının dayandığı bir dosyayı değiştirdiği durumdur (örneğin, bir make dosyası veya bir terraform yapılandırması).
Halka Açık PPE veya 3PE: Bazı durumlarda, boru hatları repo'da yazma erişimi olmayan kullanıcılar tarafından tetiklenebilir (ve bu kullanıcılar belki de organizasyonun bir parçası bile olmayabilir) çünkü PR gönderebilirler.
3PE Komut Enjeksiyonu: Genellikle, CI/CD boru hatları PR hakkında bilgi içeren ortam değişkenleri ayarlar. Eğer bu değer bir saldırgan tarafından kontrol edilebiliyorsa (örneğin, PR'nın başlığı gibi) ve tehlikeli bir yerde (örneğin, sh komutları yürütmekte) kullanılıyorsa, bir saldırgan orada komut enjekte edebilir.
Bir boru hattını zehirlemenin 3 çeşidini bilmek, bir saldırganın başarılı bir istismar sonrasında neler elde edebileceğini kontrol etmemizi sağlar:
Gizli Bilgiler: Daha önce belirtildiği gibi, boru hatları işlerinin yürütülmesi için ayrıcalıklara ihtiyaç duyar (kod almak, inşa etmek, dağıtmak...) ve bu ayrıcalıklar genellikle gizli bilgilerle verilir. Bu gizli bilgiler genellikle ortam değişkenleri veya sistem içindeki dosyalar aracılığıyla erişilebilir. Bu nedenle, bir saldırgan her zaman mümkün olduğunca çok gizli bilgi sızdırmaya çalışacaktır.
Saldırgan, boru hattı platformuna bağlı olarak gizli bilgileri yapılandırmada belirtmek zorunda kalabilir. Bu, eğer saldırgan CI yapılandırma boru hattını değiştiremiyorsa (I-PPE örneğin), yalnızca o boru hattının sahip olduğu gizli bilgileri sızdırabileceği anlamına gelir.
Hesaplama: Kod bir yerde yürütülür, nerede yürütüldüğüne bağlı olarak bir saldırgan daha ileriye geçebilir.
Yerel: Eğer boru hatları yerel olarak yürütülüyorsa, bir saldırgan daha fazla kaynağa erişimi olan bir iç ağa girebilir.
Bulut: Saldırgan buluttaki diğer makinelere erişebilir ama aynı zamanda IAM rolleri/hizmet hesapları tokenlarını sızdırarak bulut içinde daha fazla erişim elde edebilir.
Platform makinesi: Bazen işler boru hattı platform makineleri içinde yürütülür, bu makineler genellikle daha fazla erişim olmadan bir bulut içindedir.
Seçin: Bazen boru hattı platformu birkaç makineyi yapılandırmış olabilir ve eğer CI yapılandırma dosyasını değiştirebilirseniz, kötü niyetli kodu nerede çalıştırmak istediğinizi belirtebilirsiniz. Bu durumda, bir saldırgan muhtemelen her olası makinede bir ters shell çalıştırarak daha fazla istismar etmeye çalışacaktır.
Üretimi tehlikeye atmak: Eğer boru hattı içindeyseniz ve nihai versiyon buradan inşa edilip dağıtılıyorsa, üretimde çalışacak kodu tehlikeye atabilirsiniz.
Chain-bench, yeni bir CIS Yazılım Tedarik Zinciri benchmark'ına dayalı olarak yazılım tedarik zinciri yığınınızı güvenlik uyumluluğu için denetlemek üzere açık kaynak bir araçtır. Denetim, kod zamanından dağıtım zamanına kadar riskleri ortaya çıkarabileceği tüm SDLC sürecine odaklanır.
Cider'a göre en iyi 10 CI/CD riski hakkında bu ilginç makaleyi kontrol edin: https://www.cidersecurity.io/top-10-cicd-security-risks/
Yerel olarak çalıştırabileceğiniz her platformda, test etmek için istediğiniz gibi yapılandırabileceğiniz şekilde nasıl başlatılacağını bulacaksınız.
Gitea + Jenkins laboratuvarı: https://github.com/cider-security-research/cicd-goat
Checkov: Checkov, altyapı olarak kod için statik kod analizi aracıdır.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)