Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

Dôležitou súčasťou správy zraniteľnosti je dôkladné pochopenie a zabezpečenie dodávateľského reťazca softvérových komponentov, ktoré tvoria moderné systémy. Agilné tímy a tímy DevOps vo veľkej miere využívajú knižnice a rámce s otvoreným zdrojovým kódom na zníženie času a nákladov na vývoj. Táto medaila má však aj nevýhodu: možnosť zdediť chyby a zraniteľnosť iných ľudí.

Je zrejmé, že tím by si mal byť istý, že vie, ktoré open source komponenty sú zahrnuté v jeho aplikáciách, zabezpečiť, aby sa známe spoľahlivé verzie stiahli zo známych spoľahlivých zdrojov, a sťahovať aktualizované verzie komponentov po oprave novoobjavených zraniteľností.

V tomto príspevku sa pozrieme na používanie kontroly závislosti OWASP na prerušenie zostavy, ak zistí vážne problémy s vaším kódom.

V knihe „Bezpečnosť vývoja v agilných projektoch“ je to opísané nasledovne. OWASP Dependency Check je bezplatný skener, ktorý katalogizuje všetky open source komponenty používané v aplikácii a zobrazuje zraniteľnosti, ktoré obsahujú. Existujú verzie pre Java, .NET, Ruby (gemspec), PHP (skladateľ), Node.js a Python, ako aj pre niektoré projekty C/C++. Kontrola závislosti sa integruje s bežnými nástrojmi na zostavovanie vrátane Ant, Maven a Gradle a servermi nepretržitej integrácie, ako je Jenkins.

Kontrola závislosti hlási všetky komponenty so známymi zraniteľnosťami z národnej databázy zraniteľností NIST (NVD) a aktualizuje sa údajmi z informačných kanálov NVD.

Našťastie sa to všetko dá urobiť automaticky pomocou nástrojov, ako je projekt OWASP Dependency Check alebo komerčné programy Čierna kačica, JFrog Xray, Snyk, Životný cyklus zariadenia Nexus Sonatyp resp SourceClear.

Tieto nástroje môžu byť zahrnuté do zostavovacích kanálov na automatickú inventarizáciu závislostí open source, identifikáciu zastaraných verzií knižníc a knižníc so známymi zraniteľnosťami a na prerušenie zostavovania, ak sa zistia vážne problémy.

Kontrola závislosti OWASP

Na testovanie a demonštráciu toho, ako funguje Kontrola závislosti, používame toto úložisko závislosť-kontrola-príklad.

Ak chcete zobraziť správu HTML, musíte na svojom gitlab-runneri nakonfigurovať webový server nginx.

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 zostavy môžete vidieť tento obrázok:

Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

Kliknite na odkaz a pozrite si prehľad Kontrola závislosti.

Prvá snímka obrazovky je horná časť správy so zhrnutím.

Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

Podrobnosti o druhej snímke obrazovky CVE-2017-5638. Tu vidíme úroveň CVE a odkazy na exploity.

Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

Tretia snímka obrazovky sú podrobnosti o log4j-api-2.7.jar. Vidíme, že úrovne CVE sú 7.5 a 9.8.

Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

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

Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

Ak chcete použiť gitlabové stránky, tak to nepôjde – padnutá úloha nevytvorí artefakt.

Príklad tu https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Výstup zostavy: žiadne artefakty, nevidím správu html. Mali by ste vyskúšať Artifact: vždy

https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246

Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

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=7

Pomocou parametra failBuildOnCVSS môžete upraviť úroveň zraniteľností CVE, na ktoré musíte reagovať.

Sťahovanie databázy zraniteľností NIST (NVD) z internetu

Všimli ste si, že NIST neustále sťahuje databázy zraniteľností NIST (NVD) z internetu:

Použitie skenera zraniteľnosti pre použité knižnice Dependency-Check v GitlabCI

Na stiahnutie môžete použiť obslužný program nist_data_mirror_golang

Poďme ho nainštalovať a spustiť.

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 odovzdá NIST JSON CVE do /var/www/repos/nist-data-mirror/ pri spustení a aktualizuje údaje každých 24 hodín.

Ak chcete stiahnuť CVE JSON NIST, musíte 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 sa nerobil dlhý rad pri spustení mvn, presunieme parametre do samostatnej premennej DEPENDENCY_OPTS.

Konečná minimálna konfigurácia .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

Telegramový rozhovor o DevOps a bezpečnosti
Telegramový kanál DevSecOps / SSDLC - Bezpečný vývoj

Zdroj: hab.com

Pridať komentár