En vigtig del af sårbarhedshåndtering er at forstå og sikre forsyningskæden af softwarekomponenter, som moderne systemer bygges op af. Teams, der praktiserer agile metoder og DevOps, bruger i vid udstrækning biblioteker og rammer med open source for at reducere udviklingstid og -omkostninger. Men denne medalje har også en bagside: muligheden for at arve andres fejl og sårbarheder.
Åbenlyst må teamet vide, hvilke open source-komponenter der er inkluderet i deres applikationer, sørge for, at pålidelige versioner downloades fra pålidelige kilder og opdatere komponenter efter at have rettet nyopdagede sårbarheder.
I dette indlæg vil vi se på brugen af OWASP Dependency Check til at stoppe bygningen, hvis der opdages alvorlige problemer med din kode.
I bogen "Sikkerhed i udvikling af Agile-projekter" beskrives det således. OWASP Dependency Check er en gratis scanner, der katalogiserer alle de open source-komponenter, der anvendes i applikationen, og viser de sårbarheder, der findes i dem. Der findes versioner til Java, .NET, Ruby (gemspec), PHP (composer), Node.js og Python, samt for nogle projekter på C/C++. Dependency Check integreres med almindelige byggeværktøjer, herunder Ant, Maven og Gradle samt CI-servere som Jenkins.
Dependency Check rapporterer om alle komponenter med kendte sårbarheder fra NIST's National Vulnerability Database (NVD) og opdateres baseret på data fra NVD's nyhedskanaler.
Heldigvis kan alt dette gøres automatisk ved hjælp af værktøjer som OWASP Dependency Check-projektet eller kommercielle programmer som , , , fra firmaet Sonatype eller .
Disse værktøjer kan inkluderes i bygge-pipelines for automatisk at oprette en liste over open source-afhængigheder, identificere forældede versioner af biblioteker og biblioteker med kendte sårbarheder og stoppe bygningen, hvis der opdages alvorlige problemer.
OWASP Dependency Check
Til test og demonstration af Dependency Check bruger vi dette repository .
For at se HTML-rapporten skal du konfigurere en webserver nginx på din gitlab-runner.
Eksempel på en minimal nginx-konfiguration:
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 {
}
}I slutningen af samlingen kan du se et billede som dette:

Vi går til linket og ser rapporten Dependency Check.
Det første screenshot - den øverste del af rapporten med et kort indhold.

Det andet screenshot detaljer om CVE-2017-5638. Her ser vi CVE-niveauet og links til exploits.

Det tredje screenshot - detaljer om log4j-api-2.7.jar. Vi ser at CVE-niveauerne er 7,5 og 9,8.

Det fjerde screenshot - detaljer om commons-fileupload-1.3.2.jar. Vi ser at CVE-niveauerne er 7,5 og 9,8.

Hvis du vil bruge gitlab pages, så vil det ikke fungere - en mislykket opgave vil ikke skabe et artefakt.
Eksempel her .
Udfaldet af samlingen: der er ingen artefakter, jeg kan ikke se html-rapporten. Skal prøve Artifact: always

Regulering af CVE-niveauet for sårbarheder
Den vigtigste linje i filen gitlab-ci.yaml:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7Med parameteren failBuildOnCVSS kan du regulere CVE-niveauet for sårbarheder, som der skal reageres på.
Download af sårbarhedsdatabasen (NVD) NIST fra internettet
Du har bemærket, at den konstant downloader sårbarhedsdatabaser (NVD) NIST fra internettet:

Til download kan du bruge værktøjet
Lad os installere og starte det.
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 downloader CVE JSON NIST til /var/www/repos/nist-data-mirror/ ved opstart og opdaterer data hver 24 timer.
For at downloade CVE JSON NIST skal du konfigurere webserveren nginx (for eksempel på din gitlab-runner).
Eksempel på en minimal nginx-konfiguration:
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 at undgå at lave en lang linje hvor mvn køres, lad os flytte parametrene til en separat variabel DEPENDENCY_OPTS.
Den resulterende minimale konfiguration .gitlab-ci.yml vil se således ud:
variabler:
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: habr.com
