Vulnerabilidad crítica en Java permite falsificar certificados, firmas, mensajes WebAuthn y evadir mecanismos de autenticación: Actualice de inmediato

Algunas versiones de Java se ven afectadas por una vulnerabilidad en la validación de firma Elliptic Curve Digital Signature Algorithm (ECDSA) que permitiría a los actores de amenazas firmar digitalmente archivos y otros datos del mismo modo que lo haría una entidad legítima. Un hacker podría hacer pasar descargas maliciosas como si fuera contenido benigno sin que las aplicaciones Java puedan identificar la actividad oculta.

Toda clase de implementaciones Java podrían verse comprometidas si esta falla es explotada, incluyendo campos como las comunicaciones cifradas, tokens de autenticación, actualizaciones de código y otros. Oracle corrigió el error, identificado como CVE-2022-21449, en su código en su parche de seguridad trimestral.

Si bien al inicio Oracle había asignado a esta falla un puntaje de gravedad de 7.5/10, especialistas en ciberseguridad analizaron el reporte y concluyeron que la falla ameritaba una puntuación crítica de 10/10. Al respecto, el investigador Thomas Ptacek considera este reporte como el “error criptográfico del año”, dadas sus condiciones de explotación y problemas derivados del ataque.

Lo más sorprendente sobre esta falla es la facilidad con la que puede ser explotada, además de que es un error que resulta muy obvio y que Oracle demoró mucho en abordar. Según reportes, esta vulnerabilidad surgió cuando parte del código de verificación de formas en Java 15 se reescribió de C++ a Java, incluyendo el código de verificación ECDSA.

Las firmas ECDSA se componen de un par de números, denominados r y s. Para verificar una firma, el código realiza algunos cálculos que involucran un hash de los datos, la clave pública de cualquier organización o persona que haya usado su firma digital y los números r y s; un lado de la ecuación usa r, el otro r y s.

Ambos lados de este cálculo deben ser iguales para que la firma sea verificada adecuadamente; eso implica que los datos fueron firmados digitalmente por la clave privada del firmante. Si la verificación de la firma falla, eso probablemente significa que quien firmó los datos no es quien dice ser, por lo que los datos no deberían ser verificados.

En teoría, para que una firma sea válida, el valor de r y s no puede ser 0, 0, ya que en el proceso se multiplican estos números con otros valores. El error surgió porque, si bien el código C++ original verificaba que tanto r como s no fueran cero, el nuevo código Java no verificó esta condición. Como seguramente sabrá, cualquier cantidad multiplicada por cero es igual a cero. Cuando s tiene que dividir un valor entre 0, se desencadena la falla de verificación.

La falla ya ha sido abordada, por lo que se recomienda actualizar a la brevedad.

Para conocer más sobre riesgos de seguridad informática, malware, vulnerabilidades y tecnologías de la información, no dude en ingresar al sitio web del Instituto Internacional de Seguridad Cibernética (IICS).