No hay dos sin tres: solución para CVE-2022-22963 y Spring4Shell (CVE-2022-22965)
Resumen
Existen dos vulnerabilidades de ejecución remota de código (RCE) que se están confundiendo: una es CVE-2022-22963, que afecta a Spring Cloud, mientras que la otra es CVE-2022-22965 y afecta a Spring Framework.
Ambos fallos abren la puerta a un código de aprovechamiento que está activo y disponible por internet.
Los clientes de Fastly pueden protegerse ante esta vulnerabilidad.
Hay revisiones disponibles tanto para CVE-2022-22963 como para CVE-2022-22965.
Las herramientas de Spring son marcos de trabajo que permiten acelerar el desarrollo de aplicaciones de Java, por lo que son muy populares entre sus desarrolladores. Los errores que veremos en este artículo incumben a los paquetes Spring Cloud y Spring Framework. Pese a lo que se ha comentado esta semana, estos errores son distintos y diferenciados el uno del otro, aunque tienen en común que ambos permiten ejecutar código arbitrario en un host remoto que distribuya aplicaciones web, si se ejecutan versiones vulnerables del software. Es evidente que tal nivel de control de una infraestructura que podría estar en contacto con el público puede tener graves consecuencias.
Consecuencias
CVE-2022-22963:
Esta vulnerabilidad es muy fácil de aprovechar y permite a un atacante pasar código arbitrario a Spring Expression Language (SpEL) a través de un encabezado HTTP llamado spring.cloud.function.routing-expression
, ya que ese parámetro no se valida con la función Cloud. El impacto de esta vulnerabilidad es bastante alto al ser fácil de aprovechar, pero bastante bajo si tenemos en cuenta la disponibilidad, y es que solo afecta a los servicios que ejecutan la función Spring Cloud en su versión 3.1.6 y anteriores (para 3.1.x), y 3.2.2 y anteriores (para 3.2.x).
CVE-2022-22965:
La vulnerabilidad afecta a las aplicaciones Spring MVC y Spring WebFlux que utilizan JDK 9 o superior. Para aprovecharse de ella, es necesario que la aplicación se ejecute en Tomcat como despliegue de WAR. Si la aplicación se despliega como un archivo JAR ejecutable de Spring Boot (la opción predeterminada), no presentará esta vulnerabilidad. Sin embargo, la naturaleza de la vulnerabilidad es más general, y puede haber otras formas de aprovecharla.
Interés
CVE-2022-22963 es una vulnerabilidad de lenguaje de expresión que genera condiciones idóneas para la ejecución de código remoto (RCE). Ha habido otras vulnerabilidades conocidas, como CVE-2017-8046, que se aprovechan de condiciones parecidas para la RCE. Vale la pena observar, para los que lo utilizan, que se trata de un nuevo error del mismo tipo en el mismo marco de trabajo y con la misma capacidad de ejecución.
CVE-2022-22965 también es una vulnerabilidad de RCE en el marco de trabajo Spring Framework. Una de sus pruebas de concepto se filtró antes de la publicación de la CVE y está relacionada con una vulnerabilidad del mismo código de hace 12 años (CVE-2010-1622).
Limitaciones
CVE-2022-22963:
Afecta a Spring Cloud Function en sus versiones 3.1.6 y anteriores (en el caso de 3.1.x) y 3.2.2 y anteriores (en el caso de 3.2.x) y es sumamente fácil de aprovechar: basta con modificar el encabezado de una petición. No obstante, parece que el número de servicios que utilizan Spring Cloud Function es muy bajo comparado con los del propio Spring Framework, lo que debería limitar drásticamente los efectos.
CVE-2022-22965:
Para aprovechar las vulnerabilidades, se deben cumplir los siguientes requisitos:
JDK 9 o superior;
Apache Tomcat como contenedor Servlet;
empaquetado como un archivo WAR tradicional (no como un JAR ejecutable de Spring Boot);
dependencia de
spring-webmvc
ospring-webflux
;versiones de Spring Framework: de 5.3.0 a 5.3.17 o de 5.2.0 a 5.2.19, y anteriores.
Por mucho que se cumplan estas condiciones, eso no asegura que se vaya a producir la ejecución de código remoto.
Análisis en profundidad
CVE-2022-22963:
Al investigar CVE-2022-22963, quedó claro que la vulnerabilidad se aprovechaba mediante un simple encabezado y, por ello, se ha compartido públicamente en muchos sitios. A continuación tienes un ejemplo de una petición POST de esta vulnerabilidad en concreto:
POST /functionRouter HTTP/1.1
host:127.0.0.1:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15
Connection: close
spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("touch /tmp/pwned")
Content-Length: 1
.
Esta CVE se aprovecha sin más de la posibilidad de acceder a funciones disponibles en Spring Cloud manipulando la funcionalidad Event Routing. Un atacante puede acceder a funciones que no deberían estar disponibles al incluir spring.cloud.function.routing-expression como encabezado HTTP con un conjunto concreto de cadenas. Así, se puede acceder a funciones como getRunTime().exec() y getByName().
CVE-2022-22965:
En este error, las propiedades de Java relacionadas con la carga de clases se filtran incorrectamente y permiten a un atacante indicar una ubicación y un nombre de plantilla con los que cargar una clase, como se puede observar en pruebas de concepto que se han compartido públicamente. En concreto, las siguientes propiedades se envían en un POST HTTP para construir el nombre del archivo en el sistema de archivos local:
class.module.classLoader.resources.context.parent.pipeline.first.directory
class.module.classLoader.resources.context.parent.pipeline.first.prefix
class.module.classLoader.resources.context.parent.pipeline.first.suffix
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat
A continuación, se utiliza la propiedad class.module.classLoader.resources.context.parent.pipeline.first.pattern
para especificar qué nombre de plantilla se puede pasar en el siguiente paso para especificar, a su vez, el objeto que se escribirá en el archivo y se ejecutará.
El siguiente paso del ataque consiste en que el atacante envíe el nombre de la plantilla como un encabezado HTTP que luego incluye el código de Java que se va a ejecutar.
En la prueba de concepto filtrada que consiguió nuestro equipo, se utilizó el siguiente código para lanzar un shell:
Runtime.getRuntime().exec(request.getParameter("cmd"))
Al parecer, para que el aprovechamiento se ejecute correctamente, las propiedades se deben enviar mediante la petición POST, aunque otros investigadores han revelado un método de probar la vulnerabilidad a través de un comando GET que también incluye propiedades classLoader.
Al ser necesaria la manipulación de las propiedades classLoader para probar o aprovechar la vulnerabilidad, las potenciales víctimas solo tienen que buscar una cadena para realizar análisis forenses del ataque. Los valores concretos asignados a las propiedades pueden arrojar más información sobre dónde buscar sistemas de archivos o qué comandos se intentaron ejecutar.
Respuesta
Con todos los errores, lo que se recomienda es eliminar o corregir la raíz del problema con la aplicación de las revisiones disponibles. CVE-2022-22965 circulaba sin control hasta hace poco, pero a la hora de escribir estas líneas ya hay revisiones disponibles para ambos errores.
CVE-2022-22963:
Encontrarás información sobre las revisiones disponibles aquí.
Los usuarios de las versiones afectadas deben actualizar a las versiones 3.1.7 o 3.2.3. No es necesario tomar ninguna otra medida. Las versiones que incluyen una solución al problema son, entre otras:
Función Spring Cloud
3.1.7
3.2.3
CVE-2022-22965:
Encontrarás información sobre las revisiones disponibles aquí.
Se han publicado las versiones 5.3.18 y 5.2.20 de Spring Framework, que contienen las correcciones.
Se han publicado las versiones 2.6.6 y 2.5.12 de Spring Boot, que dependen de la versión 5.3.18 de Spring Framework.
Para esta CVE, además de aportar la revisión, Spring ha incluido información adicional sobre cómo limitar el impacto para los usuarios que no puedan aplicar la revisión.
Se aconseja añadir el parámetro recomendado disallowedFields
en WebDataBinder
a través de un @ControllerAdvice
:
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
Esto suele funcionar, pero al tratarse de una solución alternativa central, pueden quedar lagunas de seguridad. Recomendamos seguir las instrucciones completas del blog de Spring.
Además, los clientes de Fastly pueden implementar mitigaciones para estas vulnerabilidades a través de nuestros productos de WAF.
CVE-2022-22963:
El WAF de última generación de Fastly (con tecnología de Signal Sciences) es capaz de detectar esta vulnerabilidad. Si eres cliente y cuentas con este producto, puedes seguir los pasos indicados a continuación para habilitar una regla de plantilla que te proteja frente al aprovechamiento de CVE-2022-22963.
Navega hasta las reglas de plantilla y localiza la CVE-2022-22963.
Haz clic en configurar y habilita Block requests from an IP immediately if the CVE-2022-22963 signal is observed.
En el caso del WAF de Fastly, podemos desplegar mitigaciones de esta amenaza basadas en VCL para nuestros clientes del WAF antiguo. Si necesitas ayuda para aplicar esta configuración, ponte en contacto con nuestro CSOC: securitysupport@fastly.com.
CVE-2022-22965:
El WAF de última generación de Fastly (con tecnología de Signal Sciences) es capaz de detectar esta vulnerabilidad. Si eres cliente y cuentas con este producto, puedes seguir los pasos indicados a continuación para habilitar una regla de plantilla que te proteja frente al aprovechamiento de CVE-CVE-CVE-2022-22965.
Navega hasta las reglas de plantilla y localiza la CVE-2022-22965.
Haz clic en configurar y habilita Block requests from an IP immediately if the CVE-2022-22965 signal is observed.
En el caso del WAF de Fastly, podemos desplegar mitigaciones de esta amenaza basadas en VCL para nuestros clientes del WAF antiguo. Si necesitas ayuda para aplicar esta configuración, ponte en contacto con nuestro CSOC: securitysupport@fastly.com.