Skip to main content

Se descubre una vulnerabilidad de hash débil en crypto-js y crypto-es (CVE-2023-46233 y CVE-2023-46133)

Escrito por
feature crypto vuln

25 de octubre de 2023

0 minutos de lectura

El 18 de octubre, el investigador de seguridad Zemnmez inició el proceso de divulgación responsable de una vulnerabilidad de «Uso de hash débil» que encontró en crypto-js, una biblioteca JavaScript de código abierto con estándares criptográficos cuyo mantenimiento se ha discontinuado. La vulnerabilidad también afecta al paquete crypto-es (para ES6 y TypeScript), y el investigador abrió una solicitud similar para pedir a los responsables del mantenimiento que habilitaran las divulgaciones privadas. Tanto el repositorio crypto-js como el de crypto-es habilitaron las funciones de «avisos de seguridad» e «informes privados de vulnerabilidades» que solicitó Zemnmez. Desde entonces, descubrimos que la vulnerabilidad afecta a todas las versiones anteriores de las bibliotecas. No hay indicios de que las vulnerabilidades afecten a las bibliotecas criptográficas principales de Node.js.

Enlaces rápidos

Explicación de las vulnerabilidades de crypto-js y crypto-es

Snyk creó dos avisos sobre la vulnerabilidad:

Se publicaron nuevas versiones de las bibliotecas crypto-es (2.1.0) y crypto-js (4.2.0) para corregir la vulnerabilidad de seguridad que señaló Zemnmez. El commit de crypto-es indica que se modificaron los «parámetros predeterminados para mejorar la seguridad». Aunque también hay una corrección para la biblioteca crypto-js, es importante recordar que, si bien no está marcada como deprecated, normalmente no recibe actualizaciones y deberías considerar otras opciones (más adelante encontrarás más información al respecto).

Los avisos relacionados incluyen descripciones similares del problema:

«Las versiones afectadas de este paquete son vulnerables a “Uso de hash débil” debido a una configuración de seguridad inadecuada en la clase PBKDF2 (Algo), que utiliza SHA1, un algoritmo inseguro, y tiene un recuento de iteraciones bajo, de 1. Esta configuración insegura permite que los atacantes realicen ataques de fuerza bruta cuando se usa PBKDF2 (Algo) con los parámetros predeterminados (el aviso de crypto-js también reitera que la biblioteca ya no recibe mantenimiento)».

Las correcciones cambiaron el valor predeterminado del parámetro iterations de 1 a 250000. El mayor riesgo de esta vulnerabilidad es que los datos cuyo hash se generó con esta funcionalidad (como las contraseñas almacenadas) queden expuestos a ataques de fuerza bruta. En el caso de pbkdf2, los usos habituales serían almacenar contraseñas y firmas (por ejemplo, para verificar archivos). Si pbkdf2 se usa para validar firmas, también podría ser posible (aunque potencialmente costoso) realizar un ataque de texto plano elegido que genere una firma criptográfica idéntica. De este modo, el atacante puede crear una entrada que, en esencia, supere la validación criptográfica.

Cómo prepararse para la corrección

Evalúa tu exposición

Puedes usar Snyk para encontrar rápidamente los proyectos de código abierto y las imágenes de contenedor afectados, incluso antes de que se publicaran las versiones corregidas de crypto-js y crypto-es.

Ve a Dependencies en la barra lateral de la interfaz de la aplicación de Snyk. En la vista Dependencies, expande el filtro Dependencies y escribe «crypto-js». Puedes seleccionar versiones individuales o marcar el acceso directo Select all. Luego, haz clic fuera del filtro para ver los resultados y repite el proceso con «crypto-es». Así verás todos los proyectos que usan las versiones de crypto-es que seleccionaste. Explora los proyectos y las dependencias para evaluar tu exposición y priorizar qué debes corregir primero.

Página de dependencias de Snyk que muestra proyectos que usan crypto-js@3.3.0, con sus fuentes y la cantidad de problemas.
Tengo 33 proyectos que utilizan crypto-js@3.3.0, uno de los cuales es una imagen de Docker

Usa Snyk Advisor para evaluar el estado de tus paquetes

Snyk Advisor puede ayudarte a encontrar el mejor paquete para tu próximo proyecto. Una búsqueda rápida de crypto-js muestra que, si bien la biblioteca criptográfica tiene una comunidad activa, su mantenimiento está inactive y menciona paquetes similares (ten en cuenta que esta captura se tomó antes de la divulgación y asignación de las vulnerabilidades; como el desarrollador publicó una nueva versión, el nivel de mantenimiento ahora se detecta como sustainable).

Página de Snyk Advisor para el paquete de JavaScript crypto-js, que muestra una puntuación de salud de 79/100 y un estado de mantenimiento inactivo.

Sigue las mejoras del proyecto principal o del ecosistema

Los responsables anteriores del mantenimiento de la biblioteca crypto-js, cuyo desarrollo se discontinuó, atribuyen su obsolescencia, en parte, al hecho de que «seguir desarrollando CryptoJS haría que terminara siendo solo una envoltura de Crypto nativo». Seguir de cerca el puntaje de estado de las bibliotecas que usas puede ayudarte a evitar vulnerabilidades de forma proactiva, pero también es importante mantenerte al tanto de las mejoras del ecosistema. Para algunos equipos, el mejor camino en una situación como esta es comprobar si la funcionalidad nativa del ecosistema puede reemplazar las bibliotecas de terceros.

Detectar las vulnerabilidades con Snyk

Hay varias formas de detectar las vulnerabilidades de crypto-js y crypto-es con Snyk. Puedes probar tus proyectos localmente con Snyk CLI, importarlos a Snyk mediante nuestras integraciones de SCM o usar los informes de Snyk para buscar rápidamente crypto-js y crypto-es en todos los proyectos que ya importaste a Snyk.

Prueba tus proyectos con Snyk CLI

Snyk Container y Snyk Open Source pueden alertarte sobre paquetes del sistema operativo o bibliotecas de código abierto que dependan de versiones vulnerables de crypto-js o crypto-es. Para ello, usa snyk container test y snyk test, respectivamente. Snyk puede monitorear tus imágenes de contenedor y proyectos de código abierto para avisarte cuando surjan nuevas vulnerabilidades, como estas de crypto-js o crypto-es. Para esto, regístralos con snyk container monitor (para imágenes de contenedor) o snyk monitor (para el uso de bibliotecas de código abierto).

En el siguiente ejemplo, se usa Snyk CLI para analizar un proyecto de Node.js. En este caso, indica que mi proyecto usa crypto-js versión 4.0.0 y que debería actualizar a la versión 4.2.0.

$ > snyk test

Testing /Users/jamie/Projects/GitRepo/gatsby-demo...

Tested 1367 dependencies for known issues, found 29 issues, 1008 vulnerable paths.

Issues to fix by upgrading:

  Upgrade crypto-js@4.0.0 to crypto-js@4.2.0 to fix
  ✗ Use of Weak Hash (new) [High Severity][https://security.snyk.io/vuln/SNYK-JS-CRYPTOJS-6028119] in crypto-js@4.0.0
    introduced by crypto-js@4.0.0

Prueba tus proyectos con la integración de SCM

Al importar tu proyecto a Snyk mediante las integraciones de SCM compatibles (GitHub, Bitbucket, GitLab y Azure Repos), se ejecuta una prueba automáticamente. Así podrás usar la interfaz de Snyk para identificar, priorizar y corregir las vulnerabilidades de crypto-js y crypto-es en tus proyectos.

Usa Snyk Reporting o Snyk Insights para detectar las vulnerabilidades en tus proyectos

Los clientes de Snyk que tienen acceso a los informes de Snyk (plan Enterprise) y Snyk Insights pueden identificar rápidamente crypto-js o crypto-es en los proyectos que ya importaron y monitorean con Snyk. Ambas variantes de la vulnerabilidad crypto- comparten un CWE. En la página Insights, filtra por ese CWE compartido, CWE-328, como se muestra a continuación.

Panel de Snyk Insights que muestra problemas abiertos filtrados por vulnerabilidades CWE-328 de hashes débiles, con factores de riesgo y proyectos afectados.

Si encuentras el problema, podrás ver exactamente dónde se usa. Luego, puedes hacer clic en el proyecto para obtener más información sobre el problema y consultar instrucciones para corregirlo.

Prioriza las correcciones con la puntuación de riesgo de Snyk

Es probable que encuentres varios problemas relacionados con crypto-js o crypto-es en tus proyectos, lo que puede dificultar decidir por dónde empezar a corregirlos. Snyk ofrece varios mecanismos para ayudarte a priorizar, pero recomendamos usar nuestra puntuación de riesgo.

La puntuación de riesgo de Snyk calcula numerosos factores de riesgo para ayudarte a identificar rápidamente los problemas que debes resolver primero. La puntuación tiene en cuenta varias señales, como EPSS, la madurez de los exploits, CVSS y las tendencias en redes sociales, entre otras. Después, puedes usarla para revisar rápidamente la lista de vulnerabilidades y priorizar las correcciones. En el caso de crypto-js y crypto-es, la puntuación varía según el contexto.

Panel del proyecto de Snyk que muestra una vulnerabilidad de hash débil en crypto-js, con una puntuación de riesgo de 139 y detalles sobre su impacto y probabilidad.

La puntuación se muestra para cada problema de crypto-js y crypto-es en la página Projects y también está disponible en los informes de Snyk.

Cómo corregir las vulnerabilidades de crypto- en proyectos de código abierto o imágenes base de contenedores

Actualiza tu imagen base a una etiqueta más reciente que incluya la corrección de la vulnerabilidad. En los ecosistemas compatibles, puedes iniciar pull requests con las correcciones necesarias directamente desde Snyk.

Por ejemplo, Snyk recomienda imágenes base alternativas para contenedores desde la interfaz o la CLI. Además, cuando importas tu repositorio de código fuente mediante un SCM como GitHub, puedes automatizar la corrección de la imagen del contenedor al crear un pull request que actualice la instrucción FROM del Dockerfile.

Panel de proyectos de Snyk que muestra vulnerabilidades en una imagen de contenedor y recomendaciones para actualizar la imagen base, con un botón para abrir una solicitud de cambios correctiva.

También es posible evitar el impacto de la vulnerabilidad especificando el parámetro iterations al usar PBKDF2, pero es igualmente importante verificar que no estés especificando un valor bajo para iterations:

{ 
    keySize: 256/32, 
    iterations: 1 
}

...ya que esto reproduciría la vulnerabilidad anterior.

Próximos pasos para responder a las vulnerabilidades de crypto-js y crypto-es

  1. Prueba tus proyectos con Snyk mediante los métodos que se describen en este artículo. Para empezar, crea una cuenta gratuita de Snyk y luego importa y analiza todos los proyectos potencialmente afectados con el asistente de importación.

  2. Identifica las correcciones de mayor prioridad para las vulnerabilidades de crypto-js y crypto-es mediante la puntuación de prioridad o Insights (para clientes del plan Snyk Enterprise).

  3. Aplica las correcciones actualizando las dependencias de tus proyectos de código abierto o las imágenes de contenedor a crypto-js 4.2.0 o posterior, y a crypto-es 2.1.0 o posterior.

  4. Sigue atento a medida que evoluciona esta situación y vuelve a consultar el blog de Snyk para conocer las novedades. Los equipos de seguridad de Snyk actualizarán nuestros recursos periódicamente con la información más reciente.

  5. Si usas crypto-js, cuyo mantenimiento ya no está activo, considera migrar a crypto-es o aprovechar las funciones integradas.

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.