Açık Kaynak Kod Zafiyetlerinin Devops Pipeline'ında Yönetimi ve Örnek Uygulama

Bu makalede zafiyetli Apache Struts kütüphanesi içeren örnek bir java projesini, bir SCA (Software Composition Analysis) ürünü olan Sonatype Nexus Lifecycle ile açık kaynak kod açıklarına karşı devops pipeline’ında nasıl koruyabileceğimizi inceleceğiz.

Projemiz java’da geliştirilmiş küçük bir proje, SCM (Source Code Management) ve CI/CD olarak Gitlab kullanılıyor.

Proje, derleme aracı olarak Maven kullanıyor. Pom.xml dosyasını incelediğimizde, Apache Struts’ın RCE zafiyeti içeren (CVE-2023-50164) 6.3.0.1 versiyonunun kullanıldığını görüyoruz.

İlgili kütüphaneyi Maven Repo'sunda, Sonatype’ın tarayıcı eklentisi ile incelediğimizde bize kritik seviyede bir zafiyet içerdiğini gösteriyor.

Sonatype’ın IDE ve tarayıcı eklentileri, Shift-left presibi gereği güvenlik problemlerinin erken tespitinde önemli iki bileşen. Şimdi bu uygulamayı CI/CD aşamasında nasıl güvenli hale getirebiliriz, onu inceleyelim. Aşağıda Gitlab’te CI/CD sürecini yönetmek için kullanılan .gitlab-ci.yml dosyasının içeriğini görebilirsiniz.

stages:          
  - build
  - test
  - deploy

build-job:      
  stage: build
  script:
    - echo "Compiling the code..."
    - echo "Compile complete."

iq_policy_eval:
  stage: test
  image: sonatype/gitlab-nexus-iq-pipeline:latest
  script:
    - /sonatype/evaluate -i poc .
  artifacts:
    name: "policy-eval-$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    paths:
      - poc-policy-eval-report.html

deploy-job:  
  stage: deploy  
  environment: production
  script:
    - echo "Deploying application..."
    - echo "Application successfully deployed."

Burada Sonatype ile entegrasyonu gerçekleştiren adım, iq_policy_eval adımı. Bu adımda kullandığımız konteyner imajı, bize Sonatype tarafından hazır olarak sunuluyor. Bizim tanımlamamız gereken tek değişken uygulama ismi, bu adımda poc olarak verildi. Burada Gitlab’te önceden tanımlanmış değişkenlerde kullanılabilir. Bu uygulama için Sonatype Nexus Lifecycle uygulamasında karşılığı olan bir uygulama var.

Pipeline tetiklendiğinde, konteyner imajı içinde çalıştırdığımız /sonatype/evaluate -i poc . komutu, projedeki dosyalarla ilgili bilgiyi toplayıp, Nexus Lifecycle uygulamasına gönderiyor ve güvenlik testi yapılmış oluyor.

Entegrasyonu tamamlamak için Pipeline’da ilgili değişkenleri tanımlamamız gerekiyor. Artık pipeline tetiklendiğinde, SCA taramalarını yapabilir hale geldik. Son olarak Nexus Lifecycle üzerinden, kritik bir bulgu yakalandığında nasıl bir aksiyon alacağımıza dair ayarı yapmamız gerekiyor.

Build aşamasında aksiyonu Fail‘e çekerek, kritik bir açık bulunduğunda artık pipeline’ı kıracak hale getirdik. Artık pipeline’ı tetikleyip deneyebiliriz.

Göründüğü gibi, pipeline kırıldı. Şimdi ilgili adımı detaylı inceleyelim.

Projedeki zafiyetli Apache Struts kütüphanesinin tespit edildiğini görüyoruz. Kritik bulgularda Fail emri verdiğimiz için, pipeline kırılmış oldu. Şimdi bu uygulama için yaratılan rapor linki üzerinden, bulunan zafiyeti detaylı inceleyelim.

Kütüphaneyi pom.xml dosyasında tespit ettiğini görüyoruz. Bize zafiyet içermeyen sürümleri ve bizim belirlediğimiz kurallara takılıp takılmadığı hakkında detaylı bilgi veriyor.

Bu aşamada gelişitiriciler, geliştirdikleri uygulama özelinde kısıtlı haklar verilmiş kullanıcıları üzerinden aynı raporu inceleyip, bulguyu kapatabilirler. Bu işlemleri IDE ve tarayıcı eklentileri üzerinden de yapabilirler. □

Written by

Furkan Turan