Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Una parte importante della gestione delle vulnerabilità è comprendere a fondo e proteggere la catena di fornitura dei componenti software che compongono i sistemi moderni. I team Agile e DevOps fanno ampio uso di librerie e framework open source per ridurre tempi e costi di sviluppo. Ma questa medaglia ha anche uno svantaggio: l’opportunità di ereditare gli errori e le vulnerabilità di altre persone.

Ovviamente, il team dovrebbe essere sicuro di sapere quali componenti open source sono inclusi nelle sue applicazioni, assicurarsi che le versioni affidabili conosciute vengano scaricate da fonti affidabili conosciute e scaricare versioni aggiornate dei componenti dopo che le vulnerabilità appena scoperte sono state risolte.

In questo post esamineremo l'utilizzo del controllo delle dipendenze OWASP per interrompere una build se rileva problemi seri con il codice.

Nel libro “Sicurezza dello sviluppo nei progetti agili” viene descritto come segue. OWASP Dependency Check è uno scanner gratuito che cataloga tutti i componenti open source utilizzati in un'applicazione e mostra le vulnerabilità in essi contenute. Esistono versioni per Java, .NET, Ruby (gemspec), PHP (compositore), Node.js e Python, nonché per alcuni progetti C/C++. Dependency Check si integra con strumenti di creazione comuni, tra cui Ant, Maven e Gradle, e server di integrazione continua come Jenkins.

Il controllo delle dipendenze segnala tutti i componenti con vulnerabilità note dal National Vulnerability Database (NVD) del NIST e viene aggiornato con i dati provenienti dai feed di notizie NVD.

Fortunatamente, tutto questo può essere fatto automaticamente utilizzando strumenti come il progetto OWASP Dependency Check o programmi commerciali come Anatra Nera, Raggi X di JFrog, Snyk, Ciclo di vita del Nexus Sonatipo o FonteClear.

Questi strumenti possono essere inclusi nelle pipeline di build per inventariare automaticamente le dipendenze open source, identificare versioni obsolete di librerie e librerie contenenti vulnerabilità note e interrompere le build se vengono rilevati problemi gravi.

Controllo delle dipendenze OWASP

Per testare e dimostrare come funziona il controllo delle dipendenze, utilizziamo questo repository esempio di controllo delle dipendenze.

Per visualizzare il report HTML, devi configurare il server web nginx sul tuo gitlab-runner.

Esempio di configurazione nginx minima:

server {
    listen       9999;
    listen       [::]:9999;
    server_name  _;
    root         /home/gitlab-runner/builds;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

Al termine dell’assemblea potete vedere questa immagine:

Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Segui il collegamento e visualizza il rapporto Controllo dipendenze.

Il primo screenshot è la parte superiore del report con un riepilogo.

Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Dettagli della seconda schermata CVE-2017-5638. Qui vediamo il livello CVE e i collegamenti agli exploit.

Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Il terzo screenshot mostra i dettagli di log4j-api-2.7.jar. Vediamo che i livelli CVE sono 7.5 e 9.8.

Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Il quarto screenshot contiene i dettagli di commons-fileupload-1.3.2.jar. Vediamo che i livelli CVE sono 7.5 e 9.8.

Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Se desideri utilizzare le pagine gitlab, non funzionerà: un'attività interrotta non creerà un artefatto.

Esempio qui https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Output di build: nessun artefatto, non vedo il report html. Dovresti provare Artifact: sempre

https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246

Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Regolamentazione del livello di vulnerabilità CVE

La riga più importante nel file gitlab-ci.yaml:

mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7

Con il parametro failBuildOnCVSS puoi regolare il livello di vulnerabilità CVE a cui devi rispondere.

Download del database delle vulnerabilità del NIST (NVD) da Internet

Hai notato che il NIST scarica costantemente i database delle vulnerabilità NIST (NVD) da Internet:

Utilizzo dello scanner di vulnerabilità per le librerie utilizzate Dependency-Check in GitlabCI

Per scaricare è possibile utilizzare l'utility nist_data_mirror_golang

Installiamolo e avviamolo.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nist_data_mirror_golang
yum -y install nist-data-mirror
systemctl start nist-data-mirror

Nist-data-mirror carica il NIST JSON CVE su /var/www/repos/nist-data-mirror/ all'avvio e aggiorna i dati ogni 24 ore.

Per scaricare CVE JSON NIST, è necessario configurare il server web nginx (ad esempio, sul tuo gitlab-runner).

Esempio di configurazione nginx minima:

server {
    listen       12345;
    listen       [::]:12345;
    server_name  _;
    root         /var/www/repos/nist-data-mirror/;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

}

Per non creare una lunga fila in cui viene lanciato mvn, sposteremo i parametri in una variabile separata DEPENDENCY_OPTS.

La configurazione minima finale .gitlab-ci.yml sarà simile a questa:

variables:
  MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
  DEPENDENCY_OPTS: "-DfailBuildOnCVSS=7 -DcveUrlModified=http://localhost:12345/nvdcve-1.1-modified.json.gz -DcveUrlBase=http://localhost:12345/nvdcve-1.1-%d.json.gz"

cache:
  paths:
    - .m2/repository

verify:
  stage: test
  script:
    - set +e
    - mvn $MAVEN_CLI_OPTS install org.owasp:dependency-check-maven:check $DEPENDENCY_OPTS || EXIT_CODE=$?
    - export PATH_WITHOUT_HOME=$(pwd | sed -e "s//home/gitlab-runner/builds//g")
    - echo "************************* URL Dependency-check-report.html *************************"
    - echo "http://$HOSTNAME:9999$PATH_WITHOUT_HOME/target/dependency-check-report.html"
    - set -e
    - exit ${EXIT_CODE}
  tags:
    - shell

Chat di Telegram su DevOps e sicurezza
Canale Telegram DevSecOps / SSDLC - Sviluppo sicuro

Fonte: habr.com

Aggiungi un commento