Uno de los casos más reveladores ocurrió con Equifax en mayo de 2017. Atacantes desconocidos confiscaron información sobre 143 millones de estadounidenses, incluidos nombres completos, direcciones, números de seguro social y licencias de conducir. En 209.000 casos, los documentos también incluían información sobre las tarjetas bancarias de las víctimas. Esta filtración se debió a la explotación de una vulnerabilidad crítica en Apache Struts 2 (CVE-2017-5638), mientras que la corrección se lanzó en marzo de 2017. La compañía tuvo dos meses para instalar la actualización, pero nadie se molestó por eso.
Este artículo discutirá el tema de elegir una herramienta para realizar SCA en términos de la calidad de los resultados del análisis. También habrá una comparación funcional de las herramientas. El proceso de inserción en CI / CD y las posibilidades de integración se dejarán para futuras publicaciones. OWASP presentó una amplia lista de herramientas en su sitio web , pero como parte de la revisión actual, solo tocaremos la herramienta de código abierto más popular Dependency Check, la plataforma de código abierto un poco menos conocida Dependency Track y la solución Sonatype Nexus IQ Enterprise. También averiguaremos cómo funcionan estas soluciones y compararemos los resultados obtenidos para los falsos positivos.
Principio de funcionamiento
Dependency Check es una utilidad (CLI, maven, módulo jenkins, ant) que analiza los archivos del proyecto, recopila información sobre las dependencias (nombre del paquete, groupid, título de la especificación, versión ...), crea una línea CPE - (Common Platform Enumeration), Package URL (PURL) y detecta vulnerabilidades para CPE / PURL de bases de datos (NVD, Sonatype OSS Index, NPM Audit API ...), y luego crea un informe único en formato HTML, JSON, XML ...
Veamos cómo se ve el CPE:
cpe:2.3:part:vendor:product:version:update:edition:language:sw_edition:target_sw:target_hw:other
- Parte: una indicación de que el componente pertenece a la aplicación (a), sistema operativo (o), hardware (h) (elemento obligatorio)
- Proveedor: Nombre del fabricante del producto (obligatorio)
- Producto: Nombre del producto (artículo obligatorio)
- Versión: versión del componente (artículo obsoleto)
- Actualización: actualiza el paquete
- Edición: versión heredada (obsoleta)
- Idioma: el idioma definido en RFC-5646
- Edición SW: versión de software
- SW de destino: el entorno de software en el que se ejecuta el producto
- HW de destino: el entorno de hardware en el que se ejecuta el producto
- Otro: información del proveedor o del producto
Un ejemplo de CPE se ve así:
cpe:2.3:a:pivotal_software:spring_framework:3.0.0:*:*:*:*:*:*:*
La línea significa que CPE versión 2.3 describe un componente de la aplicación del fabricante
pivotal_software
con el nombre de la spring_framework
versión 3.0.0. Si abrimos la vulnerabilidad CVE-2014-0225 en NVD , podemos ver una mención de este CPE. El primer problema que debe notarse de inmediato es que el CVE en NVD, según el CPE, informa que hay un problema en el framework, y no en un componente específico. Es decir, si los desarrolladores están estrechamente vinculados al marco y la vulnerabilidad identificada no se aplica a los módulos que utilizan los desarrolladores, el especialista en seguridad de alguna manera tendrá que desmontar este CVE y pensar en actualizar.
Las herramientas SCA también utilizan la URL. El formato de la URL del paquete es el siguiente:
scheme:type/namespace/name@version?qualifiers#subpath
- Tema: Siempre habrá 'pkg' indicando que esta es la URL del paquete (Requerido)
- Tipo: el "tipo" del paquete o el "protocolo" del paquete, como maven, npm, nuget, gem, pypi, etc. (Cláusula obligatoria)
- Espacio de nombres: algún prefijo de nombre, como el ID de grupo de Maven, el propietario de la imagen de Docker, el usuario de GitHub u organización. Opcional y depende del tipo.
- Nombre: nombre del paquete (obligatorio)
- Versión: versión del paquete
- Calificadores: calificaciones adicionales para el paquete, como sistema operativo, arquitectura, distribución, etc. Elemento opcional y específico del tipo.
- Subruta: ruta adicional en el paquete relativa a la raíz del paquete
Por ejemplo:
pkg:golang/google.golang.org/genproto#googleapis/api/annotations
pkg:maven/org.apache.commons/io@1.3.4
pkg:pypi/django-package@1.11.1.dev1
Dependency Track es una plataforma web local que acepta listas de materiales (BOM) listas para usar generadas por CycloneDX y SPDX , es decir, especificaciones listas para usar sobre las dependencias existentes. Este es un archivo XML con una descripción de las dependencias: nombre, hash, URL del paquete, editor, licencia. A continuación, Dependency Track analiza la lista de materiales, examina los CVE disponibles para las dependencias identificadas de la base de datos de vulnerabilidades (NVD, Sonatype OSS Index ...), luego crea gráficos, calcula métricas y actualiza periódicamente los datos de estado de vulnerabilidad de los componentes.
Un ejemplo de cómo podría verse una lista de materiales en formato XML:
<?xml version="1.0" encoding="UTF-8"?>
<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1">
<components>
<component type="library">
<publisher>Apache</publisher>
<group>org.apache.tomcat</group>
<name>tomcat-catalina</name>
<version>9.0.14</version>
<hashes>
<hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
<hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
<hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
<hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
</hashes>
<licenses>
<license>
<id>Apache-2.0</id>
</license>
</licenses>
<purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14</purl>
</component>
<!-- More components here -->
</components>
</bom>
La lista de materiales se puede utilizar no solo como parámetros de entrada para la ruta de dependencia, sino también para inventariar componentes de software en la cadena de suministro, por ejemplo, para proporcionar software al cliente. En 2014, la Ley de Transparencia y Gestión de la Cadena de Suministro Cibernético de 2014 incluso se propuso para su consideración en los Estados Unidos , que establecía que al comprar software, cualquier estado. la institución debe solicitar un BOM para evitar la explotación de componentes vulnerables, pero la ley nunca entró en vigencia.
Volviendo a SCA, Dependency Track tiene integraciones listas para usar con plataformas de notificación como Slack, sistemas de gestión de vulnerabilidades como Kenna Security. También debe decirse que Dependency Track, entre otras cosas, detecta versiones desactualizadas de paquetes y proporciona información sobre licencias (debido al soporte para SPDX).
Si hablamos específicamente de la calidad de SCA, entonces hay una diferencia fundamental.
La vía de dependencia no acepta el proyecto como entrada, sino la lista de materiales. Esto significa que si queremos verificar el proyecto, primero necesitamos generar bom.xml, por ejemplo, usando CycloneDX. Por lo tanto, Dependency Track depende directamente de CycloneDX. Al mismo tiempo, permite la personalización. Entonces, el equipo de OZON escribió el módulo CycloneDX para crear archivos BOM para proyectos de Golang para un mayor análisis a través de Dependency Track.
Nexus IQEs una solución SCA comercial de Sonatype, que forma parte del ecosistema Sonatype, que también incluye Nexus Repository Manager. Nexus IQ puede aceptar como datos de entrada tanto archivos de guerra (para proyectos java) a través de la interfaz web o API, como BOM, si su organización no ha logrado reconstruir desde CycloneDX a una nueva solución. A diferencia de las soluciones de código abierto, IQ no solo se refiere al CPE / PURL para el componente identificado y la vulnerabilidad correspondiente en la base de datos, sino que también tiene en cuenta su propia investigación, por ejemplo, el nombre de la función o clase vulnerable. Los mecanismos de CI se discutirán más adelante en el análisis de los resultados.
Resumamos algunas de las características funcionales y también consideremos los lenguajes admitidos para el análisis:
Idioma | Nexus IQ | Verificación de dependencia | Pista de dependencia |
---|---|---|---|
Java | + | + | + |
C / C ++ | + | + | - |
C # | + | + | - |
.Red | + | + | + |
Erlang | - | - | + |
JavaScript (NodeJS) | + | + | + |
PHP | + | + | + |
Pitón | + | + | + |
Rubí | + | + | + |
Perl | - | - | - |
Scala | + | + | + |
C objetivo | + | + | - |
Rápido | + | + | - |
R | + | - | - |
Vamos | + | + | + |
Funcionalidad
Funcionalidad | Nexus IQ | Verificación de dependencia | Pista de dependencia |
---|---|---|---|
Capacidad para proporcionar verificación de los componentes utilizados en el código fuente para la pureza con licencia | + | - | + |
Capacidad para escanear y analizar vulnerabilidades y pureza de licencias para imágenes de Docker | + Integración con Clair | - | - |
Política de seguridad configurable para usar bibliotecas de código abierto | + | - | - |
Capacidad para escanear repositorios de código abierto en busca de componentes vulnerables | + RubyGems, Maven, NPM, Nuget, Pypi, Conan, Bower, Conda, Go, p2, R, Yum, Helm, Docker, CocoaPods, Git LFS | - | + Hex, RubyGems, Maven, NPM, Nuget, Pypi |
Disponibilidad de un grupo de investigación especializado | + | - | - |
Trabajo en circuito cerrado | + | + | + |
Usar bases de datos de terceros | + Sonatipo DB cerrado | + Sonatype OSS, asesores públicos de NPM | + Sonatype OSS, NPM Public Advisors, RetireJS, VulnDB, soporte para su propia base de datos de vulnerabilidades |
Capacidad para filtrar componentes de código abierto al intentar cargarlos en un bucle de desarrollo según las políticas configuradas | + | - | - |
Recomendaciones para corregir vulnerabilidades, disponibilidad de enlaces de reparación | + | + - (depende de la descripción en bases de datos públicas) | + - (depende de la descripción en bases de datos públicas) |
Clasificación de vulnerabilidades detectadas por gravedad | + | + | + |
Modelo de acceso basado en roles | + | - | + |
Soporte CLI | + | + | + - (solo para CycloneDX) |
Selección / clasificación de vulnerabilidades según criterios definidos | + | - | + |
Panel por estado de la aplicación | + | - | + |
Generación de informes en formato PDF | + | - | - |
Generación de informes en formato JSON \ CSV | + | + | - |
Soporte de idioma ruso | - | - | - |
Oportunidades de integración
Integración | Nexus IQ | Verificación de dependencia | Pista de dependencia |
---|---|---|---|
Integración con LDAP / Active Directory | + | - | + |
Integración con el sistema de integración continua Bamboo | + | - | - |
Integración con el sistema de integración continua TeamCity | + | - | - |
Integración con el sistema de integración continua de GitLab | + | + - (como complemento para GitLab) | + |
Integración con el sistema de integración continua de Jenkins | + | + | + |
Disponibilidad de complementos para el IDE | + IntelliJ, Eclipse, Visual Studio | - | - |
Soporte para integración personalizada a través de los servicios web de la herramienta (API) | + | - | + |
Verificación de dependencia
Primer comienzo
Ejecutemos Dependency Check en una aplicación DVJA deliberadamente vulnerable .
Para hacer esto, usaremos el complemento Dependency Check Maven :
mvn org.owasp:dependency-check-maven:check
Como resultado, dependecy-check-report.html aparecerá en el directorio de destino.
Abramos el archivo. Luego de la información resumida sobre la cantidad total de vulnerabilidades, podemos ver información sobre vulnerabilidades con un alto nivel de Severidad y Confianza, indicando el paquete, CPE, número CVE.
A esto le sigue información más detallada, en particular en qué se basa la evidencia, es decir, una determinada lista de materiales.
Luego viene la descripción de CPE, PURL y CVE. Por cierto, las recomendaciones de reparación no se adjuntan debido a su ausencia en la base de datos NVD.
Para revisar sistemáticamente los resultados del análisis, puede configurar Nginx con una configuración mínima o enviar los defectos resultantes a un sistema de gestión de defectos que admita los conectores Dependency Check. Por ejemplo, Defect Dojo.
Pista de dependencia
Instalación
Dependency Track, a su vez, es una plataforma web con gráficos de visualización, por lo que no existe un problema grave de almacenamiento de defectos en una solución de terceros.
Existen los siguientes scripts compatibles para la instalación: Docker, WAR, ejecutable WAR.
Primer comienzo
Vaya a la URL del servicio en ejecución. Ingresamos por admin / admin, cambiamos el nombre de usuario y la contraseña, y luego llegamos al Tablero. Lo siguiente que haremos es crear un proyecto para la aplicación de prueba Java en Inicio / Proyectos → Crear proyecto . Tomemos DVJA como ejemplo.
Dado que la ruta de dependencia solo puede aceptar una lista de materiales como entrada, esta lista de materiales debe recuperarse. Let uso de la CycloneDX Maven Plugin :
mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom
Obtenga bom.xml y cargue el archivo en el proyecto DVJA creado → Dependencias → Cargar BOM .
Vayamos a Administración → Analizadores. Entendemos que solo tenemos el Analizador interno habilitado, incluido NVD. También conectaremos Sonatype OSS Index.
Por lo tanto, obtendremos la siguiente imagen para nuestro proyecto:
También en la lista puede encontrar una vulnerabilidad aplicable a Sonatype OSS:
La principal decepción fue que Dependency Track ya no acepta informes xml de Dependency Check. Las últimas versiones admitidas de la integración de Dependency Check fueron 1.0.0 - 4.0.2, mientras que probé la 5.3.2.
Aquí hay un video (y ahora ) cuando aún era posible.
Nexus IQ
Primer comienzo
El Nexus IQ se instala desde los archivos de documentación , pero hemos compilado una imagen de Docker para este propósito.
Después de iniciar sesión en la consola, debe crear una organización y una aplicación.
Como puede ver, la configuración en el caso de IQ es un poco más complicada, porque también necesitamos crear políticas aplicables a diferentes "etapas" (desarrollo, compilación, etapa, lanzamiento). Esto es necesario para bloquear componentes vulnerables a medida que se mueven a lo largo de la tubería más cerca del producto, o para bloquear tan pronto como ingresan al Nexus Repo cuando los desarrolladores los descargan.
Para sentir la diferencia entre el código abierto y la empresa, realicemos el mismo escaneo a través del Nexus IQ de la misma manera a través del complemento Maven , habiendo creado previamente una aplicación de prueba en la interfaz NexusIQ
dvja-test-and-compare
:
mvn com.sonatype.clm:clm-maven-plugin:evaluate -Dclm.applicationId=dvja-test-and-compare -Dclm.serverUrl=<NEXUSIQIP> -Dclm.username=<USERNAME> -Dclm.password=<PASSWORD>
Siga la URL del informe generado en la interfaz web de IQ:
aquí puede ver todas las infracciones de políticas con diferentes niveles de importancia (desde Información hasta Seguridad crítica). La letra D al lado del componente significa que el componente es Dependencia Directa y la letra T al lado del componente significa que el componente es Dependencia Transitiva, es decir, es transitivo.
Por cierto, el Informe sobre el estado de seguridad de código abierto 2020 de Snyk informa que más del 70% de las vulnerabilidades de código abierto encontradas en Node.js, Java y Ruby están en dependencias transitivas.
Si abrimos una de las infracciones de la política de Nexus IQ, podemos ver la descripción del componente, así como el Gráfico de versión, que muestra la ubicación de la versión actual en la línea de tiempo, así como en qué punto la vulnerabilidad ya no es vulnerable. La altura de las velas en el gráfico muestra la popularidad de este componente.
Si va a la sección de vulnerabilidades y divulga el CVE, puede leer una descripción de esta vulnerabilidad, recomendaciones para su eliminación, así como el motivo por el cual se violó este componente, es decir, la presencia de una clase
DiskFileitem.class
.
Resumamos solo los componentes Java de terceros, eliminando los componentes js. Entre paréntesis, indicamos el número de esas vulnerabilidades que se encontraron fuera del NVD.
IQ total de Nexus:
- Dependencias escaneadas: 62
- Dependencias vulnerables: 16
- Vulnerabilidades encontradas: 42 (8 sonatype db)
Comprobación de dependencia total:
- Dependencias escaneadas: 47
- Dependencias vulnerables: 13
- Vulnerabilidades encontradas: 91 (14 sonatype oss)
Pista de dependencia total:
- Dependencias escaneadas: 59
- Dependencias vulnerables: 10
- Vulnerabilidades encontradas: 51 (1 sonatype oss)
En los siguientes pasos, analizaremos los resultados y descubriremos cuál de estas vulnerabilidades es un defecto real y cuál es un falso positivo.
Descargo de responsabilidad
Esta revisión no es una verdad innegable. El autor no tenía el objetivo de hacer que un instrumento separado se destacara de los demás. El objetivo de la revisión era mostrar cómo funcionan las herramientas SCA y cómo verificar sus resultados.
Comparación de resultados
Condiciones: un
falso positivo de vulnerabilidades en componentes de terceros es:
- Desajuste de CVE para el componente identificado
- , struts2, struts-tiles, , false positive
- CVE
- , python > 3.5 2.7 — false positive, 3.x
- CVE
- , SCA CVE, RCE, SCA CVE, Cisco, RCE. false positive.
- Por ejemplo, CVE se encontró en un componente spring-web, después de lo cual SCA apunta al mismo CVE en otros componentes de Spring Framework, mientras que CVE no tiene nada que ver con otros componentes. En este caso, será un falso positivo.
El proyecto de código abierto DVJA fue elegido como objeto de investigación. La investigación involucró solo componentes java (no js).
Resumen de resultados
Vayamos directamente al resultado de una revisión manual de las vulnerabilidades identificadas. El informe completo de cada CVE se puede encontrar en el Apéndice.
Resumen de resultados para todas las vulnerabilidades:
Parámetro | Nexus IQ | Verificación de dependencia | Pista de dependencia |
---|---|---|---|
Total de vulnerabilidades identificadas | 42 | 91 | 51 |
Vulnerabilidades detectadas incorrectamente (falso positivo) | 2 (4,76%) | 62 (68,13%) | 29 (56,86%) |
No se encontraron vulnerabilidades relevantes (falso negativo) | diez | 20 | 27 |
Resumen de resultados por componente:
Parámetro | Nexus IQ | Verificación de dependencia | Pista de dependencia |
---|---|---|---|
Total de componentes identificados | 62 | 47 | 59 |
Total de componentes vulnerables | dieciséis | trece | diez |
Componentes vulnerables identificados incorrectamente (falso positivo) | 1 | cinco | 0 |
Componentes vulnerables identificados incorrectamente (falso positivo) | 0 | 6 | 6 |
Construyamos gráficos visuales para evaluar la proporción de falsos positivos y falsos negativos con respecto al número total de vulnerabilidades. Los componentes están marcados horizontalmente y las vulnerabilidades identificadas en ellos están marcadas verticalmente.
En comparación, el equipo de Sonatype llevó a cabo un estudio similar para probar un proyecto de 1531 componentes utilizando OWASP Dependency Check. Como podemos ver, la relación entre el ruido y los disparadores correctos es comparable a nuestros resultados.
Fuente: www.sonatype.com/why-precision-matters-ebook
Echemos un vistazo a algunos CVE de nuestros resultados de escaneo para comprender el motivo de estos resultados.
Más detalles
# 1
Primero echemos un vistazo a algunos puntos interesantes del Sonatype Nexus IQ.
Nexus IQ apunta a un problema de deserialización con la capacidad de ejecutar RCE en Spring Framework varias veces. CVE-2016-1000027 en spring-web: 3.0.5 por primera vez, y CVE-2011-2894 en spring-context: 3.0.5 y spring-core: 3.0.5. Al principio, parece que hay una duplicación de la vulnerabilidad en varios CVE. Porque si miras CVE-2016-1000027 y CVE-2011-2894 en la base de datos NVD, entonces parece que todo es obvio
Componente | Vulnerabilidad |
---|---|
resorte-web: 3.0.5 | CVE-2016-1000027 |
contexto de primavera: 3.0.5 | CVE-2011-2894 |
núcleo de resorte: 3.0.5 | CVE-2011-2894 |
Descripción de CVE-2011-2894 de NVD :
Descripción de CVE-2016-1000027 de NVD :
CVE-2011-2894 en sí es bastante famoso. El informe de White Source de 2011 clasificó este CVE como uno de los más frecuentes. Las descripciones para CVE-2016-100027 son, en principio, un poco en NVD, y parece ser aplicable solo para Spring Framework 4.1.4. Eche un vistazo a la referencia y aquí se vuelve más o menos claro. Entendemos por el artículo de Tenable que además de la vulnerabilidad
RemoteInvocationSerializingExporter
en CVE-2011-2894, la vulnerabilidad se observa en HttpInvokerServiceExporter
. Esto es lo que nos dice Nexus IQ:
Sin embargo, no hay nada como esto en NVD, por lo que Dependency Check y Dependency Track reciben un falso negativo.
Además, a partir de la descripción de CVE-2011-2894, puede comprender que la vulnerabilidad está realmente presente en spring-context: 3.0.5 y spring-core: 3.0.5. La confirmación de esto se puede encontrar en un artículo de la persona que encontró esta vulnerabilidad.
# 2
Componente | Vulnerabilidad | Resultado |
---|---|---|
struts2-core: 2.3.30 | CVE-2016-4003 | FALSO |
Si estudiamos la vulnerabilidad CVE-2016-4003 entenderemos que se corrigió en la versión 2.3.28, sin embargo Nexus IQ nos informa al respecto. Hay una nota en la descripción de la vulnerabilidad:
es decir, la vulnerabilidad existe solo en conjunto con una versión desactualizada del JRE, sobre la cual decidieron advertirnos. Sin embargo, consideramos que esto es un falso positivo, aunque no el peor.
Numero 3
Componente | Vulnerabilidad | Resultado |
---|---|---|
xwork-core: 2.3.30 | CVE-2017-9804 | CIERTO |
xwork-core: 2.3.30 | CVE-2017-7672 | FALSO |
Si miramos las descripciones de CVE-2017-9804 y CVE-2017-7672, entenderemos que el problema es
URLValidator class
, y CVE-2017-9804 se deriva de CVE-2017-7672. La presencia de la segunda vulnerabilidad no conlleva ninguna carga útil, excepto que su gravedad ha aumentado a Alta, por lo que puede considerarse ruido innecesario.
En general, no se encontraron otros falsos positivos para el Nexus IQ.
# 4
Hay varias cosas que distinguen al CI de otras decisiones.
Componente | Vulnerabilidad | Resultado |
---|---|---|
resorte-web: 3.0.5 | CVE-2020-5398 | CIERTO |
El CVE en NVD dice que solo es aplicable para las versiones 5.2.xa 5.2.3, 5.1.xa 5.1.13 y versiones 5.0.xa 5.0.16, sin embargo, si miramos la descripción de CVE en el Nexus IQ, veremos lo siguiente:
Aviso de desviación del aviso: El equipo de investigación de seguridad de Sonatype descubrió que esta vulnerabilidad se introdujo en la versión 3.0.2.RELEASE y no en la 5.0.x como se indica en el aviso.
A esto le sigue una PoC para esta vulnerabilidad, que informa que está presente en la versión 3.0.5.
Se envía un falso negativo a Comprobación de dependencia y Seguimiento de dependencia.
# 5
Veamos el falso positivo para la verificación de dependencia y el seguimiento de dependencia.
Dependency Check se destaca porque refleja aquellos CVE que se aplican a todo el marco en NVD en aquellos componentes a los que esos CVE no son aplicables. Esto se aplica a CVE-2012-0394, CVE-2013-2115, CVE-2014-0114, CVE-2015-0899, CVE-2015-2992, CVE-2016-1181, CVE-2016-1182, cuya verificación de dependencia "atornilló" a struts-taglib: 1.3.8 y struts-tiles-1.3.8. Estos componentes no tienen nada que ver con lo que se describe en CVE: procesamiento de solicitudes, validación de páginas, etc. Esto se debe al hecho de que lo común entre estos CVE y los componentes es solo el marco, por lo que Dependency Check lo consideró una vulnerabilidad.
La misma situación con spring-tx: 3.0.5, y una situación similar con struts-core: 1.3.8. Para struts-core, Dependency Check y Dependency Track han encontrado muchas vulnerabilidades que son realmente aplicables a struts2-core, que es esencialmente un marco separado. En este caso, Nexus IQ entendió correctamente la imagen y en esos CVE que emitió, indicó que struts-core llegó al final de su vida útil y era necesario pasar a struts2-core.
# 6
En algunas situaciones, es injusto interpretar un error explícito de Comprobación de dependencia y Seguimiento de dependencia. En particular CVE-2013-4152, CVE-2013-6429, CVE-2013-6430, CVE-2013-7315, CVE-2014-0054, CVE-2014-0225, CVE-2014-0225, que son Comprobación de dependencia y Seguimiento de dependencia referido a spring-core: 3.0.5 en realidad se refiere a spring-web: 3.0.5. Al mismo tiempo, se encontraron algunos de estos CVE y el Nexus IQ, sin embargo, el IQ los identificó correctamente para otro componente. Dado que estas vulnerabilidades no se encontraron en spring-core, no se puede argumentar que no están en el marco, en principio, y las herramientas de código abierto señalaron correctamente estas vulnerabilidades (solo fallaron un poco).
conclusiones
Como podemos ver, la determinación de la confiabilidad de las vulnerabilidades identificadas mediante revisión manual no da resultados inequívocos, lo que conduce a cuestiones controvertidas. Los resultados son tales que la solución Nexus IQ tiene la tasa de falsos positivos más baja y la mayor precisión.
En primer lugar, esto se debe al hecho de que el equipo de Sonatype ha ampliado la descripción de cada vulnerabilidad CVE de NVD en sus bases de datos, especificando con precisión la clase o función de la vulnerabilidad para una versión particular del componente, realizando investigaciones adicionales (por ejemplo, verificando vulnerabilidades en versiones más antiguas). versiones de software).
Una influencia importante en los resultados la juegan aquellas vulnerabilidades que no estaban incluidas en NVD, pero que sin embargo están presentes en la base de datos Sonatype con la marca SONATYPE. Según el estado de las vulnerabilidades de seguridad de código abierto 2020El 45% de las vulnerabilidades de código abierto descubiertas no se informa a NVD. Según la base de datos WhiteSource, solo el 29% de todas las vulnerabilidades de código abierto informadas fuera de NVD terminan siendo publicadas allí, por lo que es importante buscar vulnerabilidades en otros lugares también.
Como resultado, Dependency Check genera mucho ruido y faltan algunos componentes vulnerables. Dependency Track produce menos ruido y revela una gran cantidad de componentes, lo que visualmente no daña los ojos en la interfaz web.
Sin embargo, la práctica muestra que el código abierto debería ser el primer paso en el camino hacia DevSecOps maduro. Lo primero en lo que hay que pensar para integrar SCA en el desarrollo son los procesos, es decir, pensar junto con la dirección y los departamentos relacionados sobre cómo deberían verse los procesos ideales en su organización. Puede resultar que para su organización al principio, Dependency Check o Dependency Track cubra todas las necesidades comerciales, y las soluciones empresariales serán una continuación lógica debido a la creciente complejidad de las aplicaciones desarrolladas.
Apéndice A. Resultados aplicados a componentes
:
- High —
- Medium —
- TRUE — (True positive issue)
- FALSE — (False positive issue)
Nexus IQ | Dependency Check | Dependency Track | ||
---|---|---|---|---|
dom4j: 1.6.1 | High | High | High | TRUE |
log4j-core: 2.3 | High | High | High | TRUE |
log4j: 1.2.14 | High | High | - | TRUE |
commons-collections:3.1 | High | High | High | TRUE |
commons-fileupload:1.3.2 | High | High | High | TRUE |
commons-beanutils:1.7.0 | High | High | High | TRUE |
commons-codec:1:10 | Medium | - | - | TRUE |
mysql-connector-java:5.1.42 | High | High | High | TRUE |
spring-expression:3.0.5 | High |
|
TRUE | |
spring-web:3.0.5 | High | High | TRUE | |
spring-context:3.0.5 | Medium | - | TRUE | |
spring-core:3.0.5 | Medium | High | High | TRUE |
struts2-config-browser-plugin:2.3.30 | Medium | - | - | TRUE |
spring-tx:3.0.5 | - | High | - | FALSE |
struts-core:1.3.8 | High | High | High | TRUE |
xwork-core: 2.3.30 | High | - | - | TRUE |
struts2-core: 2.3.30 | High | High | High | TRUE |
struts-taglib:1.3.8 | - | High | - | FALSE |
struts-tiles-1.3.8 | - | High | - | FALSE |
Apéndice B. Resultados de vulnerabilidades
:
- High —
- Medium —
- TRUE — (True positive issue)
- FALSE — (False positive issue)
Nexus IQ | Dependency Check | Dependency Track | Severity | |||
---|---|---|---|---|---|---|
dom4j: 1.6.1 | CVE-2018-1000632 | CVE-2018-1000632 | CVE-2018-1000632 | High | TRUE | |
CVE-2020-10683 | CVE-2020-10683 | CVE-2020-10683 | High | TRUE | ||
log4j-core: 2.3 | CVE-2017-5645 | CVE-2017-5645 | CVE-2017-5645 | High | TRUE | |
CVE-2020-9488 | CVE-2020-9488 | CVE-2020-9488 | Low | TRUE | ||
log4j: 1.2.14 | CVE-2019-17571 | CVE-2019-17571 | - | High | TRUE | |
- | CVE-2020-9488 | - | Low | TRUE | ||
SONATYPE-2010-0053 | - | - | High | TRUE | ||
commons-collections:3.1 | - | CVE-2015-6420 | CVE-2015-6420 | High | FALSE | RCE(OSSINDEX)
|
- | CVE-2017-15708 | CVE-2017-15708 | High | FALSE | RCE(OSSINDEX)
|
|
SONATYPE-2015-0002 | RCE (OSSINDEX) | RCE(OSSINDEX) | High | TRUE | ||
commons-fileupload:1.3.2 | CVE-2016-1000031 | CVE-2016-1000031 | CVE-2016-1000031 | High | TRUE | |
SONATYPE-2014-0173 | - | - | Medium | TRUE | ||
commons-beanutils:1.7.0 | CVE-2014-0114 | CVE-2014-0114 | CVE-2014-0114 | High | TRUE | |
- | CVE-2019-10086 | CVE-2019-10086 | High | FALSE | 1.9.2+
|
|
commons-codec:1:10 | SONATYPE-2012-0050 | - | - | Medium | TRUE | |
mysql-connector-java:5.1.42 | CVE-2018-3258 | CVE-2018-3258 | CVE-2018-3258 | High | TRUE | |
CVE-2019-2692 | CVE-2019-2692 | - | Medium | TRUE | ||
- | CVE-2020-2875 | - | Medium | FALSE | CVE-2019-2692, c «attacks may significantly impact additional products»
|
|
- | CVE-2017-15945 | - | High | FALSE | mysql-connector-java
|
|
- | CVE-2020-2933 | - | Low | FALSE | CVE-2020-2934
|
|
CVE-2020-2934 | CVE-2020-2934 | - | Medium | TRUE | ||
spring-expression:3.0.5 | CVE-2018-1270 | - | High | TRUE | ||
CVE-2018-1257 | - | - | Medium | TRUE | ||
spring-web:3.0.5 | CVE-2016-1000027 | - | High | TRUE | ||
CVE-2014-0225 | - | CVE-2014-0225 | High | TRUE | ||
CVE-2011-2730 | - | - | High | TRUE | ||
- | - | CVE-2013-4152 | Medium | TRUE | ||
CVE-2018-1272 | - | - | High | TRUE | ||
CVE-2020-5398 | - | - | High | TRUE | IQ: «The Sonatype security research team discovered that this vulnerability was introduced in version 3.0.2.RELEASE and not 5.0.x as stated in the advisory.»
|
|
CVE-2013-6429 | - | - | Medium | TRUE | ||
CVE-2014-0054 | - | CVE-2014-0054 | Medium | TRUE | ||
CVE-2013-6430 | - | - | Medium | TRUE | ||
spring-context:3.0.5 | CVE-2011-2894 | - | Medium | TRUE | ||
spring-core:3.0.5 | - | CVE-2011-2730 | CVE-2011-2730 | High | TRUE | |
CVE-2011-2894 | CVE-2011-2894 | CVE-2011-2894 | Medium | TRUE | ||
- | - | CVE-2013-4152 | Medium | FALSE | spring-web
|
|
- | CVE-2013-4152 | - | Medium | FALSE | spring-web
|
|
- | CVE-2013-6429 | CVE-2013-6429 | Medium | FALSE | spring-web
|
|
- | CVE-2013-6430 | - | Medium | FALSE | spring-web
|
|
- | CVE-2013-7315 | CVE-2013-7315 | Medium | FALSE | SPLIT CVE-2013-4152. + spring-web
|
|
- | CVE-2014-0054 | CVE-2014-0054 | Medium | FALSE | spring-web
|
|
- | CVE-2014-0225 | - | High | FALSE | spring-web
|
|
- | - | CVE-2014-0225 | High | FALSE | spring-web
|
|
- | CVE-2014-1904 | CVE-2014-1904 | Medium | FALSE | spring-web-mvc
|
|
- | CVE-2014-3625 | CVE-2014-3625 | Medium | FALSE | spring-web-mvc
|
|
- | CVE-2016-9878 | CVE-2016-9878 | High | FALSE | spring-web-mvc
|
|
- | CVE-2018-1270 | CVE-2018-1270 | High | FALSE | spring-expression / spring-messages
|
|
- | CVE-2018-1271 | CVE-2018-1271 | Medium | FALSE | spring-web-mvc
|
|
- | CVE-2018-1272 | CVE-2018-1272 | High | TRUE | ||
CVE-2014-3578 | CVE-2014-3578 (OSSINDEX) | CVE-2014-3578 | Medium | TRUE | ||
SONATYPE-2015-0327 | - | - | Low | TRUE | ||
struts2-config-browser-plugin:2.3.30 | SONATYPE-2016-0104 | - | - | Medium | TRUE | |
spring-tx:3.0.5 | - | CVE-2011-2730 | - | High | FALSE | spring-tx
|
- | CVE-2011-2894 | - | High | FALSE | spring-tx
|
|
- | CVE-2013-4152 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2013-6429 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2013-6430 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2013-7315 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2014-0054 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2014-0225 | - | High | FALSE | spring-tx
|
|
- | CVE-2014-1904 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2014-3625 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2016-9878 | - | High | FALSE | spring-tx
|
|
- | CVE-2018-1270 | - | High | FALSE | spring-tx
|
|
- | CVE-2018-1271 | - | Medium | FALSE | spring-tx
|
|
- | CVE-2018-1272 | - | Medium | FALSE | spring-tx
|
|
struts-core:1.3.8 | - | CVE-2011-5057 (OSSINDEX)
|
Medium | FASLE | Struts 2
|
|
- | CVE-2012-0391 (OSSINDEX) | CVE-2012-0391 | High | FALSE | Struts 2
|
|
- | CVE-2014-0094 (OSSINDEX) | CVE-2014-0094 | Medium | FALSE | Struts 2
|
|
- | CVE-2014-0113 (OSSINDEX) | CVE-2014-0113 | High | FALSE | Struts 2
|
|
CVE-2016-1182 | 3VE-2016-1182 | - | High | TRUE | ||
- | - | CVE-2011-5057 | Medium | FALSE | Struts 2
|
|
- | CVE-2012-0392 (OSSINDEX) | CVE-2012-0392 | High | FALSE | Struts 2
|
|
- | CVE-2012-0393 (OSSINDEX) | CVE-2012-0393 | Medium | FALSE | Struts 2
|
|
CVE-2015-0899 | CVE-2015-0899 | - | High | TRUE | ||
- | CVE-2012-0394 | CVE-2012-0394 | Medium | FALSE | Struts 2
|
|
- | CVE-2012-0838 (OSSINDEX) | CVE-2012-0838 | High | FALSE | Struts 2
|
|
- | CVE-2013-1965 (OSSINDEX) | CVE-2013-1965 | High | FALSE | Struts 2
|
|
- | CVE-2013-1966 (OSSINDEX) | CVE-2013-1966 | High | FASLE | Struts 2
|
|
- | CVE-2013-2115 | CVE-2013-2115 | High | FASLE | Struts 2
|
|
- | CVE-2013-2134 (OSSINDEX) | CVE-2013-2134 | High | FASLE | Struts 2
|
|
- | CVE-2013-2135 (OSSINDEX) | CVE-2013-2135 | High | FASLE | Struts 2
|
|
CVE-2014-0114 | CVE-2014-0114 | - | High | TRUE | ||
- | CVE-2015-2992 | CVE-2015-2992 | Medium | FALSE | Struts 2
|
|
- | CVE-2016-0785 (OSSINDEX) | CVE-2016-0785 | High | FALSE | Struts 2
|
|
CVE-2016-1181 | CVE-2016-1181 | - | High | TRUE | ||
- | CVE-2016-4003 (OSSINDEX) | CVE-2016-4003 | High | FALSE | Struts 2
|
|
xwork-core:2.3.30 | CVE-2017-9804 | - | - | High | TRUE | |
SONATYPE-2017-0173 | - | - | High | TRUE | ||
CVE-2017-7672 | - | - | High | FALSE | CVE-2017-9804
|
|
SONATYPE-2016-0127 | - | - | High | TRUE | ||
struts2-core:2.3.30 | - | CVE-2016-6795 | CVE-2016-6795 | High | TRUE | |
- | CVE-2017-9787 | CVE-2017-9787 | High | TRUE | ||
- | CVE-2017-9791 | CVE-2017-9791 | High | TRUE | ||
- | CVE-2017-9793 | - | High | FALSE | CVE-2018-1327
|
|
- | CVE-2017-9804 | - | High | TRUE | ||
- | CVE-2017-9805 | CVE-2017-9805 | High | TRUE | ||
CVE-2016-4003 | - | - | Medium | FALSE | Apache Struts 2.x 2.3.28, 2.3.30. , , CVE Struts 2, JRE 1.7 . , FALSE
|
|
- | CVE-2018-1327 | CVE-2018-1327 | High | TRUE | ||
CVE-2017-5638 | CVE-2017-5638 | CVE-2017-5638 | High | TRUE | , Equifax 2017
|
|
CVE-2017-12611 | CVE-2017-12611 | - | High | TRUE | ||
CVE-2018-11776 | CVE-2018-11776 | CVE-2018-11776 | High | TRUE | ||
struts-taglib:1.3.8 | - | CVE-2012-0394 | - | Medium | FALSE | struts2-core |
- | CVE-2013-2115 | - | High | FALSE | struts2-core | |
- | CVE-2014-0114 | - | High | FALSE | commons-beanutils
|
|
- | CVE-2015-0899 | - | High | FALSE | taglib
|
|
- | CVE-2015-2992 | - | Medium | FALSE | struts2-core
|
|
- | CVE-2016-1181 | - | High | FALSE | taglib
|
|
- | CVE-2016-1182 | - | High | FALSE | taglib
|
|
struts-tiles-1.3.8 | - | CVE-2012-0394 | - | Medium | FALSE | struts2-core |
- | CVE-2013-2115 | - | High | FALSE | struts2-core | |
- | CVE-2014-0114 | - | High | FALSE | commons-beanutils
|
|
- | CVE-2015-0899 | - | High | FALSE | tiles
|
|
- | CVE-2015-2992 | - | Medium | FALSE | struts2-core | |
- | CVE-2016-1181 | - | High | FALSE | taglib
|
|
- | CVE-2016-1182 | - | High | FALSE | taglib
|