20 abr 2022

Firmas digitales "vacías" en Java (Parchea CVE-2022-21449!)

Es difícil exagerar la gravedad de este error. La vulnerabilidad identificada como CVE-2022-21449 es un problema de implementación del algoritmo de curva elíptica ECDSA en Java desde su versión 15+ en adelante e inutiliza la verificación criptográfica de firmas digitales.

Si se utiliza Java 15 a Java 18 (y parece que la 7 y 8 también), debe detener lo que está haciendo y actualizar inmediatamente para instalar las correcciones en la actualización de parche crítico de abril de 2022.

Las versiones recientes de Java eran vulnerables en la implementación de firmas ECDSA ampliamente utilizadas. Si está ejecutando una de las versiones vulnerables, un atacante puede falsificar fácilmente algunos tipos de certificados SSL y protocolos de enlace (lo que permite la interceptación y modificación de las comunicaciones), signed JWTs, SAML assertions, OIDC ID tokens, y WebAuthn.

Casi todos los dispositivos WebAuthn/FIDO en el mundo real (incluidos Yubikeys) usan firmas ECDSA y muchos proveedores de OIDC usan JWT firmados por ECDSA. Si se está utilizando firmas ECDSA para cualquiera de estos mecanismos de seguridad, un atacante puede omitirlos de forma trivial y completa si el servidor ejecuta cualquier versión de Java 15, 16, 17 o 18 antes de la actualización de parche crítico (CPU) de Oracle de abril de 2022

El anuncio oficial de Oracle también enumera las versiones anteriores de Java, incluidas la 7 y la 8 y, como corrigieron un error similar en la implementación DSA (no EC) al mismo tiempo, es posible que las versiones anteriores también se vean afectadas. También hay otras vulnerabilidades de seguridad informadas en la misma CPU, por lo que (como siempre) vale la pena actualizar incluso si está ejecutando una versión anterior de Java.

Oracle le ha dado a esto una puntuación CVSS de 7.5, porque dicen que no afecta la Confidencialidad o la Disponibilidad. En cambio, muchos califican esto con un 10 perfecto debido a la amplia gama de impactos en diferentes funcionalidades en un contexto de administración de acceso.

Antecedentes: firmas ECDSA

ECDSA son las siglas de Elliptic Curve Digital Signature Algorithm, y es un estándar ampliamente utilizado para firmar todo tipo de documentos digitales. En comparación con el antiguo estándar RSA, las firmas y las claves de curva elíptica tienden a ser mucho más pequeñas para una seguridad equivalente, lo que hace que se utilicen ampliamente en los casos en que el tamaño es escaso.

Por ejemplo, el estándar WebAuthn para la autenticación de dos factores permite a los fabricantes de dispositivos elegir entre una amplia gama de algoritmos de firma, pero en la práctica, casi todos los dispositivos fabricados hasta la fecha solo admiten firmas ECDSA (una excepción notable es Windows Hello, que utiliza firmas RSA; presumiblemente por compatibilidad con hardware TPM más antiguo).

Sin entrar demasiado en los detalles técnicos, una firma ECDSA consta de dos valores, llamados r y s. Para verificar una firma ECDSA, el receptor verifica una ecuación que involucra a r, s, la clave pública del firmante y un hash del mensaje. Si los dos lados de la ecuación son iguales, la firma es válida; de lo contrario, se rechaza.

Un lado de la ecuación es r y el otro lado se multiplica por r y un valor derivado de s. Entonces, obviamente sería algo realmente malo si r y s fueran ambos 0, porque entonces estarías comprobando que 0 = 0 x [cualquier_cosa], lo cual será TRUE, independientemente del valor de [cualquier_cosa]

Esta es la razón por la cual la primera verificación en el algoritmo de verificación ECDSA es garantizar que r y s sean ambos >=1. La implementación de Java de la verificación de firma ECDSA no verificaba si r o s eran mayores que cero, por lo que podía producir un valor de firma en el que ambos son 0 y Java lo aceptaría como una firma válida para cualquier mensaje y para cualquier público llave. El equivalente digital de una tarjeta de identificación en blanco.

Aquí hay una sesión jShell interactiva que muestra la implementación vulnerable que acepta una firma completamente en blanco como válida para un mensaje arbitrario y una clave pública:

¿Por qué se acaba de encontrar esto ahora?

Java ha tenido soporte ECDSA durante mucho tiempo. ¿Siempre ha sido vulnerable? No. Este es un error relativamente reciente introducido por una reescritura del código EC del código C++ nativo a Java, que ocurrió en el lanzamiento de Java 15. 

La implementación anterior original de C++ no es vulnerable a estos errores, pero la reescritura sí lo era. Algunos sugieren que este reescritura podría tener otros errores no están esperando ser descubiertos.

¿Qué debemos hacer al respecto?

En primer lugar, si está utilizando Java 15 o posterior, vaya y actualice a la última versión para solucionar este problema.

Fuente: Neil Madden

Suscríbete a nuestro Boletín

0 Comments:

Publicar un comentario

Gracias por dejar un comentario en Segu-Info.

Gracias por comentar!