Fortify SCA Assesment İle Android Gradle Projesi Taramak - Azure Devops Pipeline

Selamlar, bu yazımızda Azure Devops ortamında bir Pipeline ile Java ile yazılmış bir gradle projesinin kaynak kod taramasını gerçekleştireceğiz. Bunun için Azure Devops’da bulunan Fortify Static Code Analyzer (SCA) Assessment eklentisini kullanarak ScanCentral ile bir tarama yapacağız.

  • Kullanılan SCA Versiyonu: 23.2

Gereksinimler:

  • Gradle projesinin gradle ile build alınabiliyor olması gerekmektedir.
  • SCA Assesment eklentisini kullanabilmek için Azure Agent’ının kurulu olduğu makinede, SCA dizini içerisinde lisans dosyası bulunmalıdır.
  • Sourceanalyzer.exe’nin kurulu olduğu makinede gradle kurulu olmalıdır.
  • Android SDK makinede yüklü olmalıdır

Hazırlık

ℹ️ Bu yazı kapsamında, https://github.com/android/gradle-recipes reposundan alınan addCustomBuildConfigFields klasörü ayrı bir git reposu olarak yüklenmiştir: https://github.com/rbozburun/gradle-test

  • SCA taramasının Fortify Software Security Center (SSC) arayüzüne yüklenebilmesi için bir Service Connection tanımlanmalıdır. (Bkz. Requirements for Fortify Static Code Analyzer Tasks (microfocus.com))
  • Bunun için, Azure Devops’da ilgili proje üzerinden Project Settings > Service Connections menüsünden Generic Service Connection oluşturulmalıdır.
    URL kısmına “https://hostname:8443/ssc/” formatında SSC url verilmeli ve Token kısmına Fortify SSC’den alınan CIToken bilgisi girilmelidir. Diğer alanlar boş bırakılabilir.

Azure Devops Ortamında Pipeline’ın Oluşturulması

Azure Devops ortamında oturum açılarak yeni bir pipeline oluşturulur ve https://github.com/rbozburun/gradle-test reposu seçilerek devam edilir.

1- Gradle Versiyon Güncellemesi

Projede kullanılan gradle versiyonu /gradle/wrapper/gradle-wrapper.properties içerisinden görüntülenebilmektedir. Buradaki versiyon 8.6 olarak görülmektedir (gradle-8.6-bin.zip). Makinede kullanılan gradle versiyonu ise 8.8’dir:

Untitled

Projenin gradle versiyonunu 8.8’e çıkarmak için normalde “./gradlew.bat wrapper --gradle-version 8.8” komutu kullanılmalıdır. SourceAnalyzer’ın ilgili buildi içerisinde bunu yapabilmek için aşağıdaki gibi bir pipeline taskı oluşturulur:

trigger:
- main

pool: Default

steps:
- task: CmdLine@2
  inputs:
    script: 'sourceanalyzer -b gradle_f gradlew wrapper --gradle-version 8.8'

2- Android SDK ve Android Home Değişkenlerinin Tanımlanması

Azure Agent’ın kullanabilmesi için ANDROID_SDK_HOME ve ANDROID_HOME değişkenlerinin pipeline’a variable olarak eklenmesi gerekmektedir.

Sağ üstten, Variables butonuna tıklanarak değişenler aşağıdaki gibi pipeline’a tanımlanır.

Untitled

Değişken tanımlama işlemi bittikten sonra pipeline içerisinde bu değişenler CMD üzerinden set ile eklenir.

trigger:
- main

pool: Default

steps:
- task: CmdLine@2
  inputs:
    script: 'sourceanalyzer -b gradle_f gradlew wrapper --gradle-version 8.8'
- task: CmdLine@2
  inputs:
    script: |
      set ANDROID_HOME=$(ANDROID_HOME)
      set ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT)
- task: CmdLine@2
  inputs:
    script: 'echo %ANDROID_HOME%'

3- Fortify SCA Assesment Eklentisinin Yapılandırılması

Eklentinin düzgün çalışabilmesi için 1. ve 2. adımları tamamladıktan sonra artık eklentiyi kullanabiliriz. Bunun için sağ taraftan Show Assistant diyip Assistant’ı açıp arama kutucuğuna Fortify yazıyoruz:

Untitled

Burada Fortify Static Code Analyzer Assesment taskını seçerek ilerliyoruz.

Genel Ayarlar:

Untitled

  • Build ID for Fortify SCA: Proje için bir build-id girilir.
  • Run SCA clean**:** Translate aşamasında oluşan eski dosyaları silebilmek için işaretli olmalıdır.
  • Enable verbose logging: Hata ayıklama yapabilmek adına işaretli olmalıdır.
  • Enable debug logging: Hata ayıklama yapabilmek adına işaretli olmalıdır.

Translation Ayarları:

Untitled

  • Run Fortify SCA translation: Transalte aşamasının yapılabilmesi için işaretli olmalıdır.
  • Application Type: Projemiz bir Android projesi olduğu ve Kotlin ile yazıldığı için Other seçilir.
  • Build Tool Options: gradlew clean build

Tarama Ayarları:

Untitled

  • Run Fortify SCA scan: SCA taraması yapılabilmesi için işaretli olmalıdır
  • Scan type: Dağıtık yapıda SCA kurulum varsa ScanCentral, direkt agent’ın kurulu olduğu makinede SCA taraması yapılmak isteniyorsa da Local seçilir.
  • Fortify SSC service connecttion: Hazırlık aşamasında oluşturulan SSC service connection seçilir.
  • Upload Results to SSC: Sonuçların SSC arayüzüne yüklenebilmesi için işaretli olmalıdır.

Yukarıdaki alanlar doldurulduktan sonra, version ID kullanılarak SSC üzerindeki proje versiyonu seçilir. İsteğe bağlı olarak bir Build Failure Criteria belirlenebilir. Aşağıdaki örnekte ben kritik zafiyet varsa build kırılsın istediğim için “[fortify priority order]:critical” ifadesini kullandım.

Untitled

Daha sonrasında Add denilerekten SCA taskı pipeline’a eklenir. Son durum aşağıdaki gibi olmalıdır:

trigger:
- main

pool: Default

steps:
- task: CmdLine@2
  inputs:
    script: 'sourceanalyzer -b gradle_f gradlew wrapper --gradle-version 8.8'
- task: CmdLine@2
  inputs:
    script: |
      set ANDROID_HOME=$(ANDROID_HOME)
      set ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT)
- task: CmdLine@2
  inputs:
    script: 'echo %ANDROID_HOME%'
- task: FortifySCA@7
  inputs:
    applicationType: 'other'
    buildToolOptions: 'gradlew clean build'
    fortifyBuildId: 'gradle_f'
    runFortifyClean: false
    scaVerbose: true
    scaDebug: true
    fortifyScanType: 'ScanCentralScan'
    scanCentralFortifyServerName: 'SSC'
    scanCentralRunFortifyUpload: true
    scanCentralFortifyApplicationIdentifierType: 'byId'
    scanCentralFortifyApplicationVersionId: '10019'
    fortifyBuildFailureCriteria: '[fortify priority order]:critical'
    taskResultForBuildFailureCriteria: 'FAIL'

Pipeline tetiklendiğinde ScanCentral SAST sekmesine SCA görevi düşer ve tarama sonlandıktan sonra proje versiyonuna ilgili FPR dosyası yüklenir.

Untitled

Mevcut durumda sadece Low seviye 1 adet zafiyet tespit edildiği için pipeline kırılmamıştır.

Written by

Resul Bozburun