Se descubre una vulnerabilidad de hash débil en crypto-js y crypto-es (CVE-2023-46233 y CVE-2023-46133)
25 de octubre de 2023
0 minutos de lecturaEl 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:
SNYK-JS-CRYPTOJS-6028119 para
crypto-js(CVE-2023-46233)SNYK-JS-CRYPTOES-6032390 para
crypto-es(CVE-2023-46133)
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 usaPBKDF2 (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.

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).

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.
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.

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.

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.

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:
...ya que esto reproduciría la vulnerabilidad anterior.
Próximos pasos para responder a las vulnerabilidades de crypto-js y crypto-es
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.
Identifica las correcciones de mayor prioridad para las vulnerabilidades de
crypto-jsycrypto-esmediante la puntuación de prioridad o Insights (para clientes del plan Snyk Enterprise).Aplica las correcciones actualizando las dependencias de tus proyectos de código abierto o las imágenes de contenedor a
crypto-js4.2.0 o posterior, y acrypto-es2.1.0 o posterior.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.
Si usas
crypto-js, cuyo mantenimiento ya no está activo, considera migrar acrypto-eso 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.
