Una parte importante della gestione delle vulnerabilità è comprendere bene e garantire la sicurezza della catena di fornitura dei componenti software da cui sono costruiti i moderni sistemi. I team che praticano metodologie agili e DevOps utilizzano ampiamente librerie e framework open source per ridurre i tempi e i costi di sviluppo. Ma questa medaglia ha anche un rovescio: la possibilità di ereditare errori e vulnerabilità altrui.
È evidente che il team deve assolutamente sapere quali componenti open source sono inclusi nelle sue applicazioni, assicurarsi che le versioni ritenute sicure vengano scaricate da fonti verificate e caricare le versioni aggiornate dei componenti dopo aver corretto le vulnerabilità appena scoperte.
In questo post esamineremo l'uso di OWASP Dependency Check per interrompere la compilazione in caso di problemi seri con il tuo codice.
Nel libro "Sicurezza nello sviluppo di progetti Agile" viene descritto così. OWASP Dependency Check è un scanner gratuito che catalogizza tutti i componenti open source utilizzati nell'applicazione e mostra le vulnerabilità presenti. Sono disponibili versioni per Java, .NET, Ruby (gemspec), PHP (composer), Node.js e Python, oltre ad alcune per progetti in C/C++. Dependency Check si integra con strumenti di build comuni, tra cui Ant, Maven e Gradle e server di integrazione continua come Jenkins.
Dependency Check segnala tutti i componenti con vulnerabilità note dalla National Vulnerability Database (NVD) NIST e viene aggiornato sulla base dei dati provenienti dai canali di notizie NVD.
Fortunatamente, tutto ciò può essere fatto automaticamente con strumenti come il progetto OWASP Dependency Check o software commerciali come , , , dell'azienda Sonatype o .
Questi strumenti possono essere integrati nei pipeline di build per comporre automaticamente un inventario delle dipendenze open source, identificare versioni obsolete di librerie e librerie contenenti vulnerabilità note, e interrompere la build in caso di problemi seri.
OWASP Dependency Check
Per testare e dimostrare il funzionamento di Dependency Check utilizziamo questo repository .
Per visualizzare il report HTML è necessario configurare un server web nginx sul tuo gitlab-runner.
Ecco un esempio di configurazione minima di nginx:
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 {
}
}Alla fine della compilazione puoi vedere un'immagine come questa:

Andiamo al link e vediamo il rapporto Dependency Check.
Il primo screenshot mostra la parte superiore del rapporto con un riepilogo.

Il secondo screenshot mostra i dettagli di CVE-2017-5638. Qui vediamo il livello CVE e i link agli exploit.

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

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

Se vuoi utilizzare gitlab pages, non sarà possibile: un'attività fallita non creerà un artefatto.
Esempio qui .
Output della compilazione: nessun artefatto, non vedo un rapporto html. Bisogna provare Artifact: always

Regolazione del livello CVE delle vulnerabilità
La stringa più importante nel file gitlab-ci.yaml:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7Con il parametro failBuildOnCVSS puoi regolare il livello CVE delle vulnerabilità a cui rispondere.
Scaricamento dal web del database delle vulnerabilità (NVD) NIST
Hai notato che scarica costantemente i database delle vulnerabilità (NVD) NIST dal web:

Per il download puoi utilizzare l'utility
Installiamola e avviamola.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/nist_data_mirror_golang
yum -y install nist-data-mirror
systemctl start nist-data-mirrorNist-data-mirror scarica CVE JSON NIST in /var/www/repos/nist-data-mirror/ all'avvio e aggiorna i dati ogni 24 ore.
Per scaricare CVE JSON NIST devi configurare un server web nginx (ad esempio sul tuo gitlab-runner).
Ecco un esempio di configurazione minima di nginx:
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 stringa dove viene eseguito mvn, sposteremo i parametri in una variabile separata DEPENDENCY_OPTS.
La configurazione minima finale di .gitlab-ci.yml sarà così:
variabili:
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:
percorsi:
- .m2/repository
verifica:
fase: 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}
etichette:
- shell
Fonte: habr.com
