Una vulnerabilidad crítica de día cero en Spring Framework, utilizado en muchos proyectos de Java

En el módulo Spring Core, proporcionado como parte del marco Spring Framework, se ha identificado una vulnerabilidad crítica de día cero que permite a un atacante remoto no autenticado ejecutar su código en el servidor. Aún no está claro cuán catastróficas pueden ser las consecuencias del problema identificado y si los ataques serán tan masivos como en el caso de la vulnerabilidad de Log4j 2. La vulnerabilidad ha sido apodada Spring4Shell, pero aún no se ha asignado un identificador CVE. En el Spring Framework, el problema permanece sin solución y ya hay varios prototipos de exploits funcionales disponibles en la red (1, 2, 3, 4). El problema se agrava debido a que muchas aplicaciones empresariales de Java basadas en Spring Framework se ejecutan con privilegios de root y la vulnerabilidad permite comprometer completamente el sistema.

Según algunas estimaciones, el módulo Spring Core se utiliza en el 74% de las aplicaciones Java. La peligrosidad de la vulnerabilidad se reduce por el hecho de que solo están expuestas a ataques las aplicaciones que utilizan la anotación «@RequestMapping» al conectar los controladores de solicitudes y la vinculación de parámetros de formularios web en el formato «name=value» (POJO, Plain Old Java Object), en lugar de utilizar JSON/XML.

No está claro qué aplicaciones y marcos de Java están afectados por el problema. La vulnerabilidad bloquea la adición a la lista negra de los campos «class», «module» y «classLoader» o el uso de una lista blanca explícita de campos permitidos. La explotación de la vulnerabilidad es posible solo al utilizar Java/JDK 9 o una versión más reciente. El problema es causado por la posibilidad de eludir la protección contra la vulnerabilidad CVE-2010-1622, que fue corregida en el Spring Framework en 2010 y está relacionada con la ejecución del controlador classLoader al procesar los parámetros de la solicitud.

El funcionamiento del exploit consiste en enviar una solicitud con los parámetros «class.module.classLoader.resources.context.parent.pipeline.first.*», cuya procesamiento resulta en la creación de un archivo jsp en el entorno raíz de Apache Tomcat y la escritura del código indicado por el atacante en este archivo. El archivo creado se vuelve accesible para solicitudes directas y puede ser utilizado como un web shell. Para atacar una aplicación vulnerable en el entorno de Apache Tomcat, solo es necesario enviar una solicitud con parámetros específicos utilizando la herramienta curl. curl -v -d «class.module.classLoader.resources.context.parent.pipeline.first.pattern=código_a_inserta_en_el_archivo &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=» http://localhost:8080/springmvc5-helloworld-exmaple-0.0.1-SNAPSHOT/rapid7

El problema en cuestión en Spring Core no debe confundirse con las vulnerabilidades detectadas recientemente, CVE-2022-22963 y CVE-2022-22950. El primer problema afecta al paquete Spring Cloud y ha sido solucionado en las versiones 3.1.7 y 3.2.3. El segundo problema está presente en Spring Expression y se corrigió en Spring Framework 5.3.17. Se trata de vulnerabilidades fundamentalmente diferentes. Los desarrolladores de Spring Framework aún no han hecho declaraciones sobre la nueva vulnerabilidad ni han publicado correcciones.

Como medida temporal de protección, se recomienda utilizar en el código una lista negra de parámetros de consulta no permitidos: import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; @ControllerAdvice @Order(10000) public class BinderControllerAdvice { @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { String[] denylist = new String[]{«class.», «Class.», «.class.», «.Class.»}; dataBinder.setDisallowedFields(denylist); } }

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster