Cómo corregir vulnerabilidades en proyectos Maven
14 de septiembre de 2020
0 minutos de lecturaMaven sigue siendo el sistema de compilación más utilizado en el ecosistema de Java. Según el informe de la JVM de 2020, Maven es la herramienta de compilación número uno del ecosistema, con dos tercios de participación.
Por eso, es importante saber cómo funciona Maven. Por ejemplo, si Snyk detecta vulnerabilidades en tu proyecto Maven, ¿cómo puedes corregirlas? En este artículo, explicaré cómo corregir vulnerabilidades en bibliotecas de terceros cuando usas Maven, aunque no sea evidente.
Cómo encontrar vulnerabilidades
Si usas Maven para compilar tu proyecto y administrar sus dependencias, hay varias formas de analizarlo con Snyk. Esto es independiente del lenguaje de programación que uses: puede ser Java, Kotlin, Scala, Groovy o cualquier otro diseñado para la máquina virtual de Java (JVM).
Puedes analizar tu proyecto Maven en busca de vulnerabilidades con Snyk mediante:
el complemento de Snyk para IDE en Eclipse o IntelliJ IDEA
Si tomamos la CLI como ejemplo, Snyk te mostrará si puedes corregir las vulnerabilidades y cómo hacerlo mediante la actualización de las dependencias de nivel superior. Sin embargo, si no hay una versión mejorada de las dependencias de nivel superior, Snyk te mostrará si existe una versión más reciente de la dependencia subyacente que corrija las vulnerabilidades.

Cómo corregir vulnerabilidades en dependencias de nivel superior
La forma más sencilla de corregir una vulnerabilidad detectada por Snyk es cambiar la biblioteca de nivel superior, si es posible. Si la biblioteca no tiene dependencias subyacentes, es bastante evidente que debes actualizarla a una versión más reciente que no tenga ese problema. Lo mismo aplica cuando una dependencia subyacente presenta un problema, pero ya hay una versión más reciente de la dependencia de nivel superior que no lo presenta.
Hay varias formas de cambiar la versión. Primero, averigua dónde se especifica. En el caso de las dependencias de nivel superior, normalmente puedes encontrarla en uno de estos lugares:
en un POM principal
en una propiedad
directamente en la dependencia
POM principal
Si la dependencia que necesitas actualizar está definida en un POM principal, primero busca una versión más reciente de ese POM. Por ejemplo, si usas Spring Boot y ya hay una versión más reciente del POM principal, considera actualizarla primero y comprueba si eso resuelve el problema. Así actualizas todo el conjunto de dependencias y, en la mayoría de los casos, funcionan mejor juntas que si actualizas una sola dependencia. Si no puedes cambiar el POM principal, pasa al método directo.
Propiedades
Si se usa una propiedad, actualízala primero. Esto podría actualizar también otras dependencias, pero, al igual que con el POM principal, hay una buena razón para hacerlo. Si las bibliotecas se publican como un conjunto, sabes que funcionan mejor juntas cuando tienen la misma versión.
Directo
Por último, la dependencia está declarada en la sección dependencies del archivo POM de Maven. Allí especificas groupId, artifactId y, en muchos casos, la versión. Si la versión está declarada aquí, solo tienes que actualizarla. Si no, puedes agregarla.
Ten en cuenta que esta es la forma de más bajo nivel para declarar la versión de una dependencia y que anulará todas las demás formas de establecerla.
Cómo corregir dependencias subyacentes
Supongamos que aún no hay una versión más reciente disponible de tu dependencia de nivel superior, pero una de las dependencias subyacentes tiene un problema que necesitas corregir. La CLI ya te informó que hay una versión más reciente de esa dependencia subyacente que corrige el problema.
Lista de materiales
Muchos frameworks usan una lista de materiales (BOM) para administrar las dependencias subyacentes. Una BOM es un tipo especial de POM que se usa para controlar las versiones de las dependencias de un proyecto y ofrecer un lugar centralizado para definirlas y actualizarlas.
Si necesitas reemplazar una dependencia subyacente en un framework como Spring Boot, comprueba si forma parte de una BOM. Si es así, verifica si ya hay una versión más reciente de esa BOM y actualiza la versión. En Spring Boot y muchos otros frameworks conocidos, las versiones de la BOM se especifican como una propiedad. Puedes anular esa propiedad en tu propio archivo POM de Maven agregando una propiedad.
En el siguiente ejemplo, anulo la BOM de Jackson en mi proyecto de Spring Boot:
Administración de dependencias
En un POM de Maven, puedes excluir e incluir dependencias subyacentes específicas al declarar una dependencia de nivel superior. Sin embargo, esto puede causar problemas cuando dos bibliotecas comparten la misma dependencia subyacente. Una práctica recomendada en Maven es agrupar estas declaraciones en la sección de administración de dependencias. Esta sección permite que los autores de proyectos especifiquen directamente las versiones de los artefactos que se usarán cuando aparezcan en dependencias transitivas. Además del ejemplo siguiente, la documentación explica claramente cómo usar dependencyManagement:
Conclusión
Como puedes ver, hay varias formas de mitigar los problemas de seguridad en las dependencias de código abierto de un proyecto basado en Maven. Aunque no haya una solución directa mediante la actualización de una dependencia de nivel superior, puedes excluir una dependencia transitiva subyacente y cambiarla por la versión más reciente disponible. El análisis de Snyk Open Source te indica a qué versión debes actualizar. En este artículo se muestra cómo configurarlo correctamente en tu proyecto Maven.
Empieza con los desafíos de Capture the Flag
Aprende a resolver desafíos de captura la bandera con nuestro taller virtual introductorio a pedido.
