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 , , , de la empresa Sonatype o .
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 .
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:

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.

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

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.

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.

Si quieres usar gitlab pages, no podrás — una tarea fallida no creará el artefacto.
Ejemplo aquí .
Resultado de la construcción: no hay artefactos, no veo el informe HTML. Debemos intentar Artifact: always

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=7Con 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:

Para la descarga, puedes usar la utilidad
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-mirrorNist-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
Fuente: habr.com
