Una parte importante de la gestión de vulnerabilidades es comprender y garantizar la seguridad de la cadena de suministro de los componentes de software que conforman los sistemas modernos. Los equipos ágiles y DevOps hacen un uso extensivo de bibliotecas y marcos de código abierto para reducir el tiempo y el costo de desarrollo. Pero esta medalla tiene un inconveniente: la capacidad de heredar los errores y vulnerabilidades de otras personas.
Obviamente, el equipo debe saber qué componentes de código abierto están incluidos en sus aplicaciones, asegurarse de que se descarguen versiones confiables conocidas de fuentes obviamente confiables y descargar versiones actualizadas de los componentes después de corregir las vulnerabilidades recientemente descubiertas.
En esta publicación, analizaremos el uso de la verificación de dependencia de OWASP para interrumpir una compilación si encuentra problemas graves con su código.
El libro "Seguridad del desarrollo en proyectos ágiles" se describe a continuación. 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 presentes en ellos. Hay versiones para Java, .NET, Ruby (gemspec), PHP (compositor), Node.js y Python, así como para algunos proyectos C / C ++. Dependency Check se integra con herramientas de compilación comunes, incluidas Ant, Maven y Gradle, y servidores de integración continua como Jenkins.
Dependency Check informa todos los componentes con vulnerabilidades conocidas de la NIST National Vulnerability Database (NVD) y se actualiza en función de los datos de los canales de noticias NVD.
Afortunadamente, todo esto se puede hacer automáticamente utilizando herramientas como el proyecto OWASP Dependency Check o programas comerciales como Black Duck , JFrog Xray , Snyk , Nexus Lifecycle de Sonatype o SourceClear .
Estas herramientas se pueden incluir en las canalizaciones de ensamblaje para compilar automáticamente una lista de dependencias de código abierto, identificar versiones obsoletas de bibliotecas y bibliotecas que contienen vulnerabilidades conocidas e interrumpir la compilación si se encuentran problemas serios.
Verificación de dependencia de OWASP
Para probar y demostrar cómo funciona la verificación de dependencia, utilizamos este repositorio de ejemplo de verificación de dependencia .
Para ver el informe HTML, debe configurar el servidor web nginx en su 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 asamblea, puede ver esta imagen:

Seguimos el enlace y vemos el informe Verificación de dependencia.
La primera captura de pantalla es la parte superior del informe con un resumen.

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

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

Cuarta captura de pantalla: detalles de commons-fileupload-1.3.2.jar. Vemos que los niveles de CVE 7.5 y 9.8.

Si desea utilizar páginas de gitlab, no funcionará: una tarea eliminada no creará un artefacto.
Un ejemplo está aquí https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages .
Conclusión de la asamblea: no hay artefactos, no veo el informe html. Debemos probar Artifact: siempre
https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246

Gestión de vulnerabilidades CVE
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, puede controlar el nivel de vulnerabilidades de CVE al que debe responder.
Descargar NIST NIST Vulnerability Database (NVD) NIST
Notó que está descargando constantemente la NIST Vulnerability Database (NVD) de Internet:

Puede usar la utilidad nist_data_mirror_golang para descargar
Instalarlo y ejecutarlo.
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 carga CVE JSON NIST en / var / www / repos / nist-data-mirror / al inicio y actualiza los datos cada 24 horas.
Para descargar CVE JSON NIST, debe configurar el servidor web nginx (por ejemplo, en su 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 no hacer una línea larga donde se inicia mvn, emitiremos los parámetros en una variable separada DEPENDENCY_OPTS.
La configuración mínima final .gitlab-ci.yml resultará 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
Telegram chat sobre DevOps y seguridad
Canal Telegram DevSecOps / SSDLC -Desarrollo seguro