
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.