Skip to main content

Cómo corregir vulnerabilidades en proyectos Maven

Escrito por
Maven feature

14 de septiembre de 2020

0 minutos de lectura

Maven 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:

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.

Salida de terminal que muestra vulnerabilidades de software, como deserialización de datos no confiables y denegación de servicio, con instrucciones para actualizar.

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.

<parent>
   <groupId>io.snyk</groupId>
   <artifactId>demo-parent</artifactId>
   <version>1.0.4.RELEASE</version>
</parent>

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.

<dependency>
  <groupId>org.eclipse.collections</groupId>
  <artifactId>eclipse-collections</artifactId>
  <version>10.4.0</version>
</dependency>

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.

<dependency>
  <groupId>org.eclipse.collections</groupId>
  <artifactId>eclipse-collections</artifactId>
  <version>10.4.0</version>
</dependency>

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:

<properties>
    <jackson.version>2.10.2.20200130</jackson.version>
</properties>

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:

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.yaml</groupId>
           <artifactId>snakeyaml</artifactId>
           <version>1.26</version>
       </dependency>
   </dependencies>
</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.