Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Ang isang mahalagang bahagi ng pamamahala sa kahinaan ay ang lubusang pag-unawa at pag-secure ng supply chain ng mga bahagi ng software na bumubuo sa mga modernong sistema. Ang mga koponan ng Agile at DevOps ay malawakang gumagamit ng mga open source na library at frameworks para mabawasan ang oras at gastos sa pag-develop. Ngunit mayroon ding downside ang medalyang ito: ang pagkakataong magmana ng mga pagkakamali at kahinaan ng ibang tao.

Malinaw, dapat tiyakin ng team na malaman kung aling mga bahagi ng open source ang kasama sa mga application nito, tiyaking mada-download ang mga kilalang mapagkakatiwalaang bersyon mula sa mga kilalang mapagkakatiwalaang mapagkukunan, at mag-download ng mga na-update na bersyon ng mga bahagi pagkatapos ma-patch ang mga bagong natuklasang kahinaan.

Sa post na ito, titingnan natin ang paggamit ng OWASP Dependency Check upang i-abort ang isang build kung may nakita itong mga seryosong problema sa iyong code.

Sa aklat na "Development Security in Agile Projects" ito ay inilarawan bilang mga sumusunod. Ang OWASP Dependency Check ay isang libreng scanner na nag-catalog ng lahat ng open source na bahagi na ginagamit sa isang application at nagpapakita ng mga kahinaang nilalaman ng mga ito. May mga bersyon para sa Java, .NET, Ruby (gemspec), PHP (composer), Node.js at Python, pati na rin para sa ilang proyekto ng C/C++. Sumasama ang Dependency Check sa mga karaniwang tool sa pagbuo, kabilang ang Ant, Maven at Gradle, at mga server ng tuluy-tuloy na pagsasama tulad ng Jenkins.

Ang Dependency Check ay nag-uulat ng lahat ng mga bahagi na may alam na mga kahinaan mula sa NIST's National Vulnerability Database (NVD) at ina-update gamit ang data mula sa NVD news feed.

Sa kabutihang-palad, lahat ng ito ay maaaring awtomatikong gawin gamit ang mga tool tulad ng proyekto ng OWASP Dependency Check o mga komersyal na programa tulad ng Itim na Itik, JFrog Xray, Snyk, Ikot ng Buhay ng Nexus Sonatype o SourceClear.

Maaaring isama ang mga tool na ito sa mga pipeline ng build upang awtomatikong mag-imbentaryo ng mga open source na dependency, tukuyin ang mga lumang bersyon ng mga library at library na naglalaman ng mga kilalang kahinaan, at i-abort ang mga build kung may matukoy na mga seryosong problema.

OWASP Dependency Check

Upang subukan at ipakita kung paano gumagana ang Dependency Check, ginagamit namin ang repositoryong ito dependency-check-example.

Upang tingnan ang ulat ng HTML, kailangan mong i-configure ang nginx web server sa iyong gitlab-runner.

Halimbawa ng isang minimal nginx config:

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 {
    }
}

Sa dulo ng pagpupulong makikita mo ang larawang ito:

Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Sundin ang link at tingnan ang ulat ng Dependency Check.

Ang unang screenshot ay ang nangungunang bahagi ng ulat na may buod.

Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Mga detalye ng pangalawang screenshot CVE-2017-5638. Dito makikita natin ang antas ng CVE at mga link sa mga pagsasamantala.

Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Ang ikatlong screenshot ay mga detalye ng log4j-api-2.7.jar. Nakita namin na ang mga antas ng CVE ay 7.5 at 9.8.

Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Ang ikaapat na screenshot ay ang mga detalye ng commons-fileupload-1.3.2.jar. Nakita namin na ang mga antas ng CVE ay 7.5 at 9.8.

Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Kung nais mong gumamit ng mga pahina ng gitlab, kung gayon hindi ito gagana - ang isang nahulog na gawain ay hindi lilikha ng isang artifact.

Halimbawa dito https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Bumuo ng output: walang artifact, hindi ko nakikita ang ulat ng html. Dapat mong subukan ang Artifact: palagi

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

Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Kinokontrol ang antas ng mga kahinaan sa CVE

Ang pinakamahalagang linya sa gitlab-ci.yaml file:

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

Gamit ang parameter na failBuildOnCVSS maaari mong ayusin ang antas ng mga kahinaan ng CVE kung saan kailangan mong tumugon.

Pag-download ng NIST Vulnerability Database (NVD) mula sa Internet

Napansin mo ba na patuloy na dina-download ng NIST ang mga vulnerability database (NVD) ng NIST mula sa Internet:

Gamit ang vulnerability scanner para sa mga ginamit na library Dependency-Check sa GitlabCI

Upang i-download, maaari mong gamitin ang utility nist_data_mirror_golang

I-install at ilunsad natin ito.

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

Ina-upload ng Nist-data-mirror ang NIST JSON CVE sa /var/www/repos/nist-data-mirror/ sa startup at ina-update ang data tuwing 24 na oras.

Upang i-download ang CVE JSON NIST, kailangan mong i-configure ang nginx web server (halimbawa, sa iyong gitlab-runner).

Halimbawa ng isang minimal nginx config:

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 {
    }

}

Upang hindi makagawa ng mahabang linya kung saan inilunsad ang mvn, ililipat namin ang mga parameter sa isang hiwalay na variable na DEPENDENCY_OPTS.

Ang huling minimal na config .gitlab-ci.yml ay magiging ganito:

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

Telegram chat tungkol sa DevOps at Security
Telegram channel DevSecOps / SSDLC - Secure na pag-unlad

Pinagmulan: www.habr.com

Magdagdag ng komento