
Spring Framework CVE-2022-22965: proyecto de verificación de condiciones de impacto local, reparación mediante actualización de versión y repetición de pruebas
Este proyecto se utiliza para aprender y verificar las condiciones de impacto, el comportamiento de riesgo, el método de corrección y el flujo de reprueba posterior de la vulnerabilidad CVE-2022-22965 de Spring Framework, también conocida como Spring4Shell.
El proyecto se completó en un entorno local autorizado de construcción personal. El enfoque del proyecto no es atacar objetivos reales, sino confirmar una a una las condiciones de impacto relacionadas con la vulnerabilidad mediante la creación de entornos de prueba Spring MVC antes y después de la corrección, y observar de forma segura y controlada, mediante solo lectura, las diferencias en las rutas de propiedades internas del enlace de datos de Spring antes y después de la actualización de versión.
Este proyecto completó los siguientes procesos:
Este proyecto se utiliza únicamente en entornos locales autoconstruidos personales o en entornos de pruebas de seguridad expresamente autorizados.
El proyecto no escanea, sondea ni explota ningún sitio web público, servidor o sistema empresarial de terceros, y no contiene datos reales de usuarios ni datos empresariales reales.
Durante las pruebas no se realizaron las siguientes acciones:
Se prohíbe utilizar los métodos de prueba de este proyecto contra cualquier objetivo no autorizado.
CVE-2022-22965, comúnmente conocida como Spring4Shell, es una vulnerabilidad de ejecución remota de código en Spring Framework relacionada con el mecanismo de enlace de datos de parámetros de solicitud.
Spring MVC admite el enlace automático de los parámetros de solicitud HTTP a las propiedades de objetos Java. Por ejemplo, este proyecto recibe los parámetros de nombre y correo electrónico mediante:
@ModelAttribute("profile") UserProfile profile
En condiciones normales, los parámetros de solicitud name y email se enlazan al objeto UserProfile según el nombre de la propiedad.
En las versiones afectadas, las restricciones de acceso a algunas rutas de propiedades internas no eran lo suficientemente estrictas. Cuando se utiliza JDK 9 o superior y se cumplen condiciones específicas de contenedor Servlet, forma de despliegue y enlace de datos, los parámetros de solicitud externos podrían continuar, a través de objetos de negocio normales, accediendo a objetos internos relacionados con la Class de Java, los módulos, los cargadores de clases o el contenedor.
En entornos explotables específicos, un atacante podría modificar la configuración del servidor o escribir archivos en el servidor, generando así un riesgo de ejecución remota de código.
Este proyecto no ejecuta la explotación remota completa, sino que utiliza la siguiente ruta de propiedades para realizar un diagnóstico diferencial seguro y de solo lectura:
class.module.name
Este proyecto se completó en un entorno experimental aislado de VMware local personal.
127.0.0.1Datos de prueba de funcionalidad normal:
Alice[email protected]Ruta de propiedad de diagnóstico de seguridad:
class.module.name
spring4shell-local-verification-lab/
README.md: introducción del proyecto, enfoque de prueba, resultados de verificación y notas de correccióndocs/: informe de verificación local de condiciones de impacto, corrección y reprueba de Spring4Shellimages/: capturas de pantalla del entorno del proyecto, del proceso de prueba y de la repruebavulnerable-demo/: proyecto previo a la corrección que utiliza Spring Framework 5.3.17fixed-demo/: proyecto posterior a la corrección que utiliza Spring Framework 5.3.18notes/: notas de estudio y registros del procesoEstructura principal del código fuente:
config/: clases de configuración de Spring MVC y clases de inicialización de la aplicacióncontroller/: controlador de procesamiento de formularios y de diagnóstico de rutas de propiedadesmodel/: clase UserProfile utilizada para recibir los parámetros de nombre y correo electrónicoWEB-INF/views/: páginas JSP de inicio, de resultado de envío y de resultado de diagnósticoEste proyecto creó dos aplicaciones Spring MVC, una previa y una posterior a la corrección.
Directorio del proyecto:
vulnerable-demo
Versión utilizada:
Spring Framework 5.3.17
Archivo WAR generado:
spring4shell-vulnerable-demo.war
Dirección de acceso:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/
Página de diagnóstico:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe
Directorio del proyecto:
fixed-demo
Versión utilizada:
Spring Framework 5.3.18
Archivo WAR generado:
spring4shell-fixed-demo.war
Dirección de acceso:
http://127.0.0.1:8080/spring4shell-fixed-demo/
Página de diagnóstico:
http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe
El proyecto de prueba proporciona un formulario simple de perfil de usuario que incluye:
El controlador recibe los parámetros de solicitud mediante:
@ModelAttribute("profile") UserProfile profile
Cuando el usuario envía el nombre y el correo electrónico, Spring MVC enlaza automáticamente los parámetros name y email al objeto UserProfile.
La página de resultados lee el objeto enlazado y muestra el nombre y el correo electrónico enviados por el usuario.
Esta funcionalidad sirve para confirmar que el proyecto puede ejecutarse correctamente y, al mismo tiempo, demuestra que la aplicación cuenta con un punto de entrada válido de enlace de datos de parámetros de solicitud de Spring MVC.
Este proyecto se desarrolla siguiendo el enfoque de: primero confirmar la funcionalidad normal, luego confirmar las condiciones de impacto, después realizar el diagnóstico de riesgo de solo lectura y, finalmente, corregir y volver a probar.
@ModelAttribute para enlazar los parámetros de solicitud al objeto UserProfile.BeanWrapper de Spring para realizar el diagnóstico de solo lectura de class.module.name.Este proyecto confirmó una a una las siguientes condiciones de impacto:
spring-webmvc@ModelAttributeLas dependencias de Spring realmente desplegadas en el proyecto previo a la corrección incluyen:
spring-beans-5.3.17.jarspring-core-5.3.17.jarspring-web-5.3.17.jarspring-webmvc-5.3.17.jarEste proyecto no determina si la vulnerabilidad es válida basándose únicamente en la versión de Spring Framework, sino que realiza un análisis integral combinando JDK, Spring MVC, Tomcat, despliegue WAR y punto de entrada de enlace de datos.
Para evitar ejecutar una explotación de vulnerabilidad destructiva, este proyecto utiliza el BeanWrapper proporcionado por Spring Framework para realizar una verificación de solo lectura de la siguiente ruta de propiedades:
class.module.name
Esta ruta representa:
class: accede al objeto Class de Java correspondiente al objeto de negocio actualmodule: accede al módulo Java al que pertenece la clasename: lee el nombre del móduloEl proceso de diagnóstico solo invoca la comprobación de legibilidad de la propiedad y el método de lectura del valor de la propiedad:
Por lo tanto, este diagnóstico solo puede utilizarse para observar las diferencias de acceso a las rutas de propiedades internas antes y después de la corrección, y no puede demostrar por sí solo que se haya logrado la ejecución remota de código.
El entorno previo a la corrección utiliza:
Spring Framework 5.3.17
Ruta de propiedad comprobada:
class.module.name
Resultado del diagnóstico:
truenulltrue indica que el entorno actual puede continuar resolviendo module.name a través de la propiedad class de los objetos de negocio normales.
El resultado de lectura es null porque la aplicación WAR actual se ejecuta en el módulo sin nombre de Java y el nombre del módulo está vacío; no significa que la lectura de la ruta de propiedad haya fallado.
El entorno posterior a la corrección utiliza:
Spring Framework 5.3.18
Se vuelve a diagnosticar con la misma ruta de propiedades:
class.module.name
Resultado del diagnóstico:
falseNot readableLos resultados antes y después de la corrección forman un contraste claro:
Este resultado indica que, tras la actualización de versión, el acceso a la ruta de propiedades de diagnóstico original quedó restringido y la manifestación de riesgo observada antes de la corrección ya no aparece.
Este proyecto adopta la actualización de la versión de Spring Framework como método de corrección.
Configuración antes de la corrección:
<spring.version>5.3.17</spring.version>
Configuración después de la corrección:
<spring.version>5.3.18</spring.version>
Durante el proceso de corrección se completaron las siguientes acciones:
fixed-demo.Las dependencias de Spring realmente desplegadas en el proyecto posterior a la corrección incluyen:
spring-beans-5.3.18.jarspring-core-5.3.18.jarspring-web-5.3.18.jarspring-webmvc-5.3.18.jarEste resultado demuestra que la versión corregida fue reconstruida y desplegada realmente, y no solo se modificó el número de versión en pom.xml.
Después de actualizar a Spring Framework 5.3.18, se vuelve a acceder a la página de inicio del proyecto corregido y se envían los siguientes datos de prueba:
Alice[email protected]Después del envío, la página sigue mostrando correctamente:
Alice[email protected]Este resultado indica que la actualización de versión no afectó el enlace normal de parámetros de solicitud ni la función de visualización de páginas del proyecto.
El mecanismo de enlace automático de datos de Spring MVC puede acceder a las propiedades de objetos Java según los nombres de los parámetros de solicitud HTTP.
Los parámetros de negocio normales name y email solo necesitan acceder a las propiedades ordinarias correspondientes en UserProfile.
Sin embargo, el mecanismo de acceso a propiedades de Spring también admite rutas de propiedades anidadas con puntos. En las versiones afectadas, las restricciones sobre algunas rutas de propiedades internas no eran lo suficientemente estrictas, lo que permitía que, en entornos específicos, los parámetros externos continuaran desde los objetos de negocio normales hacia objetos relacionados con la Class de Java, los módulos, los cargadores de clases o el contenedor Servlet.
Cuando existen en los objetos internos propiedades escribibles capaces de afectar la configuración del servidor o el sistema de archivos, y la aplicación cumple simultáneamente condiciones como JDK, Tomcat, despliegue WAR y enlace de datos, puede generarse un riesgo de ejecución remota de código.
Esta vulnerabilidad no se debe a que las propiedades name o email tengan un problema en sí mismas, ni todos los proyectos que utilizan Spring MVC son necesariamente explotables. Para que la vulnerabilidad se materialice, normalmente deben coexistir múltiples condiciones.
En los sistemas empresariales reales se recomienda adoptar las siguientes medidas:













Este proyecto completó, en un entorno local aislado, la confirmación de las condiciones de impacto, el diagnóstico de las manifestaciones de riesgo, la corrección mediante actualización de versión y la reprueba posterior de la vulnerabilidad CVE-2022-22965 de Spring Framework.
El proyecto previo a la corrección utiliza Spring Framework 5.3.17. En el entorno con JDK 11, Spring MVC, Apache Tomcat 9.0.60 y despliegue WAR tradicional, la ruta de propiedades class.module.name se determinó como legible.
El proyecto posterior a la corrección actualiza Spring Framework a 5.3.18. La misma ruta de propiedades pasó a no ser legible y, al mismo tiempo, la funcionalidad normal de enlace de datos de nombre y correo electrónico sigue estando disponible.
Este proyecto no ejecutó la explotación remota completa, sino que completó la verificación de diferencias antes y después de la corrección mediante métodos de solo lectura seguros y controlados.
El proyecto pone de relieve las siguientes capacidades: