Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

Uma parte importante da gestão de vulnerabilidades é entender bem e garantir a segurança da cadeia de suprimentos dos componentes de software que compõem os sistemas modernos. As equipes que praticam metodologias ágeis e DevOps frequentemente utilizam bibliotecas e frameworks de código aberto para reduzir o tempo e o custo de desenvolvimento. Mas essa medalha tem um lado negativo: a possibilidade de herdar erros e vulnerabilidades de terceiros.

É evidente que a equipe deve saber quais componentes de código aberto estão incluídos em suas aplicações, garantir que versões confiáveis sejam baixadas de fontes seguras e carregar versões atualizadas dos componentes após a correção de vulnerabilidades recém-descobertas.

Neste post, vamos discutir o uso do OWASP Dependency Check para interromper a construção em caso de descoberta de problemas sérios em seu código.

No livro ‘Segurança no Desenvolvimento de Projetos Ágeis’ é descrito da seguinte maneira. O OWASP Dependency Check é um scanner gratuito que catalogará todos os componentes de código aberto utilizados na aplicação e mostrará as vulnerabilidades que eles possuem. Existem versões para Java, .NET, Ruby (gemspec), PHP (composer), Node.js e Python, bem como para alguns projetos em C/C++. O Dependency Check integra-se com ferramentas de construção populares, como Ant, Maven e Gradle, e servidores de integração contínua como Jenkins.

O Dependency Check informa sobre todos os componentes com vulnerabilidades conhecidas da National Vulnerability Database (NVD) do NIST e é atualizado com base em dados de feeds de notícias da NVD.

Felizmente, tudo isso pode ser feito automaticamente com ferramentas como o projeto OWASP Dependency Check ou programas comerciais como Black Duck, JFrog Xray, Snyk, Nexus Lifecycle da empresa Sonatype ou SourceClear.

Essas ferramentas podem ser integradas aos pipelines de construção para compilar automaticamente um inventário de dependências de código aberto, identificar versões desatualizadas de bibliotecas e bibliotecas que contêm vulnerabilidades conhecidas, e interromper a construção em caso de problemas sérios.

OWASP Dependency Check

Para testar e demonstrar o funcionamento do Dependency Check, usamos este repositório dependency-check-example.

Para visualizar o relatório HTML, é necessário configurar um servidor web nginx em seu gitlab-runner.

Exemplo de configuração mínima do 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 {
    }

}

No final da construção, você pode ver esta imagem:

Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

Vamos ao link e vemos o relatório do Dependency Check.

A primeira captura de tela — a parte superior do relatório com um resumo.

Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

A segunda captura de tela detalha o CVE-2017-5638. Aqui vemos o nível CVE e links para exploits.

Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

A terceira captura de tela — detalhes do log4j-api-2.7.jar. Vemos que os níveis CVE são 7.5 e 9.8.

Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

A quarta captura de tela — detalhes do commons-fileupload-1.3.2.jar. Vemos que os níveis CVE são 7.5 e 9.8.

Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

Se você deseja usar gitlab pages, isso não será possível — uma tarefa falhada não criará um artefato.

Exemplo aqui https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Saída da construção: não há artefatos, não vejo o relatório em html. É necessário tentar Artifact: always.

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

Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

Regulamentação do nível CVE de vulnerabilidades

A linha mais importante no arquivo gitlab-ci.yaml:

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

Com o parâmetro failBuildOnCVSS, você pode regular o nível CVE das vulnerabilidades que precisam ser abordadas.

Download da base de dados de vulnerabilidades (NVD) da NIST

Você notou que está constantemente baixando bases de dados de vulnerabilidades (NVD) da NIST da internet:

Uso de scanner de vulnerabilidades nas bibliotecas utilizadas pelo Dependency-Check no GitlabCI

Para download, você pode usar a ferramenta nist_data_mirror_golang

Vamos instalar e executá-la.

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 baixa o CVE JSON da NIST para /var/www/repos/nist-data-mirror/ ao iniciar e atualiza os dados a cada 24 horas.

Para baixar o CVE JSON da NIST, é necessário configurar o servidor web nginx (por exemplo, no seu gitlab-runner).

Exemplo de configuração mínima do 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 {
    }

}

Para não fazer uma linha longa onde mvn é executado, vamos extrair os parâmetros para uma variável separada DEPENDENCY_OPTS.

O resultado final do mínimo .gitlab-ci.yml será assim:

variáveis:
  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

Grupo Telegram sobre DevOps e Segurança
Canal Telegram DevSecOps / SSDLC - Desenvolvimento Seguro

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster