Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

Una parte importante de la gestión de vulnerabilidades consiste en comprender bien y asegurar la cadena de suministro de los componentes de software que forman los sistemas modernos. Los equipos que practican metodologías ágiles y DevOps utilizan ampliamente bibliotecas y frameworks de código abierto para reducir el tiempo y el costo de desarrollo. Pero esta moneda tiene dos caras: se corre el riesgo de heredar errores y vulnerabilidades ajenas.

Evidentemente, el equipo debe saber qué componentes de código abierto están incluidos en sus aplicaciones, asegurarse de que las versiones confiables se descarguen de fuentes de confianza y cargar versiones actualizadas de los componentes después de corregir las vulnerabilidades recién descubiertas.

En esta publicación, examinaremos el uso de OWASP Dependency Check para interrumpir la compilación en caso de que se detecten problemas graves en su código.

En el libro 'Seguridad en el desarrollo de proyectos ágiles' se describe así. OWASP Dependency Check es un escáner gratuito que cataloga todos los componentes de código abierto utilizados en la aplicación y muestra las vulnerabilidades que presentan. Hay versiones para Java, .NET, Ruby (gemspec), PHP (composer), Node.js y Python, así como para algunos proyectos en C/C++. Dependency Check se integra con herramientas de construcción populares, como Ant, Maven y Gradle y servidores de integración continua como Jenkins.

Dependency Check informa sobre todos los componentes con vulnerabilidades conocidas de la base de datos nacional de vulnerabilidades (NVD) del NIST y se actualiza en función de los datos de los canales de noticias del NVD.

Afortunadamente, todo esto se puede hacer automáticamente con herramientas como el proyecto OWASP Dependency Check o programas comerciales como Black Duck, JFrog Xray, Snyk, Nexus Lifecycle de la empresa Sonatype o SourceClear.

Estas herramientas se pueden incluir en los pipelines de construcción para automáticamente crear un inventario de dependencias de código abierto, detectar versiones obsoletas de bibliotecas y bibliotecas que contienen vulnerabilidades conocidas, y detener la compilación en caso de detectar problemas graves.

OWASP Dependency Check

Para probar y demostrar el funcionamiento de Dependency Check, utilizamos este repositorio dependency-check-example.

Para ver el informe HTML, necesitas configurar el servidor web nginx en tu gitlab-runner.

Ejemplo de configuración mínima de 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 {
    }

}

Al final de la construcción, puedes ver algo como esto:

Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

Vamos al enlace y vemos el informe de Dependency Check.

La primera captura de pantalla muestra la parte superior del informe con un resumen breve.

Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

La segunda captura de pantalla detalla el CVE-2017-5638. Aquí vemos el nivel CVE y enlaces a exploits.

Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

La tercera captura de pantalla muestra los detalles de log4j-api-2.7.jar. Observamos que los niveles CVE son 7.5 y 9.8.

Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

La cuarta captura de pantalla muestra los detalles de commons-fileupload-1.3.2.jar. Observamos que los niveles CVE son 7.5 y 9.8.

Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

Si quieres usar gitlab pages, no podrás — una tarea fallida no creará el artefacto.

Ejemplo aquí https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Resultado de la construcción: no hay artefactos, no veo el informe HTML. Debemos intentar Artifact: always

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

Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

Regulación del nivel CVE de vulnerabilidades

La línea más importante en el archivo gitlab-ci.yaml:

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

Con el parámetro failBuildOnCVSS puedes regular el nivel CVE de las vulnerabilidades a las que debes reaccionar.

Descargando desde internet la base de datos de vulnerabilidades (NVD) NIST

Has notado que constantemente se descargan bases de datos de vulnerabilidades (NVD) NIST desde internet:

Uso del escáner de vulnerabilidades en las bibliotecas utilizadas Dependency-Check en GitlabCI

Para la descarga, puedes usar la utilidad nist_data_mirror_golang

Instalémosla y ejecutémosla.

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 descarga el JSON CVE NIST en /var/www/repos/nist-data-mirror/ al iniciarse y actualiza los datos cada 24 horas.

Para descargar el JSON CVE NIST, necesitas configurar el servidor web nginx (por ejemplo, en tu gitlab-runner).

Ejemplo de configuración mínima de 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 evitar tener una larga línea donde se ejecuta mvn, extraeremos los parámetros a una variable DEPENDENCY_OPTS.

El archivo .gitlab-ci.yml mínimo final quedará así:

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

Chat de Telegram sobre DevOps y Seguridad
Canal de Telegram DevSecOps / SSDLC - Desarrollo Seguro

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster