Důležitou součástí správy zranitelností je dobré porozumění a zajištění bezpečnosti dodavatelského řetězce softwarových komponent, ze kterých jsou moderní systémy budovány. Týmy praktikující flexibilní metody a DevOps široce využívají knihovny a rámce s otevřeným zdrojovým kódem, aby snížily čas a náklady na vývoj. Tato medaile má však i druhou stranu: možnost zdědit cizí chyby a zranitelnosti.
Je zřejmé, že tým musí mít povědomí o tom, jaké komponenty s otevřeným zdrojovým kódem jsou zahrnuty do jeho aplikací, sledovat, aby stažení spolehlivých verzí probíhalo z důvěryhodných zdrojů, a nahrávat aktualizované verze komponent po opravě nově objevených zranitelností.
V tomto příspěvku se podíváme na použití OWASP Dependency Check k přerušení sestavení v případě zjištění závažných problémů s vaším kódem.
V knize „Bezpečnost vývoje v Agile projektech“ je to popsáno takto. OWASP Dependency Check je bezplatný skener, který katalogizuje všechny komponenty s otevřeným zdrojovým kódem používané v aplikaci a ukazuje existující zranitelnosti. Existují verze pro Java, .NET, Ruby (gemspec), PHP (composer), Node.js a Python, stejně jako pro některé projekty v C/C++. Dependency Check se integruje s běžnými nástroji na sestavení, včetně Ant, Maven a Gradle, a s nepřetržitými integračními servery jako Jenkins.
Dependency Check hlásí všechny komponenty s známými zranitelnostmi z Národní databáze zranitelností (NVD) NIST a je aktualizován na základě informací z novinových kanálů NVD.
Naštěstí lze vše to automatizovat pomocí takových nástrojů, jako je projekt OWASP Dependency Check nebo komerční programy typu , , , společnosti Sonatype nebo .
Tyto nástroje lze zahrnout do sestavovacích toků, aby se automaticky vytvářel seznam závislostí s otevřeným zdrojovým kódem, identifikovaly staré verze knihoven a knihovny obsahující známé zranitelnosti a přerušilo se sestavení v případě zjištění závažných problémů.
OWASP Dependency Check
Pro testování a demonstraci funkce Dependency Check použijeme toto úložiště .
Pro zobrazení HTML zprávy je nutné nakonfigurovat webový server nginx na vašem gitlab-runner.
Příklad minimální konfigurace 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 sestavení vidíte takový obrazec:

Přejděte na odkaz a uvidíte zprávu Dependency Check.
První screenshot — horní část zprávy s krátkým shrnutím.

Druhý screenshot podrobnosti o CVE-2017-5638. Zde vidíme úroveň CVE a odkazy na exploit.

Třetí screenshot — podrobnosti o log4j-api-2.7.jar. Vidíme, že úrovně CVE jsou 7.5 a 9.8.

Čtvrtý screenshot — podrobnosti o commons-fileupload-1.3.2.jar. Vidíme, že úrovně CVE jsou 7.5 a 9.8.

Pokud chcete používat gitlab pages, nebude to fungovat — selhávající úkol nevytvoří artefakt.
Příklad zde .
Výstup sestavení: artefakty nejsou, zprávu HTML nevidím. Měl bych zkusit Artifact: always

Regulace úrovně CVE zranitelností
Nejdůležitější řádek v souboru gitlab-ci.yaml:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7Parametrem failBuildOnCVSS můžete regulovat úroveň CVE zranitelností, na které je třeba reagovat.
Stahování databáze zranitelností (NVD) NIST z internetu
Zaznamenali jste, že neustále stahuje databáze zranitelností (NVD) NIST z internetu:

Pro stahování můžete použít utilitu
Nainstalujeme a spustíme ji.
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 stahuje CVE JSON NIST do /var/www/repos/nist-data-mirror/ při spuštění a aktualizuje data každých 24 hodin.
Pro stahování CVE JSON NIST je třeba nastavit webový server nginx (například na vašem gitlab-runner).
Příklad minimální konfigurace 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 {
}
}Abychom nemuseli psát dlouhý řetězec, kde se spouští mvn, vyjmeme parametry do samostatné proměnné DEPENDENCY_OPTS.
Konečný minimální konfigurační soubor .gitlab-ci.yml bude vypadat takto:
proměnné:
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:
cesty:
- .m2/repository
ověření:
fáze: test
skript:
- 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}
štítky:
- shell
Zdroj: habr.com
