Dôležitou súčasťou správy zraniteľností je dobré porozumenie a zabezpečenie dodávateľského reťazca tých softvérových komponentov, z ktorých sú postavené moderné systémy. Tímy, ktoré používajú agilné metódy a DevOps, široko využívajú knižnice a frameworky s otvoreným zdrojovým kódom, aby skrátili čas a náklady na vývoj. Ale táto medaila má aj rubovú stránku: možnosť zdediť cudzí problém a zraniteľnosti.
Je zrejmé, že tím musí vedieť, ktoré komponenty s otvoreným zdrojovým kódom sú zahrnuté v jeho aplikáciách, sledovať, aby sa spoľahlivé verzie sťahovali z dôveryhodných zdrojov a nahrávať aktualizované verzie komponentov po oprave novo objavených zraniteľností.
V tomto príspevku sa pozrieme na použitie OWASP Dependency Check na prerušenie zostavenia v prípade zistenia vážnych problémov s vaším kódom.
V knihe „Bezpečnosť vývoja v Agile projektoch“ je to opísané takto. OWASP Dependency Check je bezplatný skener, ktorý katalogizuje všetky komponenty s otvoreným zdrojovým kódom používané v aplikácii a ukazuje zraniteľnosti, ktoré v nich existujú. Existujú verzie pre Java, .NET, Ruby (gemspec), PHP (composer), Node.js a Python, ako aj pre niektoré projekty v C/C++. Dependency Check sa integruje s bežnými nástrojmi na zostavovanie, ako sú Ant, Maven a Gradle a servery pre kontinuálnu integráciu ako Jenkins.
Dependency Check informuje o všetkých komponentoch so známymi zraniteľnosťami z Národnej databázy zraniteľností (NVD) NIST a aktualizuje sa na základe údajov z novinových kanálov NVD.
Našťastie je možné všetko to automatizovať pomocou takýchto nástrojov, ako je projekt OWASP Dependency Check, alebo komerčných programov typu , , , spoločnosti Sonatype alebo .
Tieto nástroje je možné integrovať do zostavovacích potrubí, aby automaticky vytvárali zoznam závislostí s otvoreným zdrojovým kódom, odhaľovali zastarané verzie knižníc a knižnice, ktoré obsahujú známe zraniteľnosti, a prerušili zostavenie v prípade zistenia závažných problémov.
OWASP Dependency Check
Na testovanie a demonštráciu funkcie Dependency Check použijeme tento repozitár .
Na zobrazenie HTML správy je potrebné nastaviť webový server nginx na vašom gitlab-runner.
Príklad minimálnej konfigurácie 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 {
}
}Na konci zostavovania môžete vidieť takýto obrazec:

Prejdeme na odkaz a vidíme správu Dependency Check.
Prvý snímok obrazovky — horná časť správy s krátkym obsahom.

Druhý snímok obrazovky podrobnosti CVE-2017-5638. Tu vidíme úroveň CVE a odkazy na exploity.

Tretí snímok obrazovky — podrobnosti log4j-api-2.7.jar. Vidíme, že úrovne CVE sú 7.5 a 9.8.

Štvrtý snímok obrazovky — podrobnosti commons-fileupload-1.3.2.jar. Vidíme, že úrovne CVE sú 7.5 a 9.8.

Ak chcete používať gitlab pages, nebude to možné — zlyhaná úloha nevytvorí artefakt.
Príklad tu .
Výstup zostavovania: artefakty nie sú, html správa nie je viditeľná. Musíte vyskúšať Artifact: always

Regulácia úrovne CVE zraniteľností
Najdôležitejší riadok v súbore gitlab-ci.yaml:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7Parametrom failBuildOnCVSS môžete regulovať úroveň CVE zraniteľností, na ktoré sa treba reagovať.
Sťahovanie databázy zraniteľností (NVD) NIST z internetu
Už ste si všimli, že neustále sťahuje databázy zraniteľností (NVD) NIST z internetu:

Na sťahovanie môžete použiť utilitu
Nainštalujeme a spustíme ju.
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 sťahuje CVE JSON NIST do /var/www/repos/nist-data-mirror/ pri spustení a aktualizuje dáta každých 24 hodín.
Na sťahovanie CVE JSON NIST je potrebné nakonfigurovať webový server nginx (napríklad na vašom gitlab-runner).
Príklad minimálnej konfigurácie 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 {
}
}Aby sme nielen nespoliehali na dlhý riadok, kde sa spúšťa mvn, vystavíme parametre do samostatnej premennej DEPENDENCY_OPTS.
Výsledný minimálny konfiguračný súbor .gitlab-ci.yml bude vyzerať takto:
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
Zdroj: habr.com
