Vulnerabilidad critica en Java permite falsificar certificados, firmas, mensajes webauthn y evadir mecanismos de autenticación.

Score Vulnerabilidad CVE

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 atacantes firmar digitalmente archivos y otros datos del mismo modo que lo haría una entidad legítima. Con base en esto, un hacker podría hacer pasar descargas maliciosas como si fuera contenido inofensivo sin que las aplicaciones Java puedan identificar la actividad oculta.

Si esta falla es explotada, toda clase de implementaciones Java estarían comprometidas incluyendo las de comunicaciones cifradas, tokens de autenticación, actualizaciones de código y otras. El fabricante 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.

Sesión JShell mostrando la vulnerabilidad

Lo más relevante relacionado a esta falla es la facilidad con la que puede ser explotada, además de que es un error que puede ser común y el cual Oracle demoró mucho en mitigar. Dicha 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, 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.

RECOMENDACIONES

  • Siempre mantener parchado y/o actualizado las versiones de Java.
  • Contar con software adicional a los Firewall, como los IPS, WAF, balanceadores de cargas y demás protecciones perimetrales para evitar ataques de día zero y explotación de vulnerabilidades.

FUENTES