Secret Security - DevSecOps Pipeline'ı Güvende Tutun!

Github, GitLab ve BitBucket gibi kod depolama platformları yazılım geliştirme süreçlerimizin olmazsa olmaz bir parçası. Git versiyon kontrol sistemini kullanarak, yazdığımız kodları geçmişe dönebilecek şekilde bu tarz platformlarda saklıyoruz. Peki, versiyon kontrol sistemlerinin güvensiz kullanımı nasıl bir soruna yol açabilir? Bu makalede bu konuyu irdeliyor olacağız, ardından açık kaynak GitLeaks projesini kullanaraktan mini bir pipeline oluşturup git repomuzun güvenliğini sağlayacağız.

Git Repolarında Tehlike

Bir hacker, özellikle “targeted” bir saldırı gerçekleştiriyorsa hedefe saldırmadan önce en fazla eforu keşif adımında harcar. Hedef kurumu hacklemeden önce o kurumun Saldırı Yüzeyi’ni derinlemesini inceleyip bulabildikleri her türlüğü açığı kullanır.

Saldırı yüzeyi, kurumun dijital uzayda sahip oldukları hacim olarak değerlendirilebilir. IP adresi, sosyal medya hesapları, open-source projeler, mail adresleri gibi aklınıza gelebilecek her türlü dijital veri, ilgili kurumun dijital ayak izini, dolayısıyla saldırı yüzeyini oluşturur.

Burada OSINT çalışmaları sırasında Git repolarıda yoğun olarak analiz edilen noktalardan bir tanesidir. Saldırganlar bu süreçte ilgili platformun arama motoruna talimatlar vererek (dorklar kullanarak) daha kesin sonuçlara ulaşırlar. Örneğin Github için aşağıdaki dorklar kullanılarak bir organizasyonun sızdırdığı hassas veriler tespit edilebilir.

HEROKU_API_KEY language:json
filename:.esmtprc password
extension:pem private
filename:.env DB_USERNAME NOT homestead
....

Örneğin “owner:rbozburun password language:sql” Github dorku ile kendi repolarımdan birinde yer alan gömülü parola değerine erişim sağladım.

image.png

Güvenli yazılım geliştirme süreçlerine SAST araçlarını dahil edip kaynak kodumuzu tarayıp hardcoded parolaları yakalayabiliyoruz, ancak bu çözüm kodun sadece mevcut yapısının taranmasını sağlıyor. Ya developer ekip için SAST aşamasını geçici olarak kapatıp yanlışlıkla hardcoded parola içeren bir kodu Github’a pushlarsa? Ardından yapılacak SAST taramaları bu durumu engelleyecektir ancak bir saldırgan Github reposunda dorklar ile araştırma yaparak ilgili projenin hardcoded key içeren commitine ulaşabilir. İşte bu tarz durumları Gitleaks gibi git scanner araçlar ile tespit edebiliriz.

GitLeaks ile Github Repolarını Taramak

Burada örnek amaçlı Juice Shop projesini kullanabiliriz. repo:juice-shop/juice-shop secret dorku ile bu repoda yer alan tüm secret değerlerine ulaşabiliriz. Örneğin aşağıda bir totpSecret tespit ettik:

image.png

Burada yaptığımız işlemi otomatize hale getirmek, commit geçmişi dahil eski versiyonlardaki secretleri de tespit edebilmek için Gitleaks’ın docker versiyonunu kullandığımızda yukarıda tespit ettiğimiz gibi onlarca farklı hassas veri tespit ettik:

  • docker run -v /home/ubuntu/juice-shop:/jshop zricethezav/gitleaks:latest detect --source=jshop -v

image.png

Ek olarak, git reposunu dahil etmeden sadece dosyaları taramak istiyorsak da docker run -v /home/ubuntu/juice-shop:/jshop zricethezav/gitleaks:latest detect --source=jshop -v --no-git kullanımını yapabiliriz.

image.png

Burada tabi ki karşımıza çeşitli False Positive sonuçlar da çıktı. False Positive sayısını azaltmak için gitleaks.toml dosyasını ihtiyacımıza göre değiştirebiliriz

  • https://github.com/gitleaks/gitleaks/blob/master/config/gitleaks.toml

Gitleaks Pipeline Uygulaması

Komut satırı üzerinde başarılı bir şekilde tarama yaptık, şimdi Gitleaks’ı Jenkins Pipeline’a dahil edelim. Bunun için aşağıdaki gibi bir groovy dosyası oluşturduk.

pipeline {
    agent {
        label 'Ubuntu'
    }

    stages {
        stage('GitLeaks Analysis') {
            steps {
                script {
                    def exitCode = sh(script: '''
                        docker pull zricethezav/gitleaks:latest
                        docker run -v /home/jenkins/agent/workspace/juice-shop:/jshop zricethezav/gitleaks:latest detect --source=jshop -v
                    ''', returnStatus: true) // capture the exit code
                    
                    echo "Exit Code: ${exitCode}"

                    // Check if exit code is 1 and abort the pipeline
                    if (exitCode == 1) {
                        error "GitLeaks detected secret in your commits, fix commits!"
                    }
                }
            }
        }
    }
}

Yukarıdaki örnekte, pipeline devreye girdikten sonra tüm git reposunu tarayacak ve eğer gitleaks secret tespit ederse exit 1 ile çıkış yapacak. Bu durumda CI/CD sürecimiz kırılmış olacak.

image.png

Written by

Resul Bozburun