Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

O parte importantă a gestionării vulnerabilităților este să înțelegem bine și să asigurăm securitatea lanțului de aprovizionare al componentelor software, din care sunt construite sistemele moderne. Echipele care practică metodologii agile și DevOps folosesc pe scară largă biblioteci și cadre cu sursă deschisă pentru a reduce timpul și costurile de dezvoltare. Dar această medalie are și o latură negativă: riscul de a moșteni greșelile și vulnerabilitățile altora.

Este evident că echipa trebuie să știe exact ce componente cu sursă deschisă sunt incluse în aplicațiile lor, să se asigure că versiunile de încredere sunt descărcate din surse de încredere, și să încarce versiunile actualizate ale componentelor după remedierea vulnerabilităților recent descoperite.

În acest articol, vom explora utilizarea OWASP Dependency Check pentru a opri construcția în cazul descoperirii unor probleme grave în codul dumneavoastră.

În cartea „Securitatea dezvoltării în proiectele Agile” este descris astfel. OWASP Dependency Check este un scanner gratuit care cataloghează toate componentele cu sursă deschisă utilizate în aplicație și arată vulnerabilitățile aferente. Există versiuni pentru Java, .NET, Ruby (gemspec), PHP (composer), Node.js și Python, precum și pentru unele proiecte în C/C++. Dependency Check se integrează cu unelte populare de construcție, inclusiv Ant, Maven și Gradle și servere de integrare continuă precum Jenkins.

Dependency Check raportează toate componentele cu vulnerabilități cunoscute din baza de date națională de vulnerabilități (NVD) NIST și se actualizează pe baza datelor din canalele de știri NVD.

Din fericire, toate acestea se pot face automat cu ajutorul unor unelte, cum ar fi proiectul OWASP Dependency Check, sau programe comerciale precum Black Duck, JFrog Xray, Snyk, Nexus Lifecycle compania Sonatype sau SourceClear.

Aceste unelte pot fi incluse în procesele de construcție pentru a compila automat un inventar al dependențelor cu sursă deschisă, pentru a identifica versiuni învechite ale bibliotecilor și biblioteci care conțin vulnerabilități cunoscute, și pentru a opri construcția în cazul descoperirii unor probleme grave.

OWASP Dependency Check

Pentru a testa și a demonstra funcționarea Dependency Check, folosim acest depozit dependency-check-example.

Pentru a vizualiza raportul HTML, trebuie să configurați un server web nginx pe gitlab-runner-ul dumneavoastră.

Exemplu de configurare minimă 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 {
    }

}

La finalul compilării, poți vedea o imagine de acest fel:

Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

Accesăm linkul și vedem raportul Dependency Check.

Prima captură de ecran - partea superioară a raportului cu un rezumat.

Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

A doua captură de ecran detalii despre CVE-2017-5638. Aici vedem nivelul CVE și linkuri către exploaturi.

Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

A treia captură de ecran - detalii despre log4j-api-2.7.jar. Vedem că nivelurile CVE sunt 7.5 și 9.8.

Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

A patra captură de ecran - detalii despre commons-fileupload-1.3.2.jar. Vedem că nivelurile CVE sunt 7.5 și 9.8.

Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

Dacă vrei să utilizezi gitlab pages, nu va fi posibil - o sarcină căzută nu va crea un artefact.

Exemplul este aici https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Rezultatul compilării: nu sunt artefacte, nu văd raportul html. Trebuie să încerc Artifact: always

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

Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

Reglarea nivelului CVE al vulnerabilităților

Cel mai important rând din fișierul gitlab-ci.yaml:

mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7

Prin parametrul failBuildOnCVSS poți regla nivelul CVE al vulnerabilităților la care trebuie să reacționezi.

Descărcarea de pe internet a bazei de date a vulnerabilităților (NVD) NIST

Ai observat că tot timpul se descarcă baze de date ale vulnerabilităților (NVD) NIST de pe internet:

Utilizarea scanner-ului de vulnerabilități în bibliotecile utilizate Dependency-Check în GitlabCI

Pentru descărcare, poți folosi utilitarul nist_data_mirror_golang

Să-l instalăm și să-l rulăm.

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 încarcă CVE JSON NIST în /var/www/repos/nist-data-mirror/ la pornire și actualizează datele la fiecare 24 de ore.

Pentru a descărca CVE JSON NIST, trebuie să configurezi serverul web nginx (de exemplu, pe gitlab-runner-ul tău).

Exemplu de configurare minimă 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 {
    }

}

Pentru a evita o linie lungă unde se execută mvn, să extragem parametrii într-o variabilă separată DEPENDENCY_OPTS.

Configurația minimă finală .gitlab-ci.yml va arăta astfel:

variabile:
  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

Telegram chat despre DevOps și Securitate
Canal Telegram DevSecOps / SSDLC - Dezvoltare sigură

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster