Explora el análisis de composición de software

Completado

Análisis de composición de software (SCA) es un proceso automatizado para identificar componentes de código abierto y de terceros en aplicaciones, analizando sus vulnerabilidades de seguridad, cumplimiento de licencias y calidad de código. A medida que las aplicaciones modernas dependen cada vez más de dependencias externas, SCA se ha convertido en esencial para administrar los riesgos asociados a las cadenas de suministro de software.

¿Qué es el análisis de composición de software?

Análisis de composición de software es la práctica de detectar, catalogar y analizar automáticamente todos los componentes de código abierto y de terceros usados en una aplicación. Las herramientas de SCA examinan manifiestos de paquete, archivos de bloqueo de dependencia, código fuente y archivos binarios compilados para crear una lista completa de materiales de software (SBOM).

Funcionalidades principales de SCA

Detección de dependencias:

  • Análisis de manifiestos: Las herramientas de SCA leen los archivos de manifiesto del paquete (package.json, requirements.txt, pom.xml, *.csproj) para identificar las dependencias declaradas.
  • Análisis de archivos de bloqueo: Analice los archivos de bloqueo (package-lock.json, Pipfile.lock, Gemfile.lock) que muestran versiones instaladas exactas, incluidas las dependencias transitivas.
  • Examen binario: Las herramientas avanzadas examinan artefactos compilados, imágenes de contenedor e aplicaciones implementadas para detectar dependencias insertadas no declaradas en manifiestos.
  • Compatibilidad con varios idiomas: Las herramientas completas admiten docenas de lenguajes de programación y ecosistemas de paquetes (npm, PyPI, Maven, NuGet, RubyGems, Go modules).

Análisis de vulnerabilidades:

  • Comparación de CVE: Comparar las dependencias detectadas con las bases de datos de vulnerabilidades y exposiciones comunes (CVE).
  • Puntuación de gravedad: Calcule las puntuaciones del Sistema de puntuación de vulnerabilidades comunes (CVSS) que indican la gravedad de la vulnerabilidad de 0 (ninguno) a 10 (crítico).
  • Inteligencia sobre vulnerabilidades explotables: Identifique qué vulnerabilidades tienen exploits conocidos que son usados activamente por los atacantes.
  • Recomendaciones de revisión: Sugerir actualizaciones de versión específicas que resuelvan vulnerabilidades al tiempo que mantienen la compatibilidad.

Cumplimiento de licencias:

  • Detección de licencias: Identifique licencias para todas las dependencias mediante el análisis de archivos de licencia, metadatos de paquete y encabezados de código fuente.
  • Cumplimiento de directivas: Marque automáticamente las dependencias que infringen las directivas de licencia de la organización.
  • Análisis de compatibilidad: Detecte licencias en conflicto que no se pueden combinar legalmente en la misma aplicación.
  • Seguimiento de obligaciones: Documente los requisitos de licencia, como avisos de atribución, divulgación de código fuente o restricciones de trabajo derivadas.

Evaluación de la calidad:

  • Estado de mantenimiento: Evalúe si las dependencias se mantienen o abandonan activamente.
  • Salud de la comunidad: Evaluar la actividad de colaborador, el tamaño de la comunidad y la sostenibilidad del proyecto.
  • Prácticas de seguridad: Compruebe que los proyectos tienen procesos de divulgación responsables y avisos de seguridad.
  • Recomendaciones de actualización: Identifique las dependencias obsoletas y sugiera alternativas más seguras y actuales.

Por qué SCA es fundamental para DevOps

Las prácticas de desarrollo de software modernas hacen que SCA sea indispensable:

Explosión de dependencias

Las aplicaciones contienen cientos de dependencias:

  • Dependencias directas: La aplicación típica hace referencia directamente a paquetes externos de 20 a 50.
  • Dependencias transitivas: Cada dependencia directa aporta sus propias dependencias, creando árboles de dependencia con paquetes totales de 200 a 500.
  • Varios ecosistemas: Las aplicaciones suelen combinar dependencias de varios ecosistemas de lenguaje (front-end de JavaScript, back-end de Python, microservicios de Java).
  • Dependencias de contenedor: Las aplicaciones en contenedores incluyen dependencias de imagen base más dependencias de aplicaciones.

El seguimiento manual es imposible:

  • Escama: El seguimiento manual de cientos de dependencias en docenas de aplicaciones no es práctico.
  • Velocidad: Las nuevas vulnerabilidades se divulgan diariamente, lo que hace que cualquier inventario manual se desactualice inmediatamente.
  • Complejidad: Comprender las cadenas de dependencia transitivas y sus interacciones requiere un análisis automatizado.
  • Propiedad distribuida: Dependencias mantenidas por miles de proyectos independientes de código abierto en todo el mundo.

El imperativo de seguridad

Las vulnerabilidades de las dependencias se aprovechan activamente:

  • Infracciones de alto perfil: Los principales incidentes de seguridad implican regularmente la explotación de vulnerabilidades conocidas en paquetes populares de código abierto.
  • Ataques de cadena de suministro: Los atacantes ponen en peligro los paquetes legítimos para distribuir malware a los consumidores de nivel inferior.
  • Vulnerabilidades de día cero: Las vulnerabilidades desconocidas anteriormente en paquetes ampliamente usados pueden afectar a miles de organizaciones simultáneamente.
  • Urgencia de revisión: Las vulnerabilidades críticas requieren una identificación y corrección rápidas en todas las aplicaciones afectadas.

Las herramientas de seguridad tradicionales pierden las vulnerabilidades de dependencia:

  • Análisis estático: Las herramientas de análisis de código fuente analizan el código, pero no el código de dependencia.
  • Pruebas dinámicas: Las pruebas de penetración pueden perder vulnerabilidades en las dependencias no desencadenadas durante las pruebas.
  • Revisión manual: Los equipos de seguridad no pueden revisar de manera viable el código fuente de cientos de paquetes de terceros.
  • Detección especializada: Se requieren herramientas de SCA diseñadas específicamente para identificar vulnerabilidades de dependencia.

Requisito de cumplimiento

Las infracciones de licencia conllevan riesgos significativos:

  • Responsabilidad legal: El uso de dependencias sin cumplir con los términos de licencia puede provocar demandas y daños.
  • Publicación forzada del código: Las licencias copyleft fuertes (GPL, AGPL) pueden requerir que se libere el código completo de las aplicaciones.
  • Restricciones de distribución: Algunas licencias prohíben la distribución comercial o imponen limitaciones de uso.
  • Requisitos de auditoría: Cada vez más, los marcos normativos requieren que las organizaciones mantengan una lista precisa de materiales de software.

Complejidad de las licencias:

  • Cientos de tipos de licencia: El ecosistema de código abierto incluye cientos de licencias distintas con distintas obligaciones.
  • Problemas de compatibilidad: Las distintas licencias tienen términos en conflicto que prohíben su uso conjuntamente.
  • Licencias transitivas: Las obligaciones de licencia de las dependencias transitivas deben seguirse y cumplirse.
  • Cambios de licencia: A veces, los proyectos cambian las licencias entre versiones, lo que requiere supervisión continua.

Funcionamiento de las herramientas de SCA

Las herramientas de SCA emplean varias técnicas para detectar y analizar dependencias:

Mecanismos de detección

Análisis de archivos de manifiesto:

  • Formatos específicos del idioma: Las herramientas comprenden los formatos de manifiesto de paquete para cada lenguaje (package.json para npm, requirements.txt para Python, pom.xml para Maven).
  • Resolución de dependencias: Analice las especificaciones de la versión de dependencia, incluidos los intervalos, las restricciones y las reglas de resolución.
  • Examen del área de trabajo: examine de forma recursiva los directorios de proyectos para buscar todos los archivos de manifiesto en áreas de trabajo monorepos y multi proyecto.
  • Reconocimiento de la configuración: Considere las dependencias específicas del entorno (desarrollo, pruebas, producción) por separado.

Análisis de archivos de bloqueo de dependencia:

  • Versiones exactas: Los archivos de bloqueo registran versiones precisas de todas las dependencias, incluidas las dependencias transitivas.
  • Estado de instalación: Representa las dependencias instaladas reales en lugar de los requisitos abstractos.
  • Resolución determinista: Los archivos de bloqueo garantizan versiones de dependencia coherentes entre entornos.
  • Completar gráficos de dependencias: Incluya un árbol de dependencias transitivo completo con resoluciones de versión.

Escaneo binario y de artefactos:

  • Artefactos compilados: Examine los archivos JAR, los archivos de rueda, los archivos DLL y los ejecutables para identificar las dependencias insertadas.
  • Capas de imagen de contenedor: Analice las capas de imagen de contenedor para detectar componentes de imagen base y dependencias de la aplicación.
  • Examen del sistema de archivos: Examine los sistemas de archivos de aplicación implementados para buscar dependencias no declaradas en manifiestos.
  • Huellas digitales: Utilizar hashes criptográficos para identificar versiones específicas de paquetes incluso sin metadatos.

Integración de build:

  • Complementos de herramientas de compilación: Integración con sistemas de compilación (Maven, Gradle, webpack, pip) para capturar información de dependencia durante las compilaciones.
  • Enlaces de resolución: Enlace a los procesos de resolución de dependencias para registrar las versiones exactas instaladas.
  • Generación de artefactos: genere artefactos de lista de materiales de software (SBOM) en las compilaciones para el consumo posterior.
  • Integración de canalizaciones: ejecute como pasos automatizados en canalizaciones de CI/CD para analizar cada compilación.

Funcionalidades de análisis

Coincidencia de vulnerabilidades:

  • Consulta de base de datos: Consulte la base de datos de vulnerabilidades nacionales (NVD), la base de datos de asesoramiento de GitHub y las bases de datos de vulnerabilidades propietarias.
  • Coincidencia de intervalos de versiones: Determine si las versiones específicas del paquete se encuentran dentro de intervalos de versiones vulnerables.
  • Validación de revisiones: Compruebe si las revisiones aplicadas resuelven realmente las vulnerabilidades notificadas.
  • Priorización: Clasificar las vulnerabilidades por gravedad, vulnerabilidades de seguridad e impacto empresarial.

Identificación de licencia:

  • Varios orígenes: Extraiga información de licencia de los metadatos de los paquetes, los archivos de licencia, los encabezados de origen y los documentos README.
  • Normalización de licencias: Asigne varios nombres de licencia e identificadores (SPDX, OSI) a los tipos de licencia estandarizados.
  • Licenciamiento dual: Maneje los paquetes publicados bajo múltiples licencias alternativas.
  • Licencias personalizadas: Identifique las licencias no estándar que requieren revisión legal.

Análisis de accesibilidad:

  • Construcción del grafo de llamadas: Compile gráficos de llamadas que muestran qué código de dependencia se ejecuta realmente en la aplicación.
  • Detección de código muerto: Identifique las dependencias agrupadas, pero nunca se usaron realmente.
  • Análisis de ruta de explotación: Determine si las rutas de código vulnerables son accesibles desde los puntos de entrada de la aplicación.
  • Refinamiento de riesgos: Reduzca el ruido centrándose en vulnerabilidades aprovechables en el código usado realmente.

Supervisión continua:

  • Alertas en tiempo real: Reciba notificaciones inmediatas cuando se revelen nuevas vulnerabilidades que afectan a las dependencias.
  • Examen programado: Vuelva a examinar periódicamente las aplicaciones para detectar vulnerabilidades recién detectadas en dependencias sin cambios.
  • Comparación de línea base: Realice un seguimiento de los cambios en el estado de vulnerabilidad y cumplimiento a lo largo del tiempo.
  • Prevención de regresión: Alerta cuando las nuevas dependencias presentan vulnerabilidades o infracciones de licencia.

Patrones de integración de SCA

La implementación eficaz de SCA implica la integración en varios puntos del ciclo de vida de desarrollo:

Estación de trabajo para desarrolladores

Integración del IDE:

  • Comentarios en tiempo real: Examine las dependencias a medida que los desarrolladores los agreguen a proyectos.
  • Advertencias insertadas: Muestra las advertencias de vulnerabilidades y licencias directamente en el IDE.
  • Sugerencias de corrección: Sugerir versiones de paquete alternativas o paquetes de reemplazo.
  • Cumplimiento de directivas: Evite agregar dependencias que infrinjan las directivas organizativas.

Validación previa a la confirmación:

  • Enlaces de Git: Ejecute comprobaciones de SCA antes de las confirmaciones para evitar la introducción de dependencias vulnerables.
  • Examen local: Analice los cambios localmente antes de insertar en repositorios remotos.
  • Comentarios rápidos: Proporcione comentarios inmediatos a los desarrolladores durante el desarrollo activo.
  • Detección temprana: detecte problemas antes de llegar a ramas compartidas y canalizaciones de CI/CD.

Control de código fuente

Validación de pull requests:

  • Comprobaciones automatizadas: Ejecute el análisis de SCA en todas las solicitudes de incorporación de cambios para detectar cambios de dependencia.
  • Comentarios de revisión: publique los resultados como comentarios de solicitud de incorporación de cambios para la visibilidad del revisor.
  • Bloqueo de fusión: Se evita la fusión de pull requests que introducen vulnerabilidades críticas o infracciones de licencia.
  • Seguimiento de cambios de dependencia: Documente claramente qué cambios de dependencia introduce cada solicitud de incorporación de cambios.

Integración de GitHub Dependabot:

  • Actualizaciones automatizadas: Cree automáticamente solicitudes de incorporación de cambios cuando haya actualizaciones de seguridad de dependencia disponibles.
  • Alertas de vulnerabilidad: Recibir alertas de seguridad de GitHub para dependencias vulnerables.
  • Gráfico de dependencias: Visualice las relaciones de dependencia en la característica del grafo de dependencias de GitHub.
  • Revisión de flujos de trabajo: Aproveche los procesos de revisión y aprobación de GitHub para las actualizaciones de dependencias.

Canalizaciones de CI/CD

Análisis durante la compilación:

  • Pasos de canalización: agregue el examen de SCA como pasos de compilación automatizados en canalizaciones de CI/CD.
  • Puertas de calidad: las compilaciones que no cumplen los requisitos de seguridad y cumplimiento fallan.
  • Generación SBOM: cree una lista de artefactos de materiales de software junto con las salidas de compilación.
  • Seguimientos de auditoría: Registre los resultados del examen con fines forenses y de cumplimiento.

Puertas de implementación:

  • Validación previa a la implementación: Examine los artefactos antes de implementar en entornos de producción.
  • Directivas específicas del entorno: Aplique directivas más estrictas para las implementaciones de producción que las implementaciones de desarrollo.
  • Desencadenadores de reversión: revierte automáticamente las implementaciones detectadas para contener vulnerabilidades críticas.
  • Aprobaciones de implementación: Requerir aprobación manual para implementaciones con riesgos conocidos pero aceptados.

Supervisión en tiempo de ejecución

Examen de producción:

  • Análisis de aplicaciones implementadas: Examine las aplicaciones efectivamente implementadas para detectar dependencias en tiempo de ejecución.
  • Examen del registro de contenedor: Examine continuamente las imágenes de contenedor almacenadas en registros.
  • Análisis de funciones sin servidor: Examine las funciones sin servidor implementadas y sus dependencias.
  • Detección de desfase: Identifique las diferencias entre las dependencias implementadas deseadas y reales.

Supervisión continua de vulnerabilidades:

  • Vigilancia continua: Supervise las aplicaciones implementadas para detectar vulnerabilidades recién divulgadas que afecten a las dependencias actuales.
  • Respuesta a incidentes: Desencadene flujos de trabajo de respuesta a incidentes cuando se detectan vulnerabilidades críticas en producción.
  • Planeamiento de revisiones: Genere planes de implementación de revisiones para solucionar vulnerabilidades en aplicaciones implementadas.
  • Cumplimiento del Acuerdo de Nivel de Servicio: Realice un seguimiento de los períodos de tiempo de corrección para garantizar el cumplimiento de los Acuerdos de Nivel de Servicio de seguridad.

Procedimientos recomendados de flujo de trabajo de SCA

La implementación correcta de SCA sigue flujos de trabajo probados:

Establecer línea base

Inventario inicial:

  • Detección completa: Ejecute herramientas de SCA en todas las aplicaciones para crear un inventario de dependencias completo.
  • Evaluación de riesgos: Comprenda la exposición actual a vulnerabilidades y problemas de cumplimiento de licencias.
  • Priorización: Identifique qué aplicaciones y vulnerabilidades requieren atención inmediata.
  • Documentación de línea base: Documente el estado actual como línea base para medir la mejora.

Definición de directivas

Directivas de seguridad:

  • Umbrales de gravedad de vulnerabilidad: defina qué niveles de gravedad son aceptables (por ejemplo, no crítico, alto limitado).
  • Períodos de tiempo de corrección: Establezca acuerdos de nivel de servicio para aplicar revisiones a diferentes gravedades de vulnerabilidad (críticas en un plazo de 7 días, máximos en un plazo de 30 días).
  • Procesos de excepción: Cree flujos de trabajo para aceptar riesgos cuando la corrección inmediata no sea factible.
  • Seguimiento de exenciones: Mantenga la traza de auditoría de los riesgos aceptados con justificaciones comerciales.

Directivas de cumplimiento:

  • Listas de aceptación de licencias: Especifique qué licencias son siempre aceptables (MIT, Apache 2.0, BSD).
  • Listas de denegación de licencia: Prohibir licencias específicas incompatibles con el modelo de negocio (GPL para software propietario).
  • Flujos de trabajo de aprobación: Requerir revisión legal para las dependencias con determinadas licencias (LGPL, MPL, licencias personalizadas).
  • Requisitos de atribución: Defina cómo se deben proporcionar las atribución de licencia en el software distribuido.

Automatización de la aplicación

Integración de tubería:

  • Examen automatizado: Ejecute comprobaciones de SCA automáticamente en cada solicitud de compilación y extracción.
  • Puertas de calidad: configure puertas de canalización que bloqueen compilaciones o implementaciones que infringen directivas.
  • Corrección automatizada: Use herramientas como GitHub Dependabot para crear automáticamente solicitudes de incorporación de cambios para las actualizaciones de seguridad.
  • Informes: Genere informes de cumplimiento para la visibilidad de auditoría y administración.

Mejora continua

Seguimiento de métricas:

  • Tiempo medio para corregir (MTTR): Mida la rapidez con la que se revisan las vulnerabilidades después de la detección.
  • Reducción de vulnerabilidades: Realice un seguimiento de los recuentos de vulnerabilidades decrecientes a lo largo del tiempo.
  • Tasa de cumplimiento: Monitoree el porcentaje de dependencias que cumplen con las políticas de licencias.
  • Cobertura: Asegúrese de que las herramientas de SCA examinan todas las aplicaciones y dependencias.

Refinamiento de procesos:

  • Gestión de falsos positivos: Ajuste las herramientas para reducir los falsos positivos mediante la configuración y las excepciones.
  • Aprendizaje para desarrolladores: Instruir a los desarrolladores en la selección y administración de dependencias seguras.
  • Evolución de la directiva: Actualice las directivas en función de las amenazas emergentes y los requisitos empresariales.
  • Evaluación de herramientas: Evalúe periódicamente las nuevas características y herramientas de SCA.

Análisis de composición de software proporciona las funcionalidades automatizadas esenciales para administrar los riesgos de seguridad y cumplimiento en las aplicaciones modernas que dependen en gran medida de los componentes de código abierto. En la siguiente unidad se explora cómo implementar GitHub Dependabot, una herramienta de SCA específica integrada en GitHub.