En viktig del av sårbarhetshåndtering er å grundig forstå og sikre forsyningskjeden til programvarekomponentene som utgjør moderne systemer. Agile- og DevOps-team bruker i stor grad åpen kildekode-biblioteker og rammeverk for å redusere utviklingstiden og -kostnadene. Men denne medaljen har også en bakside: muligheten til å arve andres feil og sårbarheter.
Selvfølgelig bør teamet være sikker på å vite hvilke åpen kildekode-komponenter som er inkludert i applikasjonene, sørge for at kjente pålitelige versjoner lastes ned fra kjente pålitelige kilder, og laste ned oppdaterte versjoner av komponenter etter at nylig oppdagede sårbarheter er korrigert.
I dette innlegget skal vi se på bruk av OWASP Dependency Check for å avbryte en build hvis den oppdager alvorlige problemer med koden din.
I boken «Utviklingssikkerhet i smidige prosjekter» er det beskrevet som følger. OWASP Dependency Check er en gratis skanner som katalogiserer alle åpen kildekodekomponenter som brukes i en applikasjon og viser sårbarhetene de inneholder. Det finnes versjoner for Java, .NET, Ruby (gemspec), PHP (komponist), Node.js og Python, samt for noen C/C++-prosjekter. Dependency Check integreres med vanlige byggeverktøy, inkludert Ant, Maven og Gradle, og kontinuerlige integrasjonsservere som Jenkins.
Dependency Check rapporterer alle komponenter med kjente sårbarheter fra NISTs National Vulnerability Database (NVD) og oppdateres med data fra NVD-nyhetsfeeds.
Heldigvis kan alt dette gjøres automatisk ved hjelp av verktøy som OWASP Dependency Check-prosjektet eller kommersielle programmer som
Disse verktøyene kan inkluderes i bygge-pipelines for å automatisk inventere åpen kildekode-avhengigheter, identifisere utdaterte versjoner av biblioteker og biblioteker som inneholder kjente sårbarheter, og avbryte builds hvis alvorlige problemer oppdages.
OWASP-avhengighetssjekk
For å teste og demonstrere hvordan Dependency Check fungerer, bruker vi dette depotet
For å se HTML-rapporten må du konfigurere nginx-webserveren på gitlab-runneren din.
Eksempel på en minimal nginx-konfigurasjon:
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 {
}
}
På slutten av monteringen kan du se dette bildet:
Følg lenken og se rapporten om avhengighetssjekk.
Det første skjermbildet er den øverste delen av rapporten med et sammendrag.
Andre skjermbildedetaljer CVE-2017-5638. Her ser vi CVE-nivået og lenker til utnyttelser.
Det tredje skjermbildet er detaljer om log4j-api-2.7.jar. Vi ser at CVE-nivåene er 7.5 og 9.8.
Det fjerde skjermbildet er detaljene til commons-fileupload-1.3.2.jar. Vi ser at CVE-nivåene er 7.5 og 9.8.
Hvis du vil bruke gitlab-sider, vil det ikke fungere - en falt oppgave vil ikke skape en artefakt.
Eksempel her
Bygg utdata: ingen artefakter, jeg ser ikke html-rapporten. Du bør prøve Artifact: alltid
Regulerer nivået av CVE-sårbarheter
Den viktigste linjen i gitlab-ci.yaml-filen:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7
Med failBuildOnCVSS-parameteren kan du justere nivået av CVE-sårbarheter som du må svare på.
Laster ned NIST Vulnerability Database (NVD) fra Internett
Har du lagt merke til at NIST konstant laster ned NIST sårbarhetsdatabaser (NVD) fra Internett:
For å laste ned kan du bruke verktøyet
La oss installere og starte den.
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 laster opp NIST JSON CVE til /var/www/repos/nist-data-mirror/ ved oppstart og oppdaterer dataene hver 24. time.
For å laste ned CVE JSON NIST, må du konfigurere nginx-webserveren (for eksempel på gitlab-runner).
Eksempel på en minimal nginx-konfigurasjon:
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 {
}
}
For ikke å lage en lang linje hvor mvn er lansert, vil vi flytte parameterne inn i en egen variabel DEPENDENCY_OPTS.
Den siste minimale konfigurasjonen .gitlab-ci.yml vil se slik ut:
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
Kilde: www.habr.com