Skip to main content

Identifica, prioriza y corrige vulnerabilidades con Reachable Vulnerabilities para GitHub

Escrito por

28 de enero de 2021

0 minutos de lectura

Imagina que eres programador de Java y acabas de decidir usar el análisis de Snyk Open Source para encontrar problemas de seguridad en tus bibliotecas de terceros. ¡Buena decisión!

Sin embargo, después de conectar tu repositorio al analizador de Snyk Open Source, descubres que tienes diez o quizá hasta 50 vulnerabilidades en los paquetes de los que dependes. La gran pregunta es: ¿por dónde empiezo?

En un mundo ideal, querrías corregir todas las vulnerabilidades y terminar con cero. Sabemos que no siempre es posible. Además, probablemente no puedas corregirlas todas al mismo tiempo. Lo mejor es empezar por las vulnerabilidades que más afectan tu aplicación y avanzar desde ahí. Veamos cómo funciona.

La aplicación

Creé una pequeña aplicación Java basada en Maven y la publiqué en GitHub. Esta aplicación recibe una URL y ejecuta una solicitud GET a esa dirección. El resultado se muestra como texto sin formato en la página de resultados. Puede ser el HTML de una página web o, por ejemplo, la salida de un endpoint REST. Para ejecutar las solicitudes, uso el cliente HTTP de Apache y algunas otras dependencias, como se muestra en el archivo pom.

<dependencies>
   <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>4.3.1</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.0.1</version>
       <scope>provided</scope>
   </dependency>
   <dependency>
       <groupId>org.owasp.encoder</groupId>
       <artifactId>encoder</artifactId>
       <version>1.2.2</version>
   </dependency>
   <dependency>
       <groupId>org.yaml</groupId>
       <artifactId>snakeyaml</artifactId>
       <version>1.25</version>
   </dependency>
</dependencies>
Formulario web que muestra un campo para ingresar la URL http://snyk.io y una página de respuesta con el código fuente HTML del sitio

Identifica vulnerabilidades de seguridad en tu repositorio de GitHub

Para identificar vulnerabilidades de seguridad en mis dependencias de código abierto, conecté mi repositorio de GitHub a Snyk. También habilité la función Reachable Vulnerabilities, que actualmente está en beta. Puedes encontrar esta opción en Settings -> Integration -> GitHub Edit Settings. Ten en cuenta que todo lo que uso aquí forma parte del nivel gratuito de Snyk.

Página de configuración del análisis de vulnerabilidades alcanzables, donde se muestra la función habilitada, una advertencia sobre la clonación de repositorios y un botón para guardar los cambios.

Cuando Snyk termina de analizar mi repositorio de GitHub, veo que mi aplicación tiene muchas vulnerabilidades heredadas del paquete de código abierto que uso. Sin embargo, la función Reachable Vulnerabilities me muestra si se puede llegar a una vulnerabilidad desde código como el siguiente.

Informe detallado de vulnerabilidades que muestra un problema de validación de entradas de alta gravedad alcanzable en Apache HttpClient, la ruta de corrección, la pila de llamadas y la función vulnerable.

Prioriza la corrección de vulnerabilidades

La vulnerabilidad de validación incorrecta de entradas es un problema de gravedad alta en la versión 4.3.1 de httpclient de Apache. La interfaz de usuario de Snyk me muestra que se puede llegar a la función vulnerable mediante el método doPost de mi URLServlet. Este problema específico se debe a que una entrada URI no se valida correctamente y puede poner en riesgo tu software. Después de hacer algunas pruebas, encontré al menos uno de los problemas.

La URI puede separar las credenciales del nombre de host en una URI. Por ejemplo, http://bmv:pwd@snyk.io hace referencia al dominio snyk.io. Sin embargo, si agrego otro signo @ en la parte de la contraseña de las credenciales, puedo salir de la URL. En resumen, http://bmv:pwd@foojay.io:80@snyk.io me muestra el resultado del dominio foojay.io, no de snyk.io.

Página del navegador titulada “¡Resultado de la solicitud!” que muestra código fuente HTML con el título resaltado “Información gratuita sobre Java y OpenJDK para el uso diario de Java | foojay”

El indicador de reachability está disponible para la integración de GitHub en la plataforma Snyk para proyectos Java Maven. Es una herramienta esencial para priorizar la corrección de vulnerabilidades en tu aplicación. Cuando aparece este indicador, existe una ruta desde tu código hasta el método vulnerable del paquete importado.

Para calcular la reachability en la integración de GitHub, Snyk bifurca tu código y lo inspecciona. Creamos un grafo de llamadas y lo analizamos para identificar si existe una ruta hasta un método con una vulnerabilidad conocida. Si existe, la vulnerabilidad correspondiente recibe la etiqueta “reachable”. Además, que una vulnerabilidad sea reachable también influye en el puntaje de prioridad que aparece en la esquina superior derecha. Este puntaje combina varias heurísticas para ayudar a los desarrolladores a determinar qué vulnerabilidades son más dañinas en su contexto y, por lo tanto, deberían tener mayor prioridad al corregirlas.

Hallazgo de seguridad etiquetado como de gravedad alta y alcanzable: validación incorrecta de entradas, con un total de 673.

Si me desplazo hacia abajo en la interfaz de Snyk, veo más vulnerabilidades, incluida una vulnerabilidad de denegación de servicio en el paquete snakeyaml. Observa que esta vulnerabilidad no tiene el indicador de reachability, ya que solo importo el paquete y nunca lo uso en mi programa de ejemplo.

Informe de vulnerabilidad de denegación de servicio de gravedad media para org.yaml:snakeyaml, que recomienda actualizar a la versión 1.26

Conclusión

Reachable Vulnerabilities para nuestra integración de GitHub es una función potente y gratuita que ayuda a todos nuestros usuarios a decidir mejor por dónde empezar a corregir vulnerabilidades y cuáles resolver primero.

Sin embargo, esto no significa que puedas ignorar sin riesgos las vulnerabilidades que no tienen el indicador de reachability. Siguen formando parte de tu aplicación y es posible que se activen de otras maneras.

En especial en Java, contamos con elementos como la API de reflexión. Además, todas las clases están disponibles a través del classpath. Esto significa que, si es posible ejecutar código arbitrario en tu aplicación, todas las clases disponibles pueden cargarse y explotarse.

Lo que quiero decir es que las vulnerabilidades a las que no se puede llegar directamente aún pueden explotarse mediante una cadena de eventos.  Aun así, Reachable Vulnerabilities te permite saber por dónde empezar a hacer que tu aplicación sea mejor y más segura. ¿Qué esperas? ¡Crea una cuenta gratuita de Snyk y pruébalo!

La aplicación que se usa en esta publicación del blog está disponible en este repositorio de GitHub.

Comienza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.