Usando o scanner de vulnerabilidades nas bibliotecas de verificação de dependência usadas no GitlabCI

Uma parte importante do gerenciamento de vulnerabilidades é entender e garantir a segurança da cadeia de suprimentos dos componentes de software que compõem os sistemas modernos. As equipes ágeis e o DevOps fazem uso extensivo de bibliotecas e estruturas de código aberto para reduzir o tempo e o custo de desenvolvimento. Mas essa medalha tem uma desvantagem: a capacidade de herdar os erros e vulnerabilidades de outras pessoas.


Obviamente, a equipe deve saber quais componentes de código aberto estão incluídos em seus aplicativos, garantir que as versões reconhecidamente confiáveis ​​sejam baixadas de fontes reconhecidamente confiáveis ​​e fazer o download das versões atualizadas dos componentes após corrigir as vulnerabilidades recém-descobertas.


Nesta postagem, veremos o uso da Verificação de dependência do OWASP para interromper uma compilação se encontrar sérios problemas com seu código.


O livro "Segurança do desenvolvimento em projetos ágeis" é descrito a seguir. O OWASP Dependency Check é um scanner gratuito que cataloga todos os componentes de código aberto usados ​​no aplicativo e mostra as vulnerabilidades presentes neles. Existem versões para Java, .NET, Ruby (gemspec), PHP (compositor), Node.js e Python, além de alguns projetos em C / C ++. O Verificação de Dependência integra-se a ferramentas de construção comuns, incluindo Ant, Maven e Gradle, e servidores de integração contínua como Jenkins.


A Verificação de Dependência relata todos os componentes com vulnerabilidades conhecidas do NVD (National Vulnerability Database) do NIST e é atualizada com base nos dados dos canais de notícias do NVD.


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


Essas ferramentas podem ser incluídas nos pipelines de montagem para compilar automaticamente uma lista de dependências de código aberto, identificar versões obsoletas de bibliotecas e bibliotecas que contêm vulnerabilidades conhecidas e interromper a construção se forem encontrados problemas sérios.


Verificação de Dependência OWASP


Para testar e demonstrar como a Verificação de Dependência funciona, usamos este repositório de exemplo de verificação de dependência .


Para visualizar o relatório HTML, você precisa configurar o servidor da web nginx no 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 montagem, você pode ver esta figura:



Seguimos o link e vemos o relatório Verificação de dependência.


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



Detalhes da segunda captura de tela CVE-2017-5638. Aqui vemos o nível CVE e links para explorações.



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



Quarta captura de tela - detalhes de commons-fileupload-1.3.2.jar. Vemos que os níveis de CVE 7.5 e 9.8.



Se você quiser usar as páginas do gitlab, não funcionará - uma tarefa descartada não criará um artefato.


Um exemplo está aqui https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages .


Conclusão da montagem: não há artefatos. Não vejo o relatório html. Devemos tentar o Artefato: sempre


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



Gerenciamento de vulnerabilidades do CVE

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 controlar o nível de vulnerabilidades do CVE às quais precisa responder.


Faça o download do NIST NIST Vulnerability Database (NVD)

Você notou que está constantemente baixando o NIST Vulnerability Database (NVD) da Internet:



Você pode usar o utilitário nist_data_mirror_golang para fazer o download


Instale e execute-o.


 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 

O Nist-data-mirror baixa o NVE JSON do CVE para / var / www / repos / nist-data-mirror / na inicialização e atualiza os dados a cada 24 horas.


Para baixar o CVE JSON NIST, é necessário configurar o servidor da 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 criar uma linha longa onde o mvn é iniciado, emitiremos os parâmetros em uma variável separada DEPENDENCY_OPTS.


A configuração mínima final .gitlab-ci.yml ficará assim:


 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 

Conversa por telegrama sobre DevOps e segurança
Canal DevSecOps / SSDLC - desenvolvimento seguro de canal de telegrama

Source: https://habr.com/ru/post/pt483716/


All Articles