Hace unos días atrás debido al ampliamente mencionado Log4Shell, he tenido que trabajar en primeramente detectar si algunos proyectos estaban impactados por dicha vulnerabilidad, y de paso detectar otras posibles vulnerabilidades existentes. En algunas aplicaciones fue sencillo detectarlo ya que la dependencia vulnerable es directamente agregada por el proyecto, pero en muchas otras ocasiones, los problemas se encontraban en dependencias transitivas, agregadas indirectamente por otras librerías.
Es por esto que la solución fue agregar el plugin “owasp-dependency-check” en maven o gradle. Este plugin utiliza la base de datos de vulnerabilidades detectadas NVD. Genera un árbol de todas las dependencias en el proyecto (incluidas las transitivas) y verifica para cada una de ellas, si se ha detectado una vulnerabilidad. Finalmente genera un reporte con el resumen de vulnerabilidades detectadas.
Es muy sencillo de agregar, y considero que debería de ser una buena práctica incluirlo en aquellos proyectos o aplicaciones que tienen código en producción.
Maven
Para maven, solamente se debe agregar el plugin e indicar el goal “check” si queremos que se ejecute automáticamente al construir el proyecto.
<project> ... <build> ... <plugins> ... <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>6.5.1</version> <executions> <execution> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> ... </plugins> ... </build> ... </project>
Dado que la verificación puede tardar algunos segundos, es posible no indicar esa configuración executions/execution/goals/goal/check
y ejecutar la verificación de manera manual solamente cuando lo deseamos por medio de linea de comandos mvn dependency-check:check
.
O en caso de tener un proyecto multi módulos, se puede incluir el plugin en el pom padre, y utilizar el goal aggregate
de manera que verifica todos los sub-módulos y genera un único reporte con el resultado de todos ellos. En linea de comandos se utiliza. mvn dependency-check:aggregate
Gradle
En Gradle, es bastate sencillo agregar el plugin en el archivo build.gradle
plugins { id "org.owasp.dependencycheck" version "6.5.1" }
Si lo queremos ejecutar desde linea de comandos podemos utilizar gradle dependencyCheckAnalyze
para verificar el proyecto. Ahora, si tenemos un proyecto multi módulo, el plugin se puede agregar al proyecto padre y ejecutar gradle dependencyCheckAggregate
, de esta manera todos los sub módulos son verificados y un reporte con el resultado de todos ellos es generado.
Configuraciones
El plugin es muy configurable, dentro de las opciones más importantes a mencionar es la posibilidad de fallar el build si se detecta una vulnerabilidad de cierto nivel (lo cual es muy util para un modelo de desarrollo con integración continua), además en algunas ocasiones se puede detectar una vulnerabilidad que no tiene solución y no se desea que continue apareciendo en el reporte, por lo cual se puede suprimir.
Fallar al detectar Vulnerabilidad
Las vulnerabilidades tiene un nivel que va de 0 a 10 según su criticidad.
Level | Value |
---|---|
None | 0.0 |
Low | 0.1-3.9 |
Medium | 4.0-6.9 |
High | 7.0-8.9 |
Critical | 9.0-10.0 |
Como buena práctica es recomendable evitar tener vulnerabilidades de nivel Alto y Critico, es decir con un valor de 7.0 o mayor. Por defecto el plugin falla en construir al detectar vulnerabilidades con un valor de 11
lo cual no es posible en la práctica, por lo que nunca falla.
<plugin> ... <configuration> <failBuildOnCVSS>7</failBuildOnCVSS> </configuration>
dependencyCheck { failBuildOnCVSS=7 }
Suprimir vulnerabilidad
Por diferentes razones podríamos decidir suprimir una vulnerabilidad. Por ejemplo:
- Es un falso positivo, es decir, se detecta una dependencia como vulnerable pero realmente esa dependencia no es vulnerable
- No hay solución para la vulnerabilidad en dicha dependencia.
En estos casos, el plugin permite indicar un archivo con el listado de vulnerabilidades o librerías a suprimir.
<configuration> <suppressionFiles> <suppressionFile>http://example.org/suppression.xml</suppressionFile> <suppressionFile>project-suppression.xml</suppressionFile> </suppressionFiles> </configuration>
dependencyCheck { suppressionFiles=["http://example.org/suppression.xml","project-suppression.xml"] }
Para más información sobre el formato y estructura de un archivo para suprimir está página es de gran ayuda.
Conclusión
Definitivamente la seguridad es las aplicaciones es un tema que no se debe de dejar de lado, y este plugin permite de manera muy sencilla mantenerse alerta de las vulnerabilidades existentes en nuestro código.
Referencias
- https://jeremylong.github.io/DependencyCheck/dependency-check-gradle/index.html
- https://en.wikipedia.org/wiki/Log4Shell
- https://jeremylong.github.io/DependencyCheck/general/suppression.html